C# byte数组转成Bitmap对象
方法一:
/// <summary>
/// 将数组转换成彩色图片
/// </summary>
/// <param name="rawValues">图像的byte数组</param>
/// <param name="width">图像的宽</param>
/// <param name="height">图像的高</param>
/// <returns>Bitmap对象</returns>
public Bitmap ToColorBitmap(byte[] rawValues, int width, int height)
{
//// 申请目标位图的变量,并将其内存区域锁定
try
{
if (width != oldPicWidth || height != oldPicHeight)//如果图像尺寸发生变化,则需要重新new一下Bitmap对象
{
if (m_currBitmap != null)
m_currBitmap = null; m_currBitmap = new Bitmap(width, height, PixelFormat.Format24bppRgb);
m_rect = new Rectangle(, , width, height);
m_bitmapData = m_currBitmap.LockBits(m_rect, ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb); } IntPtr iptr = m_bitmapData.Scan0; // 获取bmpData的内存起始位置 //// 用Marshal的Copy方法,将刚才得到的内存字节数组复制到BitmapData中
System.Runtime.InteropServices.Marshal.Copy(rawValues, , iptr, width * height * ); if (width != oldPicWidth || height != oldPicHeight)
{
m_currBitmap.UnlockBits(m_bitmapData);
oldPicWidth = width;
oldPicHeight = height;
} //// 算法到此结束,返回结果 return m_currBitmap;
}
catch (System.Exception ex)
{
return null;
}
}
上述方法有个问题,如果是从在线视频流中取数据,如果在短时间内,多次调用此方法,则会抛GDI+异常,或者提示Bitmap对象被占用。为了解决这个问题,后来想到了用Bitmap数组来解决。
方法如下
方法二:
private Bitmap[] m_pBitmaps = new Bitmap[];
private int m_nCurrBitmapIdx = -;
public Bitmap ToColorBitmap2(byte[] rawValues, int width, int height)
{
// 申请目标位图的变量,并将其内存区域锁定
//初始化Bitmap数组
if (m_bFrmSizeChange || m_nCurrBitmapIdx < )
{
for (int i = ; i < ; i++)
{
m_pBitmaps[i] = new Bitmap(width, height, PixelFormat.Format24bppRgb);
}
m_nCurrBitmapIdx = ;
m_bFrmSizeChange = false;
}
Bitmap bmp = m_pBitmaps[m_nCurrBitmapIdx];
m_nCurrBitmapIdx++;
if (m_nCurrBitmapIdx >= )
m_nCurrBitmapIdx = ; try
{
//Bitmap bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb);
BitmapData bmpData = bmp.LockBits(new Rectangle(, , width, height), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb); //// 获取图像参数
//int stride = bmpData.Stride; // 扫描线的宽度
IntPtr iptr = bmpData.Scan0; // 获取bmpData的内存起始位置
//int scanBytes = stride * height;// 用stride宽度,表示这是内存区域的大小 //// 用Marshal的Copy方法,将刚才得到的内存字节数组复制到BitmapData中
System.Runtime.InteropServices.Marshal.Copy(rawValues, , iptr, width * height * );
bmp.UnlockBits(bmpData); // 解锁内存区域
//// 算法到此结束,返回结果
return bmp;
}
catch (System.Exception e)
{
//Tools.m_CreateLogTxt("ToColorBitmap2", e.ToString(), Index);
return null;
}
}
C# byte数组转成Bitmap对象的更多相关文章
- 获取网络图片并显示在picturbox上,byte[]数组转换成Image:
private void getWebPicture_Click(object sender, EventArgs e) { WebRequest request = WebRequest.Creat ...
- 将一个读取流转换成bitmap对象
将一个读取流转换成bitmap对象: BitmapFactory:可以将文件,读取流,字节数组转换成一个Bitmap对象. Bitmap bitmap = Bitma ...
- Android中如何将Bitmap byte裸数据转换成Bitmap图片int数据
Android中如何将Bitmap byte裸数据转换成Bitmap图片int数据 2014-06-11 10:45:14 阅读375次 我们在JNI中处理得到的BMP图片Raw数据,我们应该如何 ...
- c# 将byte数组保存成图片
将byte数组保存成图片: 方式一:System.IO.File.WriteAllBytes(@"c:\test.jpg", bytes); 方式二:MemoryStream ms ...
- JAVA中将byte[]数组转成16进制字符串
方法一: /** * byte数组转化为16进制字符串 * @param bytes * @return */ public static String byteToHexString(byte[] ...
- js 一维数组转成tree 对象
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- C# byte数组转换成List<String>
byte[] bys=buffer; string[] AllDataList= Encoding.Default.GetString(bys).Split(Environment.NewLine. ...
- C#中如何把byte[]数组转换成其他类型
http://bbs.csdn.net/topics/20447859 byte[] bytes = new byte[256]; //receive some stream from network ...
- 基于List数组转换成tree对象
package com.shjysoft.yunxi.sync.webservice; import java.util.ArrayList;import java.util.Date;import ...
随机推荐
- 4.微信小程序-B站:先把首页造出来
(小安娜:失踪人口已上线,大家快来喷喷喷他!),sorry++,最近身边发生太多事情,导致这最关键的实战开篇都未写,(小安娜-分身1:懒就是懒,不负责任,我之前学的都忘了),(小安娜-分身2:上一篇双 ...
- spring cloud 基本小结
Spring cloud系列十四 分布式链路监控Spring Cloud Sleuth https://blog.csdn.net/hry2015/article/details/78905489 S ...
- Reverse Nodes In K Group,将链表每k个元素为一组进行反转---特例Swap Nodes in Pairs,成对儿反转
问题描述:1->2->3->4,假设k=2进行反转,得到2->1->4->3:k=3进行反转,得到3->2->1->4 算法思想:基本操作就是链表 ...
- scala学习手记33 - 使用trait进行装饰
在上一节看到了scala的在实例一级的选择性混入就不得不感叹scala在语法上的扩展性.就通过这样一个特性scala简化了很多在java中的编程概念和设计模式. 比如说在java中常用的组合,以及装饰 ...
- java之字符串中查找字串的常见方法
1.int indexOf(String str) :返回第一次出现的指定子字符串在此字符串中的索引. int indexOf(String str, int startIndex):从指定 ...
- 【2018年全国多校算法寒假训练营练习比赛(第四场)-D】小明的挖矿之旅
题目链接:https://www.nowcoder.com/acm/contest/76/D 做题时没注意到“无论出现在哪个格子”..题中也没说明一个格子只能经过一次,其实没有想象的复杂. 判断如果点 ...
- 【专题】区间dp
1.[nyoj737]石子合并 传送门:点击打开链接 描述 有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这 ...
- requests beautifulsoup
requests Python标准库中提供了:urllib.urllib2.httplib等模块以供Http请求,但是,它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工作, ...
- python django框架(一)
s4day63内容回顾: 1. 安装 2. 创建用户 + 授权 3. 连接 - 数据库 终端创建数据库(字符编码) - 数据表 终端 ORM pymysql create ...)engine=inn ...
- LeetCode OJ:Set Matrix Zeroes(设置矩阵0元素)
Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. 这题要注意的 ...