方法一:

        /// <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对象的更多相关文章

  1. 获取网络图片并显示在picturbox上,byte[]数组转换成Image:

    private void getWebPicture_Click(object sender, EventArgs e) { WebRequest request = WebRequest.Creat ...

  2. 将一个读取流转换成bitmap对象

     将一个读取流转换成bitmap对象:         BitmapFactory:可以将文件,读取流,字节数组转换成一个Bitmap对象.         Bitmap bitmap = Bitma ...

  3. Android中如何将Bitmap byte裸数据转换成Bitmap图片int数据

    Android中如何将Bitmap byte裸数据转换成Bitmap图片int数据 2014-06-11 10:45:14   阅读375次 我们在JNI中处理得到的BMP图片Raw数据,我们应该如何 ...

  4. c# 将byte数组保存成图片

    将byte数组保存成图片: 方式一:System.IO.File.WriteAllBytes(@"c:\test.jpg", bytes); 方式二:MemoryStream ms ...

  5. JAVA中将byte[]数组转成16进制字符串

    方法一: /** * byte数组转化为16进制字符串 * @param bytes * @return */ public static String byteToHexString(byte[] ...

  6. js 一维数组转成tree 对象

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  7. C# byte数组转换成List<String>

    byte[] bys=buffer; string[] AllDataList=  Encoding.Default.GetString(bys).Split(Environment.NewLine. ...

  8. C#中如何把byte[]数组转换成其他类型

    http://bbs.csdn.net/topics/20447859 byte[] bytes = new byte[256]; //receive some stream from network ...

  9. 基于List数组转换成tree对象

    package com.shjysoft.yunxi.sync.webservice; import java.util.ArrayList;import java.util.Date;import ...

随机推荐

  1. js 前台ajax验证马克一下

    function check_form(){ var email=$("#email").val(); var code=$("#code").val(); v ...

  2. DPDK l2fwd

    dpdk的l2fwd主要做二层转发,代码分析如下. #include <stdio.h> #include <stdlib.h> #include <string.h&g ...

  3. 深入理解SELECT ... LOCK IN SHARE MODE和SELECT ... FOR UPDATE

    概念和区别 SELECT ... LOCK IN SHARE MODE走的是IS锁(意向共享锁),即在符合条件的rows上都加了共享锁,这样的话,其他session可以读取这些记录,也可以继续添加IS ...

  4. bootstrap框架:常用内容一

    <!DOCTYPE html><html lang="zh-CN"> <head> <meta charset="utf-8&q ...

  5. 用纯css写一个常见的小三角形

    .test{ margin:50px auto; width: 0; height: 0; overflow: hidden; border-width: 10px; border-color: #0 ...

  6. IOS-将任意对象存进数据库

    model // // HMShop.h // 将任意对象存进数据库 // // Created by apple on 14/11/20. // Copyright (c) 2014年 heima. ...

  7. python协程函数应用 列表生成式 生成器表达式

    协程函数应用 列表生成式 生成器表达式   一.知识点整理: 1.可迭代的:对象下有_iter_方法的都是可迭代的对象 迭代器:对象._iter_()得到的结果就是迭代器 迭代器的特性: 迭代器._n ...

  8. 27-THREE.JS 平面

    <!DOCTYPE html> <html> <head> <title></title> <script src="htt ...

  9. 006——VUE中的内容与属性中使用javascript表达式的方法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. [JS学习笔记]Event对象

    写在前面 学习和总结JS时会伴随性的生成一些dome,其中包含一些动态输出的结果和标注. 之前通过鸡贼的办法实现了在博客中执行JS,但很多时候需要一张干净的页面编写dome,所以尝试通过一些在线的JS ...