将位图转换为Format24bppRgb

时间:2011-01-24 20:32:42

标签: c# .net

我正在尝试将位图转换为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;
    }
}

2 个答案:

答案 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位位图中的字节布局。