2014-09-22 110 views
2

在我的计划,我压缩BMP成JPEG这样的:JPEG压缩C#

private void ConvertBmpToStreamJPG30(Bitmap b, Stream s) 
{ 
    s.Flush(); 
    EncoderParameters encoderParameters = new EncoderParameters(1); 
    encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 30L); 
    b.Save(s, GetEncoder(ImageFormat.Jpeg), encoderParameters); 
} 

然后一个功能是接收JPEG在一个MemoryStream,我将其转化为一个位图做

Bitmap b = new Bitmap(stream); 

当我显示图像,有很多行是这样的:

Screenshot

我做错了什么,人?

编辑1 这里显示的问题小的Visual Studio解决方案:http://www.fast-files.com/getfile.aspx?file=79311

这是一个屏幕共享软件的开端。它的作用是:截取屏幕截图,比较它们,压缩差异并将其发送到解压缩它的程序的另一部分,并重新构造包含收到的所有内容的图像。它会打开一个窗口,显示左侧的“发送”和右侧的重新组合图像。

+1

看起来像损坏的数据流 - 请问JPEG在其他应用程序正常打开? – 2014-09-22 13:54:21

+1

你能制作一个简短但完整的程序来证明问题吗?如果你将流保存到磁盘,你能用explorer等打开它吗? – 2014-09-22 13:54:36

+0

Save()之前为什么刷新()? s的位置在流的开始处吗? – 2014-09-22 13:55:29

回答

0

三件事情浮现在脑海中:

  1. 尝试设置一个更好的质量比30,看看是否有帮助;
  2. 检查您的RAM(也可能是视频RAM,但我怀疑,GDI +可能会使用VGA压缩)硬件问题;
  3. 我已经有一个similar weird problem在哪里我加载了一些JPEG文件,修改了一下,然后再次保存。这产生了一个例外。解决方案是根据旧的位图创建一个新的位图并保存副本。试试看。