在WindowsForms我刚刚添加了事件处理程序,如下所示:
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
Debug.WriteLine($"=> Form1_MouseDown, Clicks: {e.Clicks}, Location: {e.Location}");
}
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
Debug.WriteLine($"=> Form1_MouseUp, Clicks: {e.Clicks}, Location: {e.Location}");
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
Debug.WriteLine($"=> Form1_MouseMove, Clicks: {e.Clicks}, Location: {e.Location}");
}
Run Code Online (Sandbox Code Playgroud)
输出为:
=> Form1_MouseMove, Clicks: 0, Location: {X=17,Y=21}
=> Form1_MouseDown, Clicks: 1, Location: {X=17,Y=21}
=> Form1_MouseUp, Clicks: 1, Location: {X=17,Y=21}
=> Form1_MouseMove, Clicks: 0, Location: {X=17,Y=21}
Run Code Online (Sandbox Code Playgroud)
您可以看到所有事件都发生在同一位置,所以我的问题是为什么一个MouseMove事件接一个事件MouseUp发生?
我也尝试过类似的代码在WPF和MouseMove事件不发生。 …
完全披露:我正在研究我的libui GUI框架的文本API.这包括Windows上的DirectWrite,OS X上的Core Text和其他Unix上的Pango(它使用HarfBuzz进行OpenType整形).我想要指定的文本格式化属性之一是要使用的OpenType功能的集合,这三者都提供了这些功能.DirectWrite是IDWriteTypography.
现在,当您使用这些库绘制一些文本时,默认情况下您将启用一些有用的OpenType功能,例如标准连字(liga),如f + i连字.我认为这是特定于字体的,但事实证明这是特定于正在形成的文本的脚本.Microsoft为OpenType支持的所有脚本提供了指南(在"特定于脚本的开发"下),我可以看到相当复杂的逻辑,可以在HarfBuzz中完成所有这些以确认它.
在Core Text和Pango上,如果我启用其他属性,它们将被添加到这些默认值之上.但是使用DirectWrite,IDWriteTextLayout::SetTypography()这样做会删除默认值:

可以在此处找到生成此输出的程序.
显然我的第一个选择是询问如何获取DirectWrite的默认功能.但是,有人已经在这个网站上这样做了,答案似乎是"不".
我猜测DirectWrite允许我完全控制要应用于某些文本的功能列表.这很好,除了我不能用其他API做到这一点,除非我以某种方式明确禁用默认功能!当然,我不知道这个列表是否会改变,所以硬编码可能不是最好的主意.
即使硬编码是一种选择,我也可以为每个脚本获取HarfBuzz的列表,但是a)它相当复杂 b)脚本有多种可能的整形器,这取决于(我认为)版本兼容性(例如,缅甸).
那么为什么不使用HarfBuzz的列表来重新创建DirectWrite的默认功能列表呢?它似乎想要对其他塑造者准确,所以这应该工作,对吧?好吧,我需要做两件事:找出要使用的脚本,并找出哪些属性用于脚本中字符的位置重要的脚本.
DirectWrite提供了一个接口IDWriteTextAnalyzer,提供执行整形的工具.我可以使用它,但似乎脚本数据在DWRITE_SCRIPT_ANALYSIS结构中返回,并且脚本ID的描述显示"写入系统脚本的从零开始的索引表示.".
这没有用,所以我编写了一个程序来转储我输入的文本的脚本编号.在输入字符串上运行它
????????????????????????? abcd ???? ??? ??????? ????????? ???????? ?????
Run Code Online (Sandbox Code Playgroud)
产生输出
0 - 26 script 3 shapes 0
26 - 5 script 49 shapes 0
31 - 14 script 3 shapes 0
45 - 2 script 1 shapes 1
47 - 25 script 22 …Run Code Online (Sandbox Code Playgroud) 我正在使用TextFormatter制作WPF文本编辑器.我需要在每个段落中缩进第二行.
第二行中的缩进宽度应该类似于第一行上第一个单词的宽度,包括第一个单词后面的空格.像这样的东西:
Indent of second line in Indentation Inde
second line in Indentation Indenta
of second line in Indentation of second l
ine in Indentation of second line in Inde
ntation of second line in
Run Code Online (Sandbox Code Playgroud)
第二件事:段落的最后一行应该在中心.
如何实现这一目标?
提前致谢!!
我正在使用Glyphs元素制作WPF文本编辑器.我有一个问题是文本没有正确绘制,如图所示,我该如何解决这个问题?
有两个问题:
我通过GetKerningPairs功能解决了第一个问题.
我该如何解决这个问题,也许我错了?
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="200" Width="525">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="AUTO"/>
<RowDefinition Height="AUTO"/>
</Grid.RowDefinitions>
<TextBlock Text="TextBlock" VerticalAlignment="Center" Margin="6"/>
<TextBlock Grid.Row="1" Text="Glyphs" VerticalAlignment="Center" Margin="6"/>
<TextBlock Text="???????????" Grid.Column="1" FontSize="50" FontFamily="Times New Roman"
FontWeight="Normal" Grid.Row="0"/>
<Glyphs Grid.Row="1" Grid.Column="1"
FontUri = "C:\WINDOWS\Fonts\TIMES.TTF"
FontRenderingEmSize = "50"
UnicodeString = "???????????"
BidiLevel="1"
Fill = "Black"/>
<TextBlock Text="AVAV" Grid.Column="2" FontSize="50" FontFamily="Times New Roman"
FontWeight="Normal" Grid.Row="0"/>
<Glyphs Grid.Row="1" Grid.Column="2"
FontUri = …Run Code Online (Sandbox Code Playgroud) 我使用AForge.Net在位图中查找blob,我的位图如下:
我的问题是AForge.Net只检测到一个blob,实际上细线上有两个连接的blob.
我的问题是有一个算法可以确定它们之间有两个连接很薄的大blob?我如何在C#或VB中实现此算法?
样品图片:
我正在使用WPF文本编辑器TextFormatter.我需要证明每个段落的最后一行.
像这样的东西:
I need to justify the last line in each
paragraph I need to justify the last li
ne in each paragraph I need to justify
the last line in each paragraph I need
to justify the last line in
Run Code Online (Sandbox Code Playgroud)
如何实现这一目标?
提前致谢!!
我有一个像这样的 Talmud 页面:
我想找到文本区域opencv以获得这样的结果,每个文本都将像这样自己:
在附图中,每个区域用不同的颜色标记,并且文本有一个数字,重要的是识别属于每个文本的区域,并将其与属于另一个文本的区域区分开来,数字顺序无关紧要.
根据文本之间的白色条纹,用眼睛做这件事真的很容易,但我试图用眼睛做,但我opencv做不到。
在下面的代码中,我尝试捕捉所有字母并将它们变成黑色矩形,然后放大每个矩形以与相邻的矩形相遇,因此整个文本区域将是黑色的,并且文本之间将有一个清晰的白色条纹。
我不知道如何进行,以及它是否是一个好方法。
public List<Rectangle> getRects(Mat grayImg)
{
BlobCounter blobCounter = new BlobCounter();
blobCounter.ObjectsOrder = ObjectsOrder.None;
blobCounter.ProcessImage(grayImg);
IEnumerable<Blob> blobs = blobCounter.GetObjectsInformation();
var blackBlobs = grayImg.Clone;
foreach (var b in blobs)
blackBlobs.Rectangle(b.Rectangle.ToCvRect, Scalar.Black, -1);
var widths = blobs.Select(X => X.Rectangle.Width).ToList;
widths.Sort();
var median = widths(widths.Count / (double)2);
Mat erodet = new Mat();
Cv2.Erode(grayImg, erodet, null, iterations: median);
using (Window win = new Window())
{
win.ShowImage(erodet);
win.WaitKey();
}
}
Run Code Online (Sandbox Code Playgroud)
提前致谢,任何帮助将不胜感激。
补充说明:
正如您在上图中所看到的,文本区域不是矩形,但这些区域可以描述为一堆不同大小的矩形的集合,一个叠一个。
请注意,当两个矩形属于同一个文本时,不要将一个矩形与另一个矩形相邻排列,而只能将一个矩形放在另一个矩形之上。 …
ocr opencv image-processing computer-vision image-segmentation
我有一个这样的 3 个数组:
var blues = new int[] {10, 100, 200};
var reds = new int[] {50, 105, 150};
var greens = new int[] {80, 110, 250};
Run Code Online (Sandbox Code Playgroud)
每个数字表示水平线上的一个点。
如果我将所有内容都放在一个数组中,它将如下所示:
{ 10, 50, 80, 100, 105, 110, 150, 200, 250}
b r g b r g r b g
| group 1 |
Run Code Online (Sandbox Code Playgroud)
我需要找到组,其中每组有三种颜色[蓝色和红色和绿色],而组中的项目之间的距离之间不大于20blue和red,而不是在大于25red和green。
这种算法有已知的名称吗?如果是这样,那是什么?
在 C# 中实现此算法的最佳方法是什么?
该算法需要考虑以下几点:
可以在 1 到 1000 种颜色之间
颜色是有顺序的,每种颜色必须按照指定的最大距离与前面的颜色足够接近
到前一个颜色的距离可以是正数或负数,除非明确说明距离必须是正数
每种颜色都有自己独特的最大距离,可以远离它前面的颜色
每种颜色的点数在 1 到 100 万之间,并且每种颜色可以不同。
每个组都必须包含所有颜色 …
在Google文档中,您可以打开大纲窗格并查看文档中的所有标题,也可以单击标题,然后视图将滚动到标题。
我的问题是如何在Chrome扩展程序中使用JS编程模拟鼠标单击,以将视图滚动到所需的标题?
我尝试了以下代码,但没有遇到任何意外:
// usage: eventFire(document.getElementById('mytest1'), 'click');
function eventFire(el, etype) {
if (el.fireEvent) {
el.fireEvent('on' + etype);
} else {
var evObj = document.createEvent('Events');
evObj.initEvent(etype, true, false);
el.dispatchEvent(evObj);
}
}
Run Code Online (Sandbox Code Playgroud)
标头是带有的div元素class="navigation-item-content navigation-item-level-2",当我查看chrome开发工具>事件监听器时,这些元素没有任何事件监听器。
取决于在这个问题上问什么问题Can the DebuggerDisplay attribute be applied to types one don't own,可以将该DebuggerDisplay特性应用于来自外部程序集的类型吗?
如果是这样,有没有办法将它专门应用于 a Microsoft.Office.Interop.Word.Range?
我尝试了以下代码,但没有奏效:
<Assembly: DebuggerDisplay("text: {Text}", Target:=GetType(Word.Range))>
Run Code Online (Sandbox Code Playgroud)
在运行时调试器显示此字符串:
{System.__ComObject}
Run Code Online (Sandbox Code Playgroud)
但是 'System.__ComObject' 不可访问,因为它是 'Friend'。
假设我有这样一个多边形
public partial class Window2 : Window
{
public Window2()
{
InitializeComponent();
var myPolygon = new Polygon();
myPolygon.Stroke = Brushes.Black;
myPolygon.Fill = Brushes.LightSeaGreen;
myPolygon.StrokeThickness = 2;
myPolygon.Points = new PointCollection(new Point[] {
new Point(50,50),
new Point(50,165),
new Point(140,165),
new Point(140,120),
new Point(70,120),
new Point(80,70),
new Point(140,70),
new Point(140,50)
});
this.Content = myPolygon;
}
}
Run Code Online (Sandbox Code Playgroud)
假设我想绘制从一边到另一边穿过多边形的红线,如下图所示:
我只知道线应该站立的垂直位置,但是我怎么知道我应该从哪个水平点开始线以及哪个水平点结束线?
我的主要目标是知道线从哪个水平点开始和在哪个点结束,以便在这条线上安排文本。
如果线在几个地方穿过形状(如下图所示),我想获得所有线的数组:
请注意,形状可以由直线和拱形组成。
以下是 Adobe Illustrator 以形状排列文本的方式:
我如何在 C# 中做到这一点?
谢谢!
注意:对于赏金,请附上 C# 中的示例。
我想像 Adobe Photoshop 一样应用不清晰的蒙版,我知道这个答案,但它不如 Photoshop 清晰。
Photoshop 在 Smart Sharpen 对话框中有 3 个参数:Amount、Radius、Reduce Noise;我想实现所有这些。

根据 SO 中的各种来源,这是我编写的代码。但是在某些阶段(“blurred”、“unsharpMask”、“highContrast”)结果很好,但在最后阶段(“retval”)结果不好。
我哪里错了,我应该改进什么?
是否可以在性能方面改进以下算法?
#include "opencv2/opencv.hpp"
#include "fstream"
#include "iostream"
#include <chrono>
using namespace std;
using namespace cv;
// from https://docs.opencv.org/3.4/d3/dc1/tutorial_basic_linear_transform.html
void increaseContrast(Mat img, Mat* dst, int amountPercent)
{
*dst = img.clone();
double alpha = amountPercent / 100.0;
*dst *= alpha;
}
// from /sf/answers/41737041/
float luminanceAsPercent(Vec3b color)
{
return (0.2126 * color[2]) + (0.7152 * color[1]) + (0.0722 * color[0]);
}
// …Run Code Online (Sandbox Code Playgroud) c# ×7
.net ×5
vb.net ×3
wpf ×3
algorithm ×2
opencv ×2
c++ ×1
com ×1
debugging ×1
directwrite ×1
directx ×1
geometry ×1
google-docs ×1
graph ×1
graphics ×1
grouping ×1
javascript ×1
math ×1
ms-office ×1
ocr ×1
opentype ×1
photoshop ×1
search ×1
uniscribe ×1
visual-c++ ×1
vsto ×1
winapi ×1
windows ×1
winforms ×1