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