C#由指定数据生成灰度位图或者彩色位图
如果有一组图像数据保存在一维数组中,如下所示,图像数据保存在一维数组ImageData中,现在想要这组数据创建一幅灰度图像或者彩色图像,那该如何创建呢?不急,请往下看。
//图像数据byte[] ImageData = new byte[8 * 3 * 20]{100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0};
1. 用ImageData创建一幅灰度图像,代码如下(StartDraw_Click为工程中按钮的点击事件):
private void StartDraw_Click(object sender, EventArgs e){//图像数据byte[] ImageData = new byte[8 * 3 * 20]{100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0};//确保图像的宽度是4的倍数int imageWidth = 24;int imageHeight = 20;//数组转换为IntptrIntPtr pData = Marshal.AllocHGlobal(imageWidth * imageHeight);Marshal.Copy(ImageData, 0, pData, imageWidth * imageHeight);//创建灰度位图Bitmap bmp = new Bitmap(imageWidth, imageHeight, imageWidth, PixelFormat.Format8bppIndexed, pData);//修改位图的调色板ColorPalette palette = bmp.Palette;for (int i = 0; i < 256; i++){palette.Entries[i] = Color.FromArgb(i, i, i);}bmp.Palette = palette;//显示Graphics dc = pictureBox1.CreateGraphics();dc.Clear(Color.White);dc.DrawImage(bmp, 0, 0, imageWidth * 10, imageHeight * 10);}}
代码中,用创建位图时用的是Bitmap的“Bitmap(int width, int height, int stride, PixelFormat format, IntPtr scan0)”构造函数。该构造函数可以用指定的大小、指定的图像格式和指定的数据初始化Bitmap类。
其中:
width表示位图的宽度;
height表示位图的高度;
stribe表示指定相邻扫描行开始处之间字节偏移量的整数。这通常是以像素的位数乘以位图的宽度。传递给此参数的值必须为4 的倍数。;
format值为Format8bppIndexed,表示创建每像素为8位的索引图像,颜色表中有256中颜色;
scan0为包含像素数据的指针。
由于Format8bppIndexed表示创建的是索引图像,所以我们需要修改调色板,为图像中每一位数据提供索引。
生成的灰度图像,在窗体上显示如下,由于图像比较小,所以在绘制时长宽都放大至10倍:
2. 用ImageData创建一幅彩色位图图像,代码如下:
private void StartDraw_Click(object sender, EventArgs e){//图像数据byte[] ImageData = new byte[8 * 3 * 20]{100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0, 100,100,0, 0,0,0, 100,0,100, 0,0,0, 0,100,100, 0,0,0, 100,100,100, 0,0,0};//确保图像的宽度是4的倍数int imageWidth = 8;int imageHeight = 20;//数组转换为IntptrIntPtr pData = Marshal.AllocHGlobal(imageWidth * imageHeight * 3);Marshal.Copy(ImageData, 0, pData, imageWidth * imageHeight * 3);Bitmap bmp = new Bitmap(imageWidth, imageHeight, imageWidth * 3, PixelFormat.Format24bppRgb, pData);//显示,长宽各拉伸至10倍显示Graphics dc = pictureBox1.CreateGraphics();dc.Clear(Color.White);dc.DrawImage(bmp, 0, 0, imageWidth * 10, imageHeight * 10);}}
创建24位彩色图像时,由于每个像素的三个分量R、G、B已经表示了当前像素的颜色,所以不需要调色板。
生成的灰度图像,放大显示如下:
C#由指定数据生成灰度位图或者彩色位图相关推荐
- 使用阿富汗和巴基斯坦地区的SRTM数据生成山体阴影和彩色地形图
使用阿富汗和巴基斯坦地区的SRTM数据生成山体阴影和彩色地形图 数据来自GIST,工具来自GDAL 原文地址:http://developmentseed.org/blog/2009/jul/30/u ...
- pandas使用extract函数根据正则表达式从dataframe指定数据列的字符串中抽取出数字并生成新的数据列(extract numbers from column)
pandas使用extract函数根据正则表达式从dataframe指定数据列的字符串中抽取出数字并生成新的数据列(extract numbers from column and generate n ...
- Python 自动化:根据模板批量生成含指定数据的 word 文档
作者:一只河马h 来源:简说Python 一.需求说明 在平时工作当中,经常需要处理文件,特别是Word,处理Word时会遇一类比较常见的场景:文档中大部分文字固定不变,小部分内容需要修改. 这时我们 ...
- Python自动化:根据模板批量生成含指定数据的word文档
一.需求说明 在平时工作当中,经常需要处理文件,特别是Word,处理Word时会遇一类比较常见的场景:文档中大部分文字固定不变,小部分内容需要修改. 这时我们会机械的重复打开.修改.保存文档等一系列操 ...
- python笔记2:指定概率生成数据
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 python笔记2:指定概率生成数据 一.random指定范围随机生成数 1. *random.choice()在指定数据集内生成随机 ...
- 【matlab专题】脚本(3)DBC--EXCEL--模型:通过表格数据生成指定的模型(二)
前言 这个是通过表格数据生成模型接口的函数,缩减了在平常建模时繁琐的复制,可以参考使用, 首先: 在第一章提到的DBC–EXCEL中生成的最后作品" 接下来的函数就是通过上图信息将其生成模型 ...
- R语言使用seq函数生成数据序列、seq函数在指定范围内生成固定长度的序列、指定数据序列的第一个数值、最后一个数值以及另外一个数据序列(along.with)
R语言使用seq函数生成数据序列.seq函数在指定范围内生成固定长度的序列.指定数据序列的第一个数值.最后一个数值以及另外一个数据序列(along.with) 目录
- Python 使用netCDF4读写nc文件以及截取指定经纬度范围内的数据生成新的nc文件
Python 使用netCDF4读写nc文件以及截取nc文件经纬度范围内的数据 简单介绍nc文件的读写操作,以及实现输入nc文件和坐标范围,输出一个新的nc文件的功能 环境 python3.8.13 ...
- 利用PCL库从点云数据生成深度图像及关键点提取
利用PCL库从点云数据生成生成深度图像及关键点提取 利用PCL库从点云数据生成深度图像及关键点提取 本想利用标准点云数据库分割成若干块,利用标准点云数据生成深度图像作为数据库用来验证算法,目前效果不是 ...
最新文章
- 大数据工作的正确打开姿势
- Linux diff命令
- socket多线程方式案例
- 尴尬了!“中国版ins”绿洲 logo涉嫌抄袭,确认已下架
- 6、raid、lvm、while、until 学习笔记
- EXCEL 趋势图生成的公式应用说明
- 航天器轨迹预测——根据速度和位置确定初轨
- 万兆网络传输速度测试_Intel万兆网卡的真实测试万兆速度的方法13718565365
- 车载网络基础——预备篇
- 【MySQL】数据库表操作
- java毕业设计KTV点歌系统mybatis+源码+调试部署+系统+数据库+lw
- 多周期CPU设计(verilog)
- centos下载安装软件总结
- Linux下的进程PCB以及线程详解
- 自己动手丰衣足食,撸一个flutterApp
- win10 无法连接打印机 报0x00000520错误解决办法!
- STM32 nokia 5110应用
- PHP连接.mdb文件
- 如何远程控制Android手机,为所欲为?
- EPC电子标签的一些基本知识
热门文章
- python3调用企业微信api!开发一款属于自己的企业微信
- opencv python 人脸识别 相似度_OpenCV+Tensorflow实现实时人脸识别演示
- python 分割不等长字符串表格_Python字符串---固定长度分割字符串
- Linux下怎么编译并运行C程序
- 手机usb口连接不上计算机,为什么手机USB连接不上电脑
- HttpMessageNotWritableException: No converter found for return value of type,可能出现的原因及解决方法
- 瑞星木马防御专杀QQ,360,百度软件管家(见图为证!) 1
- 个人微信开发API协议接口
- IDEA的主题样式20种
- iOS- JSPatch 热更新