参数无效 - 从字节到位图

时间:2014-06-02 06:54:57

标签: c# bitmap

我有一个字节数组,其中数组的大小为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;    
  }

但异常仍然存在。有什么想法吗?

4 个答案:

答案 0 :(得分:1)

如果不知道位图的WidthHeight,我认为你无法做到这一点。

长度为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;
    }