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

2024-05-31 21:36

本文主要是介绍【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,对于8bppint 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~255return (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;// 将像素数据复制到BitmapSystem.Runtime.InteropServices.Marshal.Copy(pixelData, 0, ptr, pixelData.Length);// 解锁Bitmapbitmap.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;// 将像素数据复制到BitmapSystem.Runtime.InteropServices.Marshal.Copy(pixelData, 0, ptr, pixelData.Length);// 解锁Bitmapbitmap.UnlockBits(bitmapData);return bitmap;}

 

 

 

这篇关于【C#】转换8位或16位像素值为Bitmap的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1019110

相关文章

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

Java对象转换的实现方式汇总

《Java对象转换的实现方式汇总》:本文主要介绍Java对象转换的多种实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java对象转换的多种实现方式1. 手动映射(Manual Mapping)2. Builder模式3. 工具类辅助映

python实现svg图片转换为png和gif

《python实现svg图片转换为png和gif》这篇文章主要为大家详细介绍了python如何实现将svg图片格式转换为png和gif,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录python实现svg图片转换为png和gifpython实现图片格式之间的相互转换延展:基于Py

C# foreach 循环中获取索引的实现方式

《C#foreach循环中获取索引的实现方式》:本文主要介绍C#foreach循环中获取索引的实现方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、手动维护索引变量二、LINQ Select + 元组解构三、扩展方法封装索引四、使用 for 循环替代

C# Where 泛型约束的实现

《C#Where泛型约束的实现》本文主要介绍了C#Where泛型约束的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录使用的对象约束分类where T : structwhere T : classwhere T : ne

C#实现将Excel表格转换为图片(JPG/ PNG)

《C#实现将Excel表格转换为图片(JPG/PNG)》Excel表格可能会因为不同设备或字体缺失等问题,导致格式错乱或数据显示异常,转换为图片后,能确保数据的排版等保持一致,下面我们看看如何使用C... 目录通过C# 转换Excel工作表到图片通过C# 转换指定单元格区域到图片知识扩展C# 将 Excel

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程