我正在尝试扫描2个图像(32bppArgb格式),识别何时存在差异并将差异块的边界存储在矩形列表中.
我想获得不同的矩形边界(在我们的例子中打开的目录窗口).
这就是我所做的:
private unsafe List<Rectangle> CodeImage(Bitmap bmp,Bitmap bmp2)
{
List<Rectangle> rec = new List<Rectangle>();
bmData = bmp.LockBits(new System.Drawing.Rectangle(0, 0, 1920, 1080), System.Drawing.Imaging.ImageLockMode.ReadOnly, bmp.PixelFormat);
bmData2 = bmp2.LockBits(new System.Drawing.Rectangle(0, 0, 1920, 1080), System.Drawing.Imaging.ImageLockMode.ReadOnly, bmp2.PixelFormat);
IntPtr scan0 = bmData.Scan0;
IntPtr scan02 = bmData2.Scan0;
int stride = bmData.Stride;
int stride2 = bmData2.Stride;
int nWidth = bmp.Width;
int nHeight = bmp.Height;
int minX = int.MaxValue; ;
int minY = int.MaxValue;
int maxX = 0;
bool found = false;
for (int y = …
Run Code Online (Sandbox Code Playgroud) 我正在尝试扫描一个恒定大小的图像,并在其中找到绘制的矩形.矩形可以有任何尺寸,但只有红色.
这不是问题的起点.
我将使用已经编写的函数,稍后我会将其用作伪代码调用的代码逻辑.
Rectangle Locate(Rectangle scanArea);
//扫描给定扫描区域中的矩形.如果未找到rectagle,则返回null.
我的逻辑是这样的:
使用Locate()
具有完整图像大小作为参数的函数查找第一个初始红色矩形.现在,划分其余区域,并递归扫描.该算法逻辑的要点是你永远不会检查已经检查过的区域,并且你不必使用任何条件,因为scanArea
参数总是一个你以前没有扫过的新区域(这要归功于分割技术) ).分割过程如下所示:当前找到的矩形的右侧区域,底部区域和左侧区域.
这是一个说明该过程的图像.
(白色虚线矩形和黄色箭头不是图像的一部分,我只为图示添加了它们.)
如您所见,一旦发现红色矩形,我会一直扫描它的右边,左下角.递归.
所以这是该方法的代码:
List<Rectangle> difList=new List<Rectangle>();
private void LocateDifferences(Rectangle scanArea)
{
Rectangle foundRect = Locate(scanArea);
if (foundRect == null)
return; // stop the recursion.
Rectangle rightArea = new Rectangle(foundRect.X + foundRect.Width, foundRect.Y, (scanArea.X + scanArea.Width) - (foundRect.X + foundRect.Width), (scanArea.Y + scanArea.Height) - (foundRect.Y + foundRect.Height)); // define right area.
Rectangle bottomArea = new Rectangle(foundRect.X, foundRect.Y + foundRect.Height, foundRect.Width, (scanArea.Y + scanArea.Height) - …
Run Code Online (Sandbox Code Playgroud) 最近我一直在做一个简单的屏幕共享程序.
实际上,该程序可以TCP protocol
使用桌面复制API - 一种很酷的服务,支持非常快速的屏幕捕获,还提供有关MovedRegions
(仅改变其在屏幕上的位置但仍然存在的UpdatedRegions
区域)和(更改区域)的信息.
桌面复制有2个重要属性 - 2个字节数组,一个数组previouspixels
和一个NewPixels
数组.每4个字节代表RGBA形式的一个像素,例如,如果我的屏幕是1920 x 1080,则缓冲区大小为1920 x 1080*4.
以下是我的策略的重要亮点
从现在开始,我遍历UpdatedRegions(它是一个矩形数组),我发送区域边界和Xo'r像素,如下所示:
writer.Position = 0;
var n = frame._newPixels;
var w = 1920 * 4; //frame boundaries.
var p = frame._previousPixels;
foreach (var region in frame.UpdatedRegions)
{
writer.WriteInt(region.Top);
writer.WriteInt(region.Height);
writer.WriteInt(region.Left);
writer.WriteInt(region.Width);
for (int y = region.Top, yOffset = y * w; y < region.Bottom; y++, yOffset += w) …
Run Code Online (Sandbox Code Playgroud)我正在进行一个屏幕共享项目,我不断收到一小块图像Socket
,需要在我拥有的某个初始dekstop位图上更新它们.
基本上我不断地从插座(其被存储为JPEG图像数据)读出的数据,使用Image.FromStream()
以检索图像和复制收到块象素到全初级位图(在特定的位置X
和Y
其我也从插座获得) -这就是如何初始图像得到更新.但接下来是我需要在Picturebox
我处理Paint
事件并再次重新绘制它的部分 - 整个初始图像,这是非常大的(在我的情况下是1920X1080).
这是我的代码:
private void MainScreenThread()
{
ReadData();//reading data from socket.
initial = bufferToJpeg();//first intial full screen image.
pictureBox1.Paint += pictureBox1_Paint;//activating the paint event.
while (true)
{
int pos = ReadData();
x = BlockX();//where to draw :X
y = BlockY();//where to draw :Y
Bitmap block = bufferToJpeg();//constantly reciving blocks.
Draw(block, new Point(x, y));//applying the changes-drawing the block on the big initial image.using native memcpy.
this.Invoke(new …
Run Code Online (Sandbox Code Playgroud) 我正在尝试制作一个带圆角的简单进度条.
这是我的xaml:
<Grid>
<ProgressBar Minimum="0" Maximum="100" Height="50" Value="50" Name="pbStatus" BorderBrush="Black" BorderThickness="3" Foreground="#336699" />
<TextBlock Text="{Binding ElementName=pbStatus, Path=Value, StringFormat={}{0:0}%}" HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>
Run Code Online (Sandbox Code Playgroud)
我正在寻找Border-Radius
房产....但我找到它.有什么帮助吗?
谢谢.
我想检查某个程序是否在计算机启动时运行,我 win32 RegistryKey
为此访问了该类:
private void Form1_Load(object sender, EventArgs e)
{
bool ok = isOnRegistryStartup("iFilter");
MessageBox.Show(ok.ToString());
}
private bool isOnRegistryStartup(string key)
{
RegistryKey RegistryKey = Registry.CurrentUser.OpenSubKey
("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
if (registryKey.GetValue(key)!=null)
{
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
输出True
确实是,因为该程序实际上在 Windows 启动时运行,但是当我通过Task manager
(并且它的状态变为disabled
)禁用该程序启动时,下次我运行上面的代码时,结果仍然是True
,即使该程序不是一部分不再有启动程序了。
这让我得出一个简单的结论,当Windows任务管理器禁用启动程序时,它不会删除它在注册表项中的键,但它会更改它的另一个值..但我无法找出那是什么改变了值。
我希望有人能帮帮忙。
谢谢。
c# ×6
performance ×2
algorithm ×1
bitmap ×1
registry ×1
screenshot ×1
sockets ×1
templates ×1
windows ×1
wpf ×1