C# 在另一个位图上绘制位图会产生扭曲的图像
我正在使用一个自定义类将一个图像写入另一个更大的图像。这是完整的DotNetFiddle 我的自定义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;
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;