【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

相关文章

Python进行JSON和Excel文件转换处理指南

《Python进行JSON和Excel文件转换处理指南》在数据交换与系统集成中,JSON与Excel是两种极为常见的数据格式,本文将介绍如何使用Python实现将JSON转换为格式化的Excel文件,... 目录将 jsON 导入为格式化 Excel将 Excel 导出为结构化 JSON处理嵌套 JSON:

C#中lock关键字的使用小结

《C#中lock关键字的使用小结》在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时,其他线程无法访问同一实例的该代码块,下面就来介绍一下lock关键字的使用... 目录使用方式工作原理注意事项示例代码为什么不能lock值类型在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时

C# $字符串插值的使用

《C#$字符串插值的使用》本文介绍了C#中的字符串插值功能,详细介绍了使用$符号的实现方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录$ 字符使用方式创建内插字符串包含不同的数据类型控制内插表达式的格式控制内插表达式的对齐方式内插表达式中使用转义序列内插表达式中使用

C#中的Converter的具体应用

《C#中的Converter的具体应用》C#中的Converter提供了一种灵活的类型转换机制,本文详细介绍了Converter的基本概念、使用场景,具有一定的参考价值,感兴趣的可以了解一下... 目录Converter的基本概念1. Converter委托2. 使用场景布尔型转换示例示例1:简单的字符串到

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速

Kotlin Map映射转换问题小结

《KotlinMap映射转换问题小结》文章介绍了Kotlin集合转换的多种方法,包括map(一对一转换)、mapIndexed(带索引)、mapNotNull(过滤null)、mapKeys/map... 目录Kotlin 集合转换:map、mapIndexed、mapNotNull、mapKeys、map

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

C#读写文本文件的多种方式详解

《C#读写文本文件的多种方式详解》这篇文章主要为大家详细介绍了C#中各种常用的文件读写方式,包括文本文件,二进制文件、CSV文件、JSON文件等,有需要的小伙伴可以参考一下... 目录一、文本文件读写1. 使用 File 类的静态方法2. 使用 StreamReader 和 StreamWriter二、二进

C#中Guid类使用小结

《C#中Guid类使用小结》本文主要介绍了C#中Guid类用于生成和操作128位的唯一标识符,用于数据库主键及分布式系统,支持通过NewGuid、Parse等方法生成,感兴趣的可以了解一下... 目录前言一、什么是 Guid二、生成 Guid1. 使用 Guid.NewGuid() 方法2. 从字符串创建