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 ...
随机推荐
- jquery的50个免费插件
说不定什么时候用到呢 http://www.admin10000.com/document/4711.html
- Eclipse工具栏上android的机器人小图标不见了
可以通过「Window」⇒「Customize Perspective」⇒「Tool Bar Visibility」Tab画面上选择Android SDK and AVD Manager来显示
- 使用Monkey对apk做稳定性测试
认识Monkey 官方文档:https://developer.android.com/studio/test/monkey.html 什么是Monkey? Monkey是Android中的一个命令行 ...
- git网站
https://backlog.com/git-tutorial/cn/ ------------------------------------------------------------- ...
- angular之 $watch 和$digest 和$apply和$observe的区别
$watch 代表的就是对数据源的监听,当数据源发生变化,就会触发第二个参数的回调函数 $digest 代表触发一个数据源变化的事件 $apply 代表对于$digest的一个封装,他多了一个参数 . ...
- 015——VUE中使用key唯一令牌解决表单值混乱问题
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- input type=file 怎么样调取用户手机照相机
input 有个属性accept="image/*" 这样就可以了,同时在网上看到了其他答案,试了下没啥效果.写记录下来 如下: 使用input:file标签, 去调用系统默认相机 ...
- LeetCode OJ:Compare Version Numbers(比较版本字符串)
Compare two version numbers version1 and version2.If version1 > version2 return 1, if version1 &l ...
- dataGridView的使用经验
1.dataGridView是dataGrid的替代品,包含了dataGrid的全部功能. 2.为dataGridView赋值,一般将其数据设置为一个DataTabel.例子如下: DataTable ...
- PostgreSQL日志配置记录
日志审计 审计是值记录用户的登陆退出以及登陆后在数据库里的行为操作,可以根据安全等级不一样设置不一样级别的审计, 此处涉及的参数文件有: logging_collector --是否开启日 ...