一、Byte[] 转 System.Drawing.Bitmap

public static Bitmap CreateBitmap(byte[] originalImageData, int originalWidth, int originalHeight)
{

//指定8位格式,即256色
Bitmap resultBitmap = new Bitmap(originalWidth, originalHeight, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
//将该位图存入内存中
MemoryStream curImageStream = new MemoryStream();
resultBitmap.Save(curImageStream, System.Drawing.Imaging.ImageFormat.Bmp);
curImageStream.Flush();
//由于位图数据需要DWORD对齐(4byte倍数),计算需要补位的个数
int curPadNum = ((originalWidth * 8 + 31) / 32 * 4) - originalWidth;
//最终生成的位图数据大小
int bitmapDataSize = ((originalWidth * 8 + 31) / 32 * 4) * originalHeight;
//数据部分相对文件开始偏移,具体可以参考位图文件格式
int dataOffset = ReadData(curImageStream, 10, 4);
//改变调色板,因为默认的调色板是32位彩色的,需要修改为256色的调色板
int paletteStart = 54;
int paletteEnd = dataOffset;
int color = 0;
for (int i = paletteStart; i < paletteEnd; i += 4)
{

byte[] tempColor = new byte[4];
tempColor[0] = (byte)color;
tempColor[1] = (byte)color;
tempColor[2] = (byte)color;
tempColor[3] = (byte)0;
color++;
curImageStream.Position = i;
curImageStream.Write(tempColor, 0, 4);

}
//最终生成的位图数据,以及大小,高度没有变,宽度需要调整
byte[] destImageData = new byte[bitmapDataSize];
int destWidth = originalWidth + curPadNum;
//生成最终的位图数据,注意的是,位图数据 从左到右,从下到上,所以需要颠倒
for (int originalRowIndex = originalHeight - 1; originalRowIndex >= 0; originalRowIndex--)
{
  int destRowIndex = originalHeight - originalRowIndex - 1;
  for (int dataIndex = 0; dataIndex < originalWidth; dataIndex++)
    {
      //同时还要注意,新的位图数据的宽度已经变化destWidth,否则会产生错位
      destImageData[destRowIndex * destWidth + dataIndex] = originalImageData[originalRowIndex * originalWidth + dataIndex];
      }

}

//将流的Position移到数据段
curImageStream.Position = dataOffset;
//将新位图数据写入内存中
curImageStream.Write(destImageData, 0, bitmapDataSize);
curImageStream.Flush();
//将内存中的位图写入Bitmap对象
resultBitmap = new Bitmap(curImageStream);
return resultBitmap;

}

public static int ReadData(MemoryStream curStream, int startPosition, int length)
{

int result = -1;
byte[] tempData = new byte[length];
curStream.Position = startPosition;
curStream.Read(tempData, 0, length);
result = BitConverter.ToInt32(tempData, 0);
return result;

}

  

  

转载于:https://www.cnblogs.com/alsofly/p/3373833.html

C# Image 、 byte[] 、Bitmap之间的转化相关推荐

  1. Java中byte[]与十六进制之间的转化

    Java中byte是占8位二进制,十六进制的数是用4位二进制来表示的.因此当byte转十六进制时,将byte的8位二进制,分为高4位和低4位并分别转化为相应的十六进制,再合到一起即可.当十六进制转by ...

  2. 软件的基本是要处理好”算法“及其基础(一)流-字-字符(包括某个数字、字母、符号和某个汉字等)-字符串-字节动态数组-字节-整数之间的转化关系和算法

    目录 软件的基本是要处理好"算法"及其基础(一): 流->计算机字->字符(包括某个数字.字母.符号和某个汉字等)->字符串->字节动态数组->字节- ...

  3. java对象与byte[]数组之间的相互转化,压缩解压缩操作

    下面介绍一下java对象之间和byte[]数组之间的相互转化.并对byte[]数据进行压缩操作.java对象转化为byte[]数组可用于redis中实现缓存.(这里暂不做介绍).话不多说直接开实例: ...

  4. 【SSH】——Hibernate三种状态之间的转化

    Hibernate的三种状态为:transient.persistent和detached.对这三种状态的理解可以结合Session缓存,在Session缓存中的状态为persistent,另外两种不 ...

  5. String和QString之间的转化----可避免出现中文乱码的现象

    String和QString之间的转化 经常因为QString和string的转化出现问题,而出现一些莫名其妙的错误. (适用于QT5) QString qstr; string str; str = ...

  6. java fastjson vector转为json_java对象与Json字符串之间的转化(fastjson)

    public class test { public static void main(string[] args) { // 实现java对象与json字符串之间的转化 // 1. person对象 ...

  7. python dataframe索引转成列_Pandas之DataFrame对象的列和索引之间的转化

    约定: import pandas as pd DataFrame对象的列和索引之间的转化 我们常常需要将DataFrame对象中的某列或某几列作为索引,或者将索引转化为对象的列.pandas提供了s ...

  8. java对象与Json字符串之间的转化(fastjson)

    1. 首先引入jar包 在pom.xml文件里加入下面依赖: <dependency><groupId>com.alibaba</groupId><artif ...

  9. 【四足机器人】学习笔记 欧拉角与旋转矩阵之间的转化关系

    [四足机器人]学习笔记 欧拉角与旋转矩阵之间的转化 一.基础旋转矩阵 二.组合旋转矩阵 在研究四足机器人站立姿态的时候,需要将通过IMU模块采集到的欧拉角数据信息转变为旋转矩阵R,关于如何将获取的欧拉 ...

最新文章

  1. 专接本微型计算机原理考试,河北省2009年专接本-微型计算机原理与汇编语言试卷...
  2. 4道Python基础字典练习题
  3. C++的类型萃取技术
  4. Java:多线程,CyclicBarrier同步器
  5. Basic INFO - InstallScript脚本编程的限制
  6. WEB安全基础-PHP相关
  7. java 更改css_求助java正则表达式问题,我现在想用java程序操作我本地的a.css文件,并且对此文件里边的代码做更改。...
  8. VMware ESXi/ESX 的内部版本号和版本 (2143832)-2020-10-27更新
  9. Java 反射 —— 运行时的类型信息
  10. “有没有考虑过手下人的死活?”:微信新员工怒怼高管,痛斥加班文化愤而离职...
  11. linux bash脚本 坑,向大家分享一个shell脚本的坑
  12. Ember.js 初学指南
  13. 图片文件怎么快速压缩?
  14. 又五年后回头再看我的程序员生涯
  15. python sqrt(4)*sqrt(9)_Python表达式sqrt(4)*sqrt(9)的值为__________。
  16. Java开发之路—Java反射机制
  17. python爬取网易云评论最多的歌_python爬取网易云音乐评论
  18. 根据中国时间求美国时间
  19. 华为早几年的服务器型号,云服务器一般用几年
  20. 【Android】程序包com.github.chrisbanes.photoview不存在

热门文章

  1. ASMSupport教程4.2
  2. ubuntu 下安装java6的源
  3. 手动排除fbiytty和vcxlcph病毒的干扰
  4. 关于 Visual stdio 编译报错:error MSB6006: “CL.exe”已退出
  5. UGUI 事件穿透规则
  6. Python为何能成为数据分析的主流工具?
  7. python安装pymssql
  8. IIS短文件/文件夹泄露漏洞
  9. 《淘宝店铺 大数据营销+SEO+爆款打造 一册通》一一2.2 实时直播抢占生意先机...
  10. Java HashMap的死循环问题