Format16bppGrayScale: в gdi + произошла общая ошибка - PullRequest
0 голосов
/ 22 июня 2019

Я пытаюсь использовать Format16bppGrayScale, но получаю сообщение об ошибке: «в gdi + произошла общая ошибка». У меня есть монохроматическая камера, которая дает мне 16-битное значение, и я хочу сохранить ее в Format16bppGrayScale, чтобы я мог сохранить свое изображение с камеры. 16-битное значение поступает в массив, который представляет собой два индекса массива на одно 16-битное значение

public  Bitmap ByteToImage1(byte[] blob)
    {


        Bitmap bmpRGB = new Bitmap(KeepWidth, KeepHeight, System.Drawing.Imaging.PixelFormat.Format16bppGrayScale);
        Rectangle rect = new Rectangle(0, 0, KeepWidth, KeepHeight);
        BitmapData bmpData = bmpRGB.LockBits(rect, ImageLockMode.WriteOnly, bmpRGB.PixelFormat);
        int padding = bmpData.Stride - 3 * KeepWidth;
        unsafe
        {
            int i = 0;
            byte* ptr = (byte*)bmpData.Scan0;
            for( int y= 0; y < KeepHeight; y++)
            {
                    for(int x = 0; x < KeepWidth; x++)
                {

                    ptr[1] = blob[i+1];
                    ptr[0] = blob[i];

                    i = i + 2;
                    ptr += 2;
                }
                ptr += padding;
            }

        }
        bmpRGB.UnlockBits(bmpData);
        return bmpRGB;

    }

Обновление: код Карстена

 private Bitmap GenerateDummy16bitImage(byte[] temp)
    {
        int i2 = 0;

        Bitmap b16bpp = new Bitmap(KeepWidth, KeepHeight, System.Drawing.Imaging.PixelFormat.Format16bppGrayScale);

        var rect = new Rectangle(0, 0, KeepWidth, KeepHeight);
        var bitmapData = b16bpp.LockBits(rect, ImageLockMode.WriteOnly, b16bpp.PixelFormat);
        // Calculate the number of bytes required and allocate them.
        var numberOfBytes = bitmapData.Stride * KeepHeight;
        var bitmapBytes = new short[KeepWidth * KeepHeight];
        // Fill the bitmap bytes with random data.
        var random = new Random();
        for (int x = 0; x < KeepWidth; x++)
        {
            for (int y = 0; y < KeepHeight; y++)
            {

                var i = ((y * KeepWidth) + x); // 16bpp

                // Generate the next random pixel color value.
                var value = (short)temp[i2]; //(short)random.Next(5);

                bitmapBytes[i] = value;         // GRAY
                i2++;
            }
        }
        // Copy the randomized bits to the bitmap pointer.
        var ptr = bitmapData.Scan0;
        Marshal.Copy(bitmapBytes, 0, ptr, bitmapBytes.Length);

        // Unlock the bitmap, we're all done.
        b16bpp.UnlockBits(bitmapData);

        return b16bpp;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...