Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C语言中操作像素级的图像#_C#_Image Processing_Image Manipulation - Fatal编程技术网

C# 如何在C语言中操作像素级的图像#

C# 如何在C语言中操作像素级的图像#,c#,image-processing,image-manipulation,C#,Image Processing,Image Manipulation,如何在C#中操作像素级的图像 我需要能够分别读取/修改每个位图像素RGB值 如果您想要速度,请提供代码示例。。请参见此处,了解鲍勃·鲍威尔的精彩演练。如果您只想编辑一些,那么/应该做您想做的。System.Drawing.Bitmap有一个GetPixel(int x,int y)公共方法,返回System.Drawing.Color结构。该结构具有字节成员R、G、B和A,您可以直接修改它们,然后在位图上再次调用SetPixel(颜色)。 不幸的是,这将相对缓慢,但这是用C#实现的最简单的方法。

如何在C#中操作像素级的图像

我需要能够分别读取/修改每个位图像素RGB值


如果您想要速度,请提供代码示例。

。请参见此处,了解鲍勃·鲍威尔的精彩演练。如果您只想编辑一些,那么/应该做您想做的。

System.Drawing.Bitmap有一个GetPixel(int x,int y)公共方法,返回System.Drawing.Color结构。该结构具有字节成员R、G、B和A,您可以直接修改它们,然后在位图上再次调用SetPixel(颜色)。
不幸的是,这将相对缓慢,但这是用C#实现的最简单的方法。如果您经常使用单个像素,发现性能不足,并且需要更快的速度,您可以使用锁定位。。。不过,这要复杂得多,因为您需要了解颜色深度和类型的位结构,并处理位图的跨步以及其他不需要的内容。。。所以,如果你觉得有必要,一定要找到一个好的教程!网络上有好几种,谷歌搜索“C#LockBits”会得到半打值得一读的代码。

一个示例代码例程(我使用它来实现简单的合并和比较功能。它获取两个图像并生成第三个灰度图像,以灰度色调级别显示两个图像之间的差异。颜色越深,差异越大。):

公共静态位图差异(位图src1、位图src2、int-x1、int-y1、int-x2、int-y2、int-width、int-height)
{
位图diffBM=新位图(宽度、高度、像素格式.Format24bppRgb);
对于(int y=0;y

注意锁位,并使用它直接在内存中修改图像。如果性能是一个问题,我建议查看锁位,而不是我发布的内容。谢谢Marc!

如果性能至关重要,则锁位的另一种替代方法是managed DirectX

有关更多信息,请参阅前面的堆栈溢出问题

与锁位一样,您需要使用不安全的关键字/编译器开关,但您可以获得高性能像素级访问


与使用普通位图类和PictureBox控件相比,您还可以通过DirectX backbuffering获得更高的屏幕渲染性能。

很好。我从来没有考虑过超出设置/获取像素。感谢链接。Bob Powell没有告诉您的是,您实际上不需要处理C#中的指针。看一看在MSDN库中的LockBits中,有一个示例将内存复制到一个托管阵列中,该阵列中的方法没有标记为不安全,因此应用程序不必不安全:)XNA用户注意,XBox360.NET CF不支持System.Drawing库,这是LockBits所在的位置。所以managed DirectX可能是您唯一的选择(感谢Ash)。链接为“此处”的站点已关闭。“此处”中链接的站点现在是一个消息框pop病毒骗局。managed DirectX现在已被弃用。尽管如此,
GetPixel
SetPixel
速度非常慢
Bitmap.LockBits
Marshal.Copy
结合使用可以实现同样的效果,但是可以批量而不是逐像素地输出数据,这使得加载速度更快。
    public static Bitmap Diff(Bitmap src1, Bitmap src2, int x1, int y1, int x2, int y2, int width, int height)
{
    Bitmap diffBM = new Bitmap(width, height, PixelFormat.Format24bppRgb);

    for (int y = 0; y < height; y++)
    {
        for (int x = 0; x < width; x++)
        {
            //Get Both Colours at the pixel point
            Color col1 = src1.GetPixel(x1 + x, y1 + y);
            Color col2 = src2.GetPixel(x2 + x, y2 + y);

            // Get the difference RGB
            int r = 0, g = 0, b = 0;
            r = Math.Abs(col1.R - col2.R);
            g = Math.Abs(col1.G - col2.G);
            b = Math.Abs(col1.B - col2.B);

            // Invert the difference average
            int dif = 255 - ((r+g+b) / 3);

            // Create new grayscale RGB colour
            Color newcol = Color.FromArgb(dif, dif, dif);

            diffBM.SetPixel(x, y, newcol);

        }
    }

    return diffBM;
}