5

我有一个按 BGR 顺序排列的像素字节数组,我想在 C# 中用它创建一个图像。任何人都可以提供代码或建议吗?

4

3 回答 3

1

你可能需要这样的东西:

public static Bitmap TransformBGRArrayToBitmap(byte[] inputValues, int Width, int Height, int Stride)
{
    Bitmap output = new Bitmap(Width, Height, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);

    // Lock the bitmap's bits.  
    Rectangle rect = new Rectangle(0, 0, Width, Height);
    BitmapData outputData = output.LockBits(rect, System.Drawing.Imaging.ImageLockMode.WriteOnly, output.PixelFormat);

    // Get the address of the first line.
    IntPtr outputPtr = outputData.Scan0;

    // Declare an array to hold the bytes of the bitmap.
    byte[] outputValues = new byte[outputData.Stride * output.Height];
    int inputBytesPP = (1 * Stride) / Width;
    int outputBytesBPP = (1 * outputData.Stride) / output.Width;

    // Copy the RGB values into the array.
    for (int inputByte = 0, outputByte = 0; inputByte < inputValues.Length; inputByte += inputBytesPP, outputByte += outputBytesBPP)
    {
        //The logic inside this loop transforms a 32 bit ARGB Bitmap into an 8 bit indexed Bitmap
        //So you will have to replace it
        /*byte pixel = 0x00;
        if (inputValues[inputByte] > 0x7F)
        {
            if (inputValues[inputByte + 1] > 0x7F)
                pixel |= 0x01;
            if (inputValues[inputByte + 2] > 0x7F)
                pixel |= 0x02;
            if (inputValues[inputByte + 3] > 0x7F)
                pixel |= 0x04;
            if ((inputValues[inputByte + 1] & 0x7F) > 0x3F)
                pixel |= 0x02;
            if ((inputValues[inputByte + 2] & 0x7F) > 0x3F)
                pixel |= 0x04;
            if ((inputValues[inputByte + 3] & 0x7F) > 0x3F)
                pixel |= 0x08;
        }
        else
            pixel = 0x10;
        outputValues[outputByte] = pixel;*/
    }
    System.Runtime.InteropServices.Marshal.Copy(outputValues, 0, outputPtr, outputValues.Length);
    output.UnlockBits(outputData);
    return output;
}
于 2008-12-29T20:12:11.037 回答
1

影响(未经测试)的东西


        private Bitmap createImage(int width, int height, byte[] image)
        {
            int index = 0;
            byte r, g, b;
            Bitmap bmp = new Bitmap(width, height);
            for (y as int = 0; y < height; y++)
            {                
                for (x as int = 0; x < width; x++)
                {
                    b = image[y * width + index];
                    g = image[y * width + index + 1];
                    r = image[y * width + index + 2];
                    bmp.SetPixel(x, y, Color.FromArgb(255, r, g, b));
                    index += 3;
                }                
            }
            return bmp;
        }

于 2008-12-25T02:31:28.983 回答
0

该类的Bitmap(int width, int height, int stride, PixelFormat format, IntPtr scan0)构造函数Bitmap可能会有所帮助。当然,这取决于数据如何存储在数组中。

于 2008-12-25T02:42:28.367 回答