Saad
Saad

Reputation:

Pixel Programming continued

I have got a byte array of pixels in BGR order and I want to create an image out of it in C#. Can anyone offer code or advice?

Upvotes: 5

Views: 743

Answers (3)

Jader Dias
Jader Dias

Reputation: 90573

You might need something like this :

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;
}

Upvotes: 1

user21826
user21826

Reputation: 3644

Something to the effect of (not-tested)


        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;
        }

Upvotes: 1

lc.
lc.

Reputation: 116528

The Bitmap(int width, int height, int stride, PixelFormat format, IntPtr scan0) constructor for the Bitmap class might be helpful. It depends on how the data is stored in the array, of course.

Upvotes: 0

Related Questions