一、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. Eclipse NDK 配置,无需安装Cygwin
  2. WebAPI 2.x中如何扩展Identity Store
  3. 6-11数据库mysql初始
  4. cf飞刀制作源码_(飞刀)KDJ+W%R发出分析家源码
  5. 每天20分钟,只需一年,一年级学生英语听力达到六年级水平!关键是坚持一点都不难!
  6. 实例57:python
  7. Lucene-01 全文检索基本介绍
  8. 如何在Java中将InputStream读取/转换为String?
  9. 获取数据库链接Junit
  10. ASP.NET AJAX客户端编程之旅(一)——Hello!ASP.NET AJAX
  11. Android 简单登陆 涉及 Button CheckBox TextView EditText简单应用
  12. 阳光房行业现状调研及趋势分析报告
  13. 非线性求解器 Casadi (c++使用例子)
  14. (十三)office2016-excel提取出生年月
  15. 计算机系统维护与硬件检查,计算机硬件维护与检测方法
  16. 极智开发 | ubuntu 安装有线网卡驱动
  17. TypeError:‘bool’ oboject is not callable
  18. 动手实现一个docker引擎-1-从内核到docker的三驾马车
  19. HTML文件发到群里,如何在微信群里发可在线编辑的文档
  20. C#实现后台推送微信小程序订阅信息

热门文章

  1. cambridge official online course store
  2. how to balance between csdn and github?
  3. paper structure for innovation management
  4. sports at liverpool
  5. 如何安全的在不同工程间安全地迁移asset数据?三种方法
  6. InnoDB的ib_logfile写入策略
  7. Centos7安装防火墙firewall
  8. linux软件包管理之rpm 、yum基本使用
  9. Sencha-概念-Events(事件)(官网文档翻译10)
  10. window7自带的分区