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出现错误的主要内容,如果未能解决你的问题,请参考以下文章
玩游戏出现bitmap image is not valid如何解决
从 VB 转换为 C#:bitmap.save() 参数错误