Image Ushort array to bitmap format8bppindexed

594 views Asked by At

I have as input a Ushort array of image data. Other inputs are gathered here, such as the 'Width, Height'. The ushort array also carries a Min and Max values, that I want to use, those are stored in 'io_current'.

I want to return a Format8ppIndexed Bitmap, and I have this code but what am I doing wrong?:

    private Bitmap CreateBitmap(ushort[,] pixels16)
    {
        int width = pixels16.GetLength(1);
        int height = pixels16.GetLength(0);
        Bitmap bmp = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
        BitmapData bmd = bmp.LockBits(new Rectangle(0, 0, width, height),
        System.Drawing.Imaging.ImageLockMode.ReadOnly, bmp.PixelFormat);

        // This 'unsafe' part of the code populates the bitmap bmp with data stored in pixel16.
        // It does so using pointers, and therefore the need for 'unsafe'. 
        unsafe
        {
            //int pixelSize = 4;
            int i, j; //, j1; //, i1;
            byte b;
            ushort sVal;
            double lPixval;
            //The array has max and min constraints
            int distance = io_current.MaximumValue - io_current.MinimumValue;

            for (i = 0; i < bmd.Height; ++i)
            {
                byte* row = (byte*)bmd.Scan0 + (i * bmd.Stride);
                //i1 = i * bmd.Height;

                for (j = 0; j < bmd.Width; ++j)
                {
                    sVal = (ushort)(pixels16[i, j]);

                    lPixval = ((sVal - io_current.MinimumValue) * 255) / distance; // Convert to a 255 value range
                    //lPixval = ((sVal - io_current.MinimumValue) / distance) * 255;
                    //lPixval = 255 - lPixval; //invert the value
                    if (lPixval > 255) lPixval = 255;
                    if (lPixval < 0) lPixval = 0;
                    b = (byte)(lPixval);
                    //j1 = j * pixelSize; //Pixelsize is one
                    row[j] = b; // Just one in 8bpp

                    //Not necessary for format8bppindexed
                    //row[j1] = b; // Red
                    //row[j1 + 1] = b; // Green
                    //row[j1 + 2] = b; // Blue
                    //row[j1 + 3] = 255; //No Alpha channel in 24bit
                }
            }
        }
        bmp.UnlockBits(bmd);
        return bmp;
    }

I'm getting a Black screen, or a one color screen. Basically no usable data is returned. Obviously from the comments. I tried to convert this from 24bit bitmap code and thought it would be easy.

0

There are 0 answers