参数为空异常:将位图保存到内存流中

3
我正在尝试将我的位图保存到MemoryStream中 - 这段代码有什么问题吗?为什么会得到参数空异常?
private void insertBarCodesToPDF(Bitmap barcode)
    {

            .......
            MemoryStream ms = new MemoryStream();
            barcode.Save(ms, System.Drawing.Imaging.ImageFormat.MemoryBmp); //<----
            byte [] qwe = ms.ToArray();
            .......

    }

更新:堆栈跟踪 在WordTest.FormTestWord.insertBarCodesToPDF(Bitmap barcode)方法中, System.Drawing.Image.Save(Stream stream, ImageCodecInfo encoder, EncoderParameters encoderParams)。


你应该在流中使用using(),同时尝试使用不同的图像格式并检查条形码变量。 - Sam
1
@Sam使用using()或不使用都没关系,异常总是会抛出。条形码变量不为空,有什么想法? - whizzzkey
能否展示一下内存流之前发生的情况? - Sam
1个回答

11
我相信你的问题与你尝试保存到MemoryStream的图像类型有关。根据这篇Code Project文章:Dynamically Generating Icons (safely),某些ImageFormat类型没有必要的编码器,无法使用Save函数将其保存为该类型。
我运行了以下代码以确定哪些类型可以工作,哪些不能:
System.Drawing.Bitmap b = new Bitmap(10, 10);
foreach (ImageFormat format in new ImageFormat[]{
          ImageFormat.Bmp, 
          ImageFormat.Emf, 
          ImageFormat.Exif, 
          ImageFormat.Gif, 
          ImageFormat.Icon, 
          ImageFormat.Jpeg, 
          ImageFormat.MemoryBmp,
          ImageFormat.Png,
          ImageFormat.Tiff, 
          ImageFormat.Wmf}) 
{
  Console.Write("Trying {0}:", format);
  MemoryStream ms = new MemoryStream();
  bool success = true;
  try 
  {
    b.Save(ms, format);
  }
  catch (Exception) 
  {
    success = false;
  }
  Console.WriteLine("\t{0}", (success ? "works" : "fails"));
}

这将得到以下结果:
Trying Bmp:       works
Trying Emf:       fails
Trying Exif:      fails
Trying Gif:       works
Trying Icon:      fails
Trying Jpeg:      works
Trying MemoryBMP: fails
Trying Png:       works
Trying Tiff:      works
Trying Wmf:       fails

有一篇微软知识库文章指出,某些ImageFormat类型是只读的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接