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(0, 0, 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, 0, iptr, width * height * 3);

                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[15];
        private int m_nCurrBitmapIdx = -1;
        public Bitmap ToColorBitmap2(byte[] rawValues, int width, int height)
        {
            // 申请目标位图的变量,并将其内存区域锁定
            //初始化Bitmap数组
            if (m_bFrmSizeChange || m_nCurrBitmapIdx < 0)
            {
                for (int i = 0; i < 15; i++)
                {
                    m_pBitmaps[i] = new Bitmap(width, height, PixelFormat.Format24bppRgb);
                }
                m_nCurrBitmapIdx = 0;
                m_bFrmSizeChange = false;
            }
            Bitmap bmp = m_pBitmaps[m_nCurrBitmapIdx];
            m_nCurrBitmapIdx++;
            if (m_nCurrBitmapIdx >= 15)
                m_nCurrBitmapIdx = 0;

            try
            {
                //Bitmap bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb);
                BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, 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, 0, iptr, width * height * 3);
                bmp.UnlockBits(bmpData);  // 解锁内存区域
                //// 算法到此结束,返回结果
                return bmp;
            }
            catch (System.Exception e)
            {
                //Tools.m_CreateLogTxt("ToColorBitmap2", e.ToString(), Index);
                return null;
            }
        }  
时间: 2024-10-12 04:53:44

C# byte数组转成Bitmap对象的相关文章

java的byte数组转换成在[0,255]范围内

C#的byte    是 0-255java的byte  是 -128-127  java的byte数组转换成在[0,255]范围内int data[]= new int[bytes.length];for(int i=0;i<bytes.length;i++) { data[i] = bytes[i] & 0xff;}

android开发:把一个byte数组转换成wav音频文件,并且播放

============问题描述============ 如题,byte数组转换成wav音频文件,并且播放,下面代码能生成data/data/com.example.playwav/cache/temp.wav 但是在播放的时候报异常. 我把代码和Log贴在下面了. 我分析,原因应该是wav文件格式的编解码问题,不能这么随随便便把任意的一个byte数组就转化为了wav 希望了解wav编解码开发的童鞋给点解决办法 byte[] a = { 52, 51, 48, 28, 58, 64, 98,-1

js将json数组转成tree对象

昨天遇到一道面试题,手写js将json数组转成tree对象,昨天写错了,今天特意想了下,思路其实挺简单,循环+递归,获取子节点对象. 1 let data = [ 2 {'parent_id': 0, 'id': 1, 'value': 'XXX'}, 3 {'parent_id': 1, 'id': 3, 'value': 'XXX'}, 4 {'parent_id': 4, 'id': 6, 'value': 'XXX'}, 5 {'parent_id': 3, 'id': 5, 'valu

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

2014-06-11 10:45:14   阅读375次 我们在JNI中处理得到的BMP图片Raw数据,我们应该如何转换为Bitmap呢? 由于得到的数据是unsigned char *类型的数据,而对于Bitmap的类来说,其类方法里面: 1 2 public static Bitmap createBitmap(int colors[], int offset, int stride,             int width, int height, Config config) 要求传

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

http://bbs.csdn.net/topics/20447859 byte[] bytes = new byte[256]; //receive some stream from network int a,b,c,d; string theStr; a = (int)bytes[0]; b = (int)bytes[1]; c = (int)bytes[2]; d = (int)bytes[3]; byte[] newBytes = byte[bytes.Length-4]; for( 

将Byte数组保存成24位BMP

直接上源代码: #include "stdafx.h" #include <iostream> #include <windows.h> using namespace std; class CSaveByteToBmp { public: bool SaveDIB2Bmp(int fileNum, const CString& BMPFileName, int iWidth, int iHeight, BYTE *pBuffer); void Cons

[C#参考]byte数组和Image的相互转换

功能需求 1.把一张图片(png bmp jpeg bmp gif)转换为byte数组在内存中操作. 2.把内存中的byte数组转换成Image对象,赋值给相应的控件显示. 3.从图片byte数组得到对应的图片格式,生成一张图片保存到磁盘中. 这个的Image是System.Drawing.Image. //Get an image from file Image image = Image.FromFile("D:\\test.jpg"); Bitmap bitmap = new B

C# 对象、文件与二进制串(byte数组)之间的转换

1.关于本文 在使用C#下的TCP(类TcpClient).UDP(类UdpClient)协议传输信息时,都需要将信息转换为byte类型的数组进行发送.本文实现了两种object与byte数组的转换和一种文件与byte数组转换的方式.基础类型的数据,可以用BitConverter类中的函数进行转换. 2.object与byte[]的相互转换:使用IFormatter的Serialize和Deserialize进行序列化与反序列化 实现这个功能,需要先引用三个命名空间:System.IO.Syst

可序列化对象和byte[]数组之间的互转

/// <summary> /// 将可序列化对象转成Byte数组 /// </summary> /// <param name="obj">对象(对象不能为空)</param> /// <returns>返回相关数组</returns> protected static byte[] ObjectToByteArray<T>(T obj) where T : ISerializable { if (o