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

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/19822.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI之下 360让PC商业生态大象起舞

时隔7年&#xff0c;淘宝PC版在前不久迎来重磅升级&#xff0c;在产品体验、商品供给、内容供给等方面做了全面优化&#xff0c;以全面提升PC端的用户体验&#xff1b;当大家都以为移动互联网时代下APP将成为主流时&#xff0c;PC端却又成为了香饽饽。其实PC端被重视&#xff0…

3389,为了保障3389端口的安全,我们可以采取的措施

3389端口&#xff0c;作为远程桌面协议&#xff08;RDP&#xff09;的默认端口&#xff0c;广泛应用于Windows操作系统中&#xff0c;以实现远程管理和控制功能。然而&#xff0c;正因为其广泛使用&#xff0c;3389端口也成为许多潜在安全威胁的入口。因此&#xff0c;确保3389…

go 针对 time类型字段,前端查询,后端返回数据格式为UTC时间

测试代码 package mainimport ("context""log""net/http""time""github.com/gin-gonic/gin""go.mongodb.org/mongo-driver/bson""go.mongodb.org/mongo-driver/bson/primitive""go.mongodb.org/m…

鸿蒙ArkTS声明式开发:跨平台支持列表【显隐控制】 通用属性

显隐控制 控制组件是否可见。 说明&#xff1a; 开发前请熟悉鸿蒙开发指导文档&#xff1a; gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本…

docker部署owncloud进行管理

目录 一.拉取镜像 1.使用mysql和owncloud最新版镜像&#xff0c;构建个人网盘 2.查看是否已经正确监听端口 二.使用浏览器进行测试 1.使用IP:8080进行访问&#xff0c;用admin运行容器时设置的密码登录 2.查看到已经有的文件 3.文件上传对应的位置 4.在web页面进行简单…

liunx文件系统与日志分析

文章目录 一、基本概念二、日志分析三、实验 一、基本概念 文件是存储在硬盘上的&#xff0c;硬盘上的最小存储单位是扇区每个扇区大小事512字节 inode&#xff1a;元信息&#xff08;文件的属性 权限 创建者 创建日期&#xff09; block&#xff1a;块 连续八个扇区组成一块…

[RK3588-Android12] 关于BQ25703充电IC+CW2017电量计调试

问题描述 BQ25703充电ICCW2017电量计调试 解决方案&#xff1a; 附上dts配置文件 &i2c6 {clock-frequency <400000>;status "okay";// CONFIG_BATTERY_CW2017cw2017: cw201763 {status "okay";compatible "cellwise,cw2017";re…

【MySQL精通之路】全文搜索功能

1.自然语言全文搜索 【MySQL精通之路】全文搜索-自然语言全文搜索-CSDN博客 2.布尔型全文搜索 【MySQL精通之路】全文搜索-布尔型全文搜索_match()against()-CSDN博客 3.带查询扩展的全文搜索 【MySQL精通之路】全文搜索(3)-带查询扩展的全文搜索-CSDN博客 4.全文停止字 …

Java操作Excel文档进行读取和写入

目录 读出Excel文档 写入Excel文档 读出Excel文档 使用EasyExcel读取Excel文件: 需要在maven项目中导入EasyExcel依赖 <!-- EasyExcel依赖包 --> <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><v…

长难句打卡5.31

In a workplace that’s fundamentally indifferent to your life and its meaning, office speak can help you figure out how you relate to your work—and how your work defines who you are. 在一个对你的生活和生活意义漠不关心的工作场所中&#xff0c;办公室语言可以…

低代码:全生命周期管理的技术革新与应用实践

在数字化浪潮汹涌的今天&#xff0c;企业对于快速响应市场变化、优化业务流程和提升工作效率的需求日益迫切。低代码技术的出现&#xff0c;为企业提供了一种全新的解决方案&#xff0c;使得开发者能够以前所未有的速度和效率构建应用。本文将深入探讨低代码技术在全生命周期管…

揭秘蓝牙AOA定位系统:精准定位,开启智能导航新时代

随着科技的飞速发展&#xff0c;人们对于定位技术的需求也日益增长。在众多定位技术中&#xff0c;蓝牙AOA定位系统以其高精度、低通信开销的特点&#xff0c;逐渐受到广泛关注。接下来给大家简单介绍一下关于蓝牙AOA定位系统的原理、优势及应用场景&#xff0c;带大家领略其带…

情感读本期刊万方收录综合期刊投稿

《情感读本》杂志是由国家新闻出版总署批准&#xff0c;湖北省新闻出版广电局主管&#xff0c;湖北省期刊协会主办的正规综合类期刊。《情感读本》是一本以推动和发展情感教育、素质教育、人文教育为己任&#xff0c;奉行“立足教育&#xff0c;服务社会”的办刊宗旨&#xff0…

Jmeter性能测试-【关联,提取器】

新知识点 关联&#xff1a; 正则表达式提取器 边界提取器 XPath提取器 JSON提取器 梳理框架 1. Jmeter基础 定义&#xff1a;Jmeter是一个开源的性能测试工具&#xff0c;主要用于Web应用和各种服务的性能测试。 主要功能&#xff1a;可以模拟多用户并发访问&#xff0c;测…

Vue3兼容低版本浏览器(ie11,chrome63)

1、插件安装 为了使你的项目兼容 Chrome 63&#xff0c;你需要确保包含适当的 polyfills 和插件配置。你已经在使用 legacy 插件&#xff0c;但在代码中可能缺少一些配置或插件顺序有问题。以下是几个可能的改进&#xff1a; 安装 vitejs/plugin-legacy 插件&#xff1a; 确保…

(2024,Video2Game,NeRF,Mesh,物理模块,游戏引擎)通过单个视频实现实时、交互、逼真且兼容浏览器的环境

Video2Game: Real-time, Interactive, Realistic and Browser-Compatible Environment from a Single Video 公众号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 2. 相关工作 3. Video…

Android 复习string.xml中的替换符

\n 转行 \ 转义符,string.xml中不能单独使用 符号,必须添加转移符 \t 空格 %1$s $s代表期望一个字符串替换内容,%1代表参数顺序 (String firstName "Alice"; String lastName "Smith"; Strin…

Mysql基础教程(12):JOIN

MySQL JOIN 在 MySQL 中&#xff0c;JOIN 语句用于将数据库中的两个表或者多个表组合起来。 比如在一个学校系统中&#xff0c;有一个学生信息表和一个学生成绩表。这两个表通过学生 ID 字段关联起来。当我们要查询学生的成绩的时候&#xff0c;就需要连接两个表以查询学生信…

绿色积分合法化 时代牺牲品!云联惠

各位朋友&#xff0c;我是吴军&#xff0c;在科技产业界从事多年市场分析工作。今天&#xff0c;我想与你们共同探讨一个曾引起广泛关注的企业案例——云联惠。 云联惠&#xff0c;这个曾被誉为商业创新典范的平台&#xff0c;一度风光无限。在其鼎盛时期&#xff0c;它不仅吸引…

每日一题——Java编程练习题

题目&#xff1a; 键盘录入两个数字number1和number2表示一个范围&#xff0c;求这个范围之内的数字和。 我写的代码&#xff1a; public class Test {public static void main(String[] args) {Scanner sc new Scanner(System.in);System.out.print("输入第一个数:&q…