【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 Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

C#如何去掉文件夹或文件名非法字符

《C#如何去掉文件夹或文件名非法字符》:本文主要介绍C#如何去掉文件夹或文件名非法字符的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#去掉文件夹或文件名非法字符net类库提供了非法字符的数组这里还有个小窍门总结C#去掉文件夹或文件名非法字符实现有输入字

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.

使用Python实现获取屏幕像素颜色值

《使用Python实现获取屏幕像素颜色值》这篇文章主要为大家详细介绍了如何使用Python实现获取屏幕像素颜色值,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、一个小工具,按住F10键,颜色值会跟着显示。完整代码import tkinter as tkimport pyau

在Java中将XLS转换为XLSX的实现方案

《在Java中将XLS转换为XLSX的实现方案》在本文中,我们将探讨传统ExcelXLS格式与现代XLSX格式的结构差异,并为Java开发者提供转换方案,通过了解底层原理、性能优势及实用工具,您将掌握... 目录为什么升级XLS到XLSX值得投入?实际转换过程解析推荐技术方案对比Apache POI实现编程

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

C#代码实现解析WTGPS和BD数据

《C#代码实现解析WTGPS和BD数据》在现代的导航与定位应用中,准确解析GPS和北斗(BD)等卫星定位数据至关重要,本文将使用C#语言实现解析WTGPS和BD数据,需要的可以了解下... 目录一、代码结构概览1. 核心解析方法2. 位置信息解析3. 经纬度转换方法4. 日期和时间戳解析5. 辅助方法二、L

Python使用FFmpeg实现高效音频格式转换工具

《Python使用FFmpeg实现高效音频格式转换工具》在数字音频处理领域,音频格式转换是一项基础但至关重要的功能,本文主要为大家介绍了Python如何使用FFmpeg实现强大功能的图形化音频转换工具... 目录概述功能详解软件效果展示主界面布局转换过程截图完成提示开发步骤详解1. 环境准备2. 项目功能结

使用C#删除Excel表格中的重复行数据的代码详解

《使用C#删除Excel表格中的重复行数据的代码详解》重复行是指在Excel表格中完全相同的多行数据,删除这些重复行至关重要,因为它们不仅会干扰数据分析,还可能导致错误的决策和结论,所以本文给大家介绍... 目录简介使用工具C# 删除Excel工作表中的重复行语法工作原理实现代码C# 删除指定Excel单元