我有一个字节数组,其中数组的大小为3104982 ~ 2.9 MB
。我想创建这个图像的位图,但我遇到了parameter is not valid - ArgumentException
我尝试了几种方法:
public static Bitmap ByteArrayToBitmap(byte[] blob)
{
using (var mStream = new MemoryStream())
{
mStream.Write(blob, 0, blob.Length);
mStream.Position = 0;
var bm = new Bitmap(mStream);
return bm;
}
}
和
public static Bitmap ByteArrayToBitmap(byte[] blob)
{
TypeConverter tc = TypeDescriptor.GetConverter(typeof(Bitmap));
Bitmap bitmap1 = (Bitmap) tc.ConvertFrom(blob);
return bitmap1;
}
但异常仍然存在。有什么想法吗?
答案 0 :(得分:1)
如果不知道位图的Width
和Height
,我认为你无法做到这一点。
长度为120000像素可能来自300x400位图或400x300或200x600或600x100或12000x10 ..
系统如何通过原始 ByteArray的长度来推断它?
还必须知道PixelFormat
(每个像素的颜色深度,数字和字节含义)才能创建位图。
你的ByteArray是如何创建的?
答案 1 :(得分:1)
如果byte[]
格式化数据,则:
return Image.FromStream(mStream);
如果您确定数据为Bitmap
,则可能希望将其转换为Bitmap
。
return (Bitmap)Image.FromStream(mStream);
答案 2 :(得分:1)
我已经使用控制台程序对它进行了测试,它对我来说没问题。
class Program
{
static void Main(string[] args)
{
const string fileName = @"H:\Stackoverflow\C#\20140601 - Question 1\Image\DSC_0004b.jpg";
//const string fileName = @"H:\Stackoverflow\C#\20140601 - Question 1\Image\Test.txt";
byte[] blob;
try
{
using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read))
{
blob = new byte[fs.Length];
fs.Read(blob, 0, (int)fs.Length);
}
Bitmap bitmap = ByteArrayToBitmap(blob);
Console.WriteLine("Height = {0}, Width = {1}", bitmap.Height, bitmap.Width);
}
catch (ArgumentException e)
{
Console.WriteLine(e.Message);
}
}
protected static Bitmap ByteArrayToBitmap(byte[] blob)
{
using (var mStream = new MemoryStream())
{
mStream.Write(blob, 0, blob.Length);
mStream.Position = 0;
var bm = new Bitmap(mStream);
return bm;
}
}
}
测试结果显示为:
Height = 3076, Width = 2104
Press any key to continue . . .
如果我使用文本文件而不是图像文件,那么它会在您描述时抛出ArgumentException。它显示:
Parameter is not valid.
Press any key to continue . . .
当我对其进行编码时,抛出异常的确切行是:
var bm = new Bitmap(mStream);
当您检查ArgumentException对象时,遗憾的是它中没有任何更多有用的信息。 (例如,参数名称会有所帮助。)
那么你是否可以在blob参数中输入无效数据?
您可能希望改进异常处理,以便提供更多信息。例如:
protected static Bitmap ByteArrayToBitmap(byte[] blob)
{
using (var mStream = new MemoryStream())
{
mStream.Write(blob, 0, blob.Length);
mStream.Position = 0;
try
{
var bm = new Bitmap(mStream);
return bm;
}
catch (Exception ex)
{
throw new ArgumentException("Not a valid bitmap.", "blob", ex);
}
}
}
答案 3 :(得分:0)
试试这个
public Bitmap changeByteToImage( Byte[] imagedata )
{
System.IO.MemoryStream ms=new System.IO.MemoryStream(imagedata);
Bitmap picdata=new Bitmap(Image.FromStream(ms));
return picdata;
}