从流位图:漏洞? [英] Bitmap from Stream: Bug?

查看:304
本文介绍了从流位图:漏洞?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个pretty奇怪的错误。我需要缩小图像,缩小质量并转换为JPEG。这所有的作品,当我保存在磁盘上的文件,但是当我将它保存到一个Stream这是行不通的。

I have a pretty strange Error. I need to scale down images, scale down the quality and convert to JPEG. This all works when I save the File on disk, but it doesn't work when I save it to a Stream.

System.Drawing.Bitmap bitmap = // valid Bitmap from Disk
System.IO.Stream stream = new MemoryStream();

// JPEG Encoding

System.Drawing.Imaging.ImageCodecInfo jpgEncoder = GetEncoder( System.Drawing.Imaging.ImageFormat.Jpeg );
System.Drawing.Imaging.Encoder encoder2 = System.Drawing.Imaging.Encoder.Quality;
System.Drawing.Imaging.EncoderParameters parameters = new System.Drawing.Imaging.EncoderParameters( 1 );
System.Drawing.Imaging.EncoderParameter parameter = new System.Drawing.Imaging.EncoderParameter( encoder2, qualityLevel );
parameters.Param[0] = parameter;

// Save downscaled on Disk and stream

bitmap.Save( stream, jpgEncoder, parameters );
bitmap.Save( @"C:\TestJPEG.jpg", jpgEncoder, parameters );

// some stream stuff

var bytes = ((MemoryStream)stream).ToArray();
System.IO.Stream inputStream = new MemoryStream( bytes );

// Load from disk and stream

Bitmap fromDisk = new Bitmap( @"C:\TestJPEG.jpg" ); // works
Bitmap fromStream = new Bitmap( inputStream ); // crash invalid parameter no inner message or description
Bitmap fromStream2 = (Bitmap)Bitmap.FromStream( inputStream ); // same error here
// also crashes if I load the "stream" named Stream

我也可以打开画图转换后的文件。
有什么建议?

I can also open the converted file with Paint. Any suggestions?

编辑:
我在Windows 7专业版

I'm using .Net Framework 4.0 on Windows 7 Professional

EDIT2:
试图寻求的东西(答案被删除)

Tried that Seek thing (Answer was deleted)

stream.Seek( 0, SeekOrigin.Begin );

据workes与老流。但我需要从一个字节数组加载它。还是同样的崩溃

It workes with the "old" stream. But i need to load it from a byte Array. Still same crash

推荐答案

以下code为我工作:

The following code works for me:

var bitmap = new Bitmap(@"c:\Dokumente und Einstellungen\daniel.hilgarth\Desktop\Unbenannt.bmp");

ImageCodecInfo jpgEncoder = ImageCodecInfo.GetImageEncoders().Single(x => x.FormatDescription == "JPEG");
Encoder encoder2 = System.Drawing.Imaging.Encoder.Quality;
EncoderParameters parameters = new System.Drawing.Imaging.EncoderParameters( 1 );
EncoderParameter parameter = new EncoderParameter( encoder2, 50L );
parameters.Param[0] = parameter;

System.IO.Stream stream = new MemoryStream();
bitmap.Save( stream, jpgEncoder, parameters );
bitmap.Save(@"C:\Temp\TestJPEG.jpg", jpgEncoder, parameters);

var bytes = ((MemoryStream)stream).ToArray();
System.IO.Stream inputStream = new MemoryStream(bytes);
Bitmap fromDisk = new Bitmap(@"C:\Temp\TestJPEG.jpg");
Bitmap fromStream = new Bitmap(inputStream);

有你的code一些区别。哪一个会导致​​您的问题是给你找出来,我猜想:

There are a few differences to your code. Which one causes your problem is up to you to find out, I guess:


  • 我用 50L qualityLevel 。当使用 1 2 50 100 ,我得到了一个的ArgumentException 参数无效。因为我不知道能不能很好地将问题的类型或你的 qualityLevel 变量的值。

  • 我换成你的 GetEn codeR 方法。我不知道你的方法做究竟是什么,所以它可能是问题,但我对此表示怀疑。

  • I used 50L as qualityLevel. When using 1, 2, 50 or 100, I was getting an ArgumentException "Parameter is not valid". As I don't know the type or value of your qualityLevel variable that can very well be the problem.
  • I replaced your GetEncoder method. I don't know what your method does exactly, so it could be the problem, but I doubt it.

这篇关于从流位图:漏洞?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆