位图从字节数组移位
本文关键字:数组 字节数 字节 位图 | 更新日期: 2023-09-27 18:05:07
我正在尝试使用以下代码从字节数组创建位图:
var b = new Bitmap(pervoe, vtoroe, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
ColorPalette ncp = b.Palette;
for (int i = 0; i < 256; i++)
ncp.Entries[i] = System.Drawing.Color.FromArgb(255, i, i, i);
b.Palette = ncp;
var BoundsRect = new Rectangle(0, 0, Width, Height);
BitmapData bmpData = b.LockBits(BoundsRect,ImageLockMode.WriteOnly,b.PixelFormat);
IntPtr ptr = bmpData.Scan0;
int bytes = (bmpData.Stride)*(b.Height);
var rgbValues = new byte[bytes];
// filling values
Marshal.Copy(rgbValues, 0, ptr, bytes);
b.UnlockBits(bmpData);
return b;
问题是,当我得到输出图像的每一行从第一行开始向右移动,所以整个图像看起来不对。问题不在于rgbValues -我试着用setPixel方法使用它,它工作完美。对法警等级有什么帮助吗或者我该怎么做才能防止这种转变?
您显示的代码看起来很好,应该按预期工作。这个问题很可能与您如何实现// filling values
部分有关。我的猜测是,您的图像的宽度是这样的bmpData.Stride != b.Width
(因此bytes != Width * Height
),但您没有考虑它并填充rgbValues
数组的第一个Width * Height
字节。
出于优化的目的,Bitmap
实现可能会选择在实际上不是图像一部分的每一行图像数据中添加填充字节。如果是这样,您应该考虑到这一点,并将图像数据写入每行的第一个Width
字节,其中每行从索引rowIndex * BitmapData.Stride
开始。
for (int row = 0; row < b.Height; ++row)
{
int rowStart = row * bmpData.Stride;
for (int column = 0; column < b.Width; ++column)
{
rgbValues[rowStart + column] = GetColorForPixel(column, row);
}
}