我正在尝试将位图转换为Format24bppRgb。 因为我需要为每个像素设置一组颜色数组,所以我使用了不安全的代码。
问题是位图以某种方式转换为Jpeg。 当我看到颜色阵列时,有些颜色在黑色和白色之间有一种奇怪的颜色(黄色或蓝色)。
有没有办法防止颜色变化?
//image
mstr = new MemoryStream(msgSet.VMSPage2Image);
bitmapFile = new Bitmap(mstr);
data = bitmapFile.LockBits(new Rectangle(0, 0, bitmapFile.Width, bitmapFile.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
colors = new Color[data.Height, data.Width];
unsafe
{
byte* imgPtr = (byte*)(data.Scan0);
for (int i = 0; i < data.Height; i++)
{
for (int j = 0; j < data.Width; j++)
{
// write the logic implementation here
imgPtr += 1;
int G = *imgPtr;
imgPtr += 1;
int R = *imgPtr;
imgPtr += 1;
int B = *imgPtr;
colors[i, j] = Color.FromArgb(R, G, B);
}
imgPtr += data.Stride - data.Width * 3;
}
}
答案 0 :(得分:2)
我看到的第一个问题是你在第一次解除引用之前递增指针。
接下来,您没有正确地将指针推进到下一行。
最后,这些像素将以BGR顺序存储,而不是GRB。那么,对于24bit rgb ......
for (int y = 0; i < data.Height; i++)
{
byte* imgPtr = (byte*)(data.Scan0 + (data.Stride * y));
for (int x = 0; j < data.Width; j++)
{
int b = *imgPtr++;
int g = *imgPtr++;
int r = *imgPtr++;
colors[x, y] = Color.FromArgb(r, g, b);
}
}
答案 1 :(得分:0)
您确定要正确阅读颜色数据吗?我以为位图使用BGR来表示24位位图中的字节布局。