小编Sla*_*shy的帖子

如何扫描两个图像的差异?

我正在尝试扫描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)

c# screenshot image-processing

19
推荐指数
1
解决办法
1346
查看次数

扫描图像以查找矩形

我正在尝试扫描一个恒定大小的图像,并在其中找到绘制的矩形.矩形可以有任何尺寸,但只有红色.

不是问题的起点.

我将使用已经编写的函数,稍后我会将其用作伪代码调用的代码逻辑.

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)

c# algorithm image-processing computer-vision

19
推荐指数
1
解决办法
1075
查看次数

C#屏幕流媒体节目

最近我一直在做一个简单的屏幕共享程序.

实际上,该程序可以TCP protocol使用桌面复制API - 一种很酷的服务,支持非常快速的屏幕捕获,还提供有关MovedRegions(仅改变其在屏幕上的位置但仍然存在的UpdatedRegions区域)和(更改区域)的信息.

桌面复制有2个重要属性 - 2个字节数组,一个数组previouspixels和一个NewPixels数组.每4个字节代表RGBA形式的一个像素,例如,如果我的屏幕是1920 x 1080,则缓冲区大小为1920 x 1080*4.

以下是我的策略的重要亮点

  1. 在初始状态(第一次)我发送整个像素缓冲区(在我的情况下它是1920 x 1080*3) - alpha组件在屏幕上总是255 :)
  2. 从现在开始,我遍历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)

c# sockets performance

17
推荐指数
1
解决办法
7986
查看次数

C#更新picturebox中的位图

我正在进行一个屏幕共享项目,我不断收到一小块图像Socket,需要在我拥有的某个初始dekstop位图上更新它们.

基本上我不断地从插座(其被存储为JPEG图像数据)读出的数据,使用Image.FromStream()以检索图像和复制收到块象素到全初级位图(在特定的位置XY其我也从插座获得) -这就是如何初始图像得到更新.但接下来是我需要在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)

c# performance bitmap

12
推荐指数
1
解决办法
3713
查看次数

Wpf圆角进度条

我正在尝试制作一个带圆角的简单进度条.

这是我的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房产....但我找到它.有什么帮助吗?

谢谢.

c# wpf templates

7
推荐指数
1
解决办法
5762
查看次数

c# 检查程序是否在启动时运行

我想检查某个程序是否在计算机启动时运行,我 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# windows registry

3
推荐指数
1
解决办法
2317
查看次数