Пиксельное программирование продолжено - PullRequest
5 голосов
/ 25 декабря 2008

У меня есть байтовый массив пикселей в порядке BGR, и я хочу создать из него изображение в C #. Кто-нибудь может предложить код или совет?

Ответы [ 3 ]

1 голос
/ 29 декабря 2008

Вам может понадобиться что-то вроде этого:

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;
}
1 голос
/ 25 декабря 2008

Что-то с эффектом (не проверено)


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

0 голосов
/ 25 декабря 2008

Конструктор Bitmap(int width, int height, int stride, PixelFormat format, IntPtr scan0) для класса Bitmap может быть полезен. Конечно, это зависит от того, как данные хранятся в массиве.

...