如果有一组图像数据保存在一维数组中,如下所示,图像数据保存在一维数组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#由指定数据生成灰度位图或者彩色位图相关推荐

  1. 使用阿富汗和巴基斯坦地区的SRTM数据生成山体阴影和彩色地形图

    使用阿富汗和巴基斯坦地区的SRTM数据生成山体阴影和彩色地形图 数据来自GIST,工具来自GDAL 原文地址:http://developmentseed.org/blog/2009/jul/30/u ...

  2. pandas使用extract函数根据正则表达式从dataframe指定数据列的字符串中抽取出数字并生成新的数据列(extract numbers from column)

    pandas使用extract函数根据正则表达式从dataframe指定数据列的字符串中抽取出数字并生成新的数据列(extract numbers from column and generate n ...

  3. Python 自动化:根据模板批量生成含指定数据的 word 文档

    作者:一只河马h 来源:简说Python 一.需求说明 在平时工作当中,经常需要处理文件,特别是Word,处理Word时会遇一类比较常见的场景:文档中大部分文字固定不变,小部分内容需要修改. 这时我们 ...

  4. Python自动化:根据模板批量生成含指定数据的word文档

    一.需求说明 在平时工作当中,经常需要处理文件,特别是Word,处理Word时会遇一类比较常见的场景:文档中大部分文字固定不变,小部分内容需要修改. 这时我们会机械的重复打开.修改.保存文档等一系列操 ...

  5. python笔记2:指定概率生成数据

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 python笔记2:指定概率生成数据 一.random指定范围随机生成数 1. *random.choice()在指定数据集内生成随机 ...

  6. 【matlab专题】脚本(3)DBC--EXCEL--模型:通过表格数据生成指定的模型(二)

    前言 这个是通过表格数据生成模型接口的函数,缩减了在平常建模时繁琐的复制,可以参考使用, 首先: 在第一章提到的DBC–EXCEL中生成的最后作品" 接下来的函数就是通过上图信息将其生成模型 ...

  7. R语言使用seq函数生成数据序列、seq函数在指定范围内生成固定长度的序列、指定数据序列的第一个数值、最后一个数值以及另外一个数据序列(along.with)

    R语言使用seq函数生成数据序列.seq函数在指定范围内生成固定长度的序列.指定数据序列的第一个数值.最后一个数值以及另外一个数据序列(along.with) 目录

  8. Python 使用netCDF4读写nc文件以及截取指定经纬度范围内的数据生成新的nc文件

    Python 使用netCDF4读写nc文件以及截取nc文件经纬度范围内的数据 简单介绍nc文件的读写操作,以及实现输入nc文件和坐标范围,输出一个新的nc文件的功能 环境 python3.8.13 ...

  9. 利用PCL库从点云数据生成深度图像及关键点提取

    利用PCL库从点云数据生成生成深度图像及关键点提取 利用PCL库从点云数据生成深度图像及关键点提取 本想利用标准点云数据库分割成若干块,利用标准点云数据生成深度图像作为数据库用来验证算法,目前效果不是 ...

最新文章

  1. 大数据工作的正确打开姿势
  2. Linux diff命令
  3. socket多线程方式案例
  4. 尴尬了!“中国版ins”绿洲 logo涉嫌抄袭,确认已下架
  5. 6、raid、lvm、while、until 学习笔记
  6. EXCEL 趋势图生成的公式应用说明
  7. 航天器轨迹预测——根据速度和位置确定初轨
  8. 万兆网络传输速度测试_Intel万兆网卡的真实测试万兆速度的方法13718565365
  9. 车载网络基础——预备篇
  10. 【MySQL】数据库表操作
  11. java毕业设计KTV点歌系统mybatis+源码+调试部署+系统+数据库+lw
  12. 多周期CPU设计(verilog)
  13. centos下载安装软件总结
  14. Linux下的进程PCB以及线程详解
  15. 自己动手丰衣足食,撸一个flutterApp
  16. win10 无法连接打印机 报0x00000520错误解决办法!
  17. STM32 nokia 5110应用
  18. PHP连接.mdb文件
  19. 如何远程控制Android手机,为所欲为?
  20. EPC电子标签的一些基本知识

热门文章

  1. python3调用企业微信api!开发一款属于自己的企业微信
  2. opencv python 人脸识别 相似度_OpenCV+Tensorflow实现实时人脸识别演示
  3. python 分割不等长字符串表格_Python字符串---固定长度分割字符串
  4. Linux下怎么编译并运行C程序
  5. 手机usb口连接不上计算机,为什么手机USB连接不上电脑
  6. HttpMessageNotWritableException: No converter found for return value of type,可能出现的原因及解决方法
  7. 瑞星木马防御专杀QQ,360,百度软件管家(见图为证!) 1
  8. 个人微信开发API协议接口
  9. IDEA的主题样式20种
  10. iOS- JSPatch 热更新