【C#】转换8位或16位像素值为Bitmap

1.转换16位像素值为Bitmap,不带颜色空间信息(如RGB)的16位图像

 public static Bitmap Convert16BitGrayscaleToBitmap(byte[] grayscale16Data, int width, int height)
        {
            // 创建一个8位灰度Bitmap用于存储转换后的图像
            Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format8bppIndexed);

            // 初始化色彩映射表,确保0-255范围映射正确
            ColorPalette palette = bitmap.Palette;
            for (int i = 0; i < 256; i++)
                palette.Entries[i] = Color.FromArgb(i, i, i);
            bitmap.Palette = palette;

            // 锁定Bitmap以便直接访问其像素数据
            BitmapData bitmapData = bitmap.LockBits(
                new Rectangle(0, 0, width, height),
                ImageLockMode.WriteOnly,
                bitmap.PixelFormat);

            IntPtr ptr = bitmapData.Scan0;
            int bytesPerPixel = bitmapData.Stride / width; // 应该是1,对于8bpp
            int bufferSize = bitmapData.Stride * height;

            unsafe
            {
                byte* p = (byte*)ptr.ToPointer();

                for (int y = 0; y < height; y++)
                {
                    for (int x = 0; x < width; x++)
                    {
                        // 这里简化处理,直接读取16位数据并缩小到8位,实际应用中需要考虑数据映射
                        short pixelValue = (short)(grayscale16Data[y * width * 2 + x * 2] | grayscale16Data[y * width * 2 + x * 2 + 1] << 8);

                        // 简单映射,实际情况可能需要更复杂的转换来保留更多细节
                        //byte grayValue = (byte)(pixelValue >> 8); // 粗略转换,丢失高位信息
                        //byte grayValue = (byte)Math.Min(255, (pixelValue / 256f) * (1 + 20.5f));
                        p[y * bitmapData.Stride + x] = GammaCorrectedMap(pixelValue);
                    }
                }
            }

            bitmap.UnlockBits(bitmapData);
            return bitmap;
        }

伽马校正

 static byte GammaCorrectedMap(short pixelValue, float gamma = 2.2f)
        {
            // 将像素值转换为0~1之间的浮点数
            float normalizedValue = pixelValue / 65535f;
            // 应用伽马校正,然后重新缩放到0~255
            return (byte)Math.Round(Math.Pow(normalizedValue, 1 / gamma) * 255);
        }

2.转换16位像素值为Bitmap,带颜色空间信息(如RGB)的16位图像

public static Bitmap Convert16BitGrayscaleToBitmapColour(byte[] pixelData, int width, int height)
        {
            // 确保数据长度正确
            if (pixelData.Length != width * height * 2)
            {
                throw new ArgumentException("Pixel data length does not match the specified dimensions.");
            }

            // 创建Bitmap对象
            Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format16bppRgb565);

            // 锁定Bitmap以便写入像素数据
            BitmapData bitmapData = bitmap.LockBits(
                new Rectangle(0, 0, width, height),
                ImageLockMode.WriteOnly,
                bitmap.PixelFormat);

            // 获取Bitmap的字节级指针
            IntPtr ptr = bitmapData.Scan0;

            // 将像素数据复制到Bitmap
            System.Runtime.InteropServices.Marshal.Copy(pixelData, 0, ptr, pixelData.Length);

            // 解锁Bitmap
            bitmap.UnlockBits(bitmapData);

            return bitmap;
        }

3.转换8位像素值为Bitmap

public static Bitmap ConvertToBitmap8Bit(byte[] pixelData, int width, int height)
        {
            // 确保数据长度正确
            if (pixelData.Length != width * height)
            {
                throw new ArgumentException("Pixel data length does not match the specified dimensions.");
            }

            // 创建一个Bitmap对象,指定像素格式为8位灰度
            Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format8bppIndexed);

            // 设置调色板为灰度调色板
            var palette = bitmap.Palette;
            for (int i = 0; i < 256; i++)
            {
                palette.Entries[i] = Color.FromArgb(i, i, i);
            }
            bitmap.Palette = palette;

            // 锁定Bitmap以便写入像素数据
            BitmapData bitmapData = bitmap.LockBits(
                new Rectangle(0, 0, width, height),
                ImageLockMode.WriteOnly,
                bitmap.PixelFormat);

            // 获取Bitmap的字节级指针
            IntPtr ptr = bitmapData.Scan0;

            // 将像素数据复制到Bitmap
            System.Runtime.InteropServices.Marshal.Copy(pixelData, 0, ptr, pixelData.Length);

            // 解锁Bitmap
            bitmap.UnlockBits(bitmapData);

            return bitmap;
        }

 

 

 

上一篇:JS易错点


下一篇:css实现一个炫酷动画loading(二)