Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.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#_Image Processing_Bitmap_Locking_Bitmapdata - Fatal编程技术网

C# 在另一个位图上绘制位图会产生扭曲的图像

C# 在另一个位图上绘制位图会产生扭曲的图像,c#,image-processing,bitmap,locking,bitmapdata,C#,Image Processing,Bitmap,Locking,Bitmapdata,我正在使用一个自定义类将一个图像写入另一个更大的图像。这是完整的DotNetFiddle 我的自定义GetPixel()工作正常。但是下面的SetPixel()无法生成正确的输出。地址的计算可能存在一些问题。但是,我无法检测到它 public void SetPixel(int x, int y, Color color) { // Get color components count int cCount = ColorDepth / 8;

我正在使用一个自定义类将一个图像写入另一个更大的图像。这是完整的DotNetFiddle

我的自定义
GetPixel()
工作正常。但是下面的
SetPixel()
无法生成正确的输出。地址的计算可能存在一些问题。但是,我无法检测到它

    public void SetPixel(int x, int y, Color color)
    {
        // Get color components count
        int cCount = ColorDepth / 8;
        // Get start index of the specified pixel
        int i = ((y * Width) + x) * cCount;
        //int i = ((x * Width) + y) * cCount;
        if (ColorDepth == 32) // For 32 bpp set Red, Green, Blue and Alpha
        {
            _imageData[i] = color.B;
            _imageData[i + 1] = color.G;
            _imageData[i + 2] = color.R;
            _imageData[i + 3] = color.A;
        }

        if (ColorDepth == 24) // For 24 bpp set Red, Green and Blue
        {
            _imageData[i] = color.B;
            _imageData[i + 1] = color.G;
            _imageData[i + 2] = color.R;
        }
        if (ColorDepth == 8)
        {
            // For 8 bpp set color value (Red, Green and Blue values are the same)
            _imageData[i] = color.B;

            string str = string.Empty;
        }
    }
这是在生成扭曲的图像:

p.S.以下是输入图像:

在GetPixel和SetPixel中都不正确。因为忽略了步幅,所以会出现倾斜。这是图像的单个扫描线中的字节数。它是4的倍数来对齐内存中的像素数据,有助于处理器更快地读取数据。修正:

    int i = y * Stride + x * cCount;
代码中还隐藏着另一个bug,扫描线是颠倒存储的。换句话说,首先存储最后一条扫描线的数据。但仅当BitmapData.Height不是负值时。由于该错误发生在GetPixel和SetPixel方法中,因此它们会相互抵消。正确的代码应该是(高度-y-1)*步幅+x*Account


此代码不比Graphics.DrawImage()快,Graphics.DrawImage()是您应该始终喜欢的方法。

您可以从中获得线索“索引超出范围”。它指的是
\u imageData[i]
,与获取/设置像素无关,只是代码中有一个bug。由于调试器已处于活动状态,请花时间检查
i
的值和
\u imageData
的大小。此外,请注意,
(x*Q)+y
不能盲目地“反转”为
(y*Q)+x
(当
y!=x
。尝试在保持纵横比的情况下调整图像大小:查看请使用提供的信息得出您没有正确创建阵列的结论。同样的错误,您再次使用宽度而不是步幅。亲爱的Hans,请查看链接。我使用了
(高度-y-1)*步幅+x*cCount
。不,问题是您的
\u imageData
数组,它当然必须包含步长*高度字节才能存储整个位图。你做得不够大。
    int i = y * Stride + x * cCount;