c# image转bitmap出现错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c# image转bitmap出现错误相关的知识,希望对你有一定的参考价值。

我想从文件中读取一张图片,然后将它转化为bitmap类型,但是显示bitmap 里面宽和高都为0,还有一个result包含读取的image信息 显示的错误是不能将System.Drawing.Image转化为interaction.Bitmap,interaction是命名空间 这是代码:string path = @"C:\Users\olivier\Desktop\image\1.jpg";Image pic = Image.FromFile(path); Bitmap bit = new Bitmap(pic);小弟菜鸟一枚,求救大虾们

软糖来回答把。

能够读取出image的图片都可以转化为bitmap的:

使用GDI+绘制到新的bitmap上去就好了。

using System.Drawing;

Image pic = Image.FromFile(path);
Bitmap bit = new Bitmap(pic.Width, pic.Height);
Graphics g = Graphics.FromImage(bit);
g.DrawImage(pic, 0, 0);
g.Dispose();

这个肯定支持jpg文件的,你可以拿去试试。

参考技术A interaction.Bitmap 这个类是你自己写的吗?
单纯转换成BMP的话, 用System.Drawing.Bitmap就行了追问

interaction是命名空间,直接强制转换的话就这样了

追答

不是, 改成这样:

var bit = new System.Drawing.Bitmap(pic);

参考技术B 无法复现。

理论上如果有二义性的话会直接报错的追问

无法复现是什么意思啊,我直接转换就出现了这种情况,interaction是命名空间,怎么办啊大佬

追答

就是can not reproduce

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;
            }
        }  

 

以上是关于c# image转bitmap出现错误的主要内容,如果未能解决你的问题,请参考以下文章

C# bitmap保存时GDI+出现一般性错误?

玩游戏出现bitmap image is not valid如何解决

从 VB 转换为 C#:bitmap.save() 参数错误

将C#的bitmap格式转换为Halcon的图像格式

全网首发:C#中Form设置$this.Icon,任务栏图标错误的解决办法(bitmap转icon)

Android yuv转Bitmap