JpegBitmapEncoder叶在文件末尾灰色条纹?(JpegBitmapEncoder lea

2019-08-03 23:41发布

我试图做一些简单的图像处理与WPF成像部件的工作。 我大致如下的MS文章如何编码和解码JPEG图像 。

我的代码很简单:

BitmapImage bi = new BitmapImage();

bi.BeginInit();
bi.UriSource = new Uri("D:\\Temp\\StackOverflowCapture.png");
//bi.DecodePixelWidth = 1024;
//bi.DecodePixelHeight = 768;
bi.EndInit();

var jpg                  = new JpegBitmapEncoder();
    jpg.QualityLevel     = 90;
    //jpg.FlipHorizontal = false;
    //jpg.FlipVertical   = false;
    jpg.Frames.Add(BitmapFrame.Create(bi));

var fs = new FileStream("D:\\Temp\\StackOverflow_Result.jpg", FileMode.Create);

jpg.Save( fs );
jpg = null;

该代码段创建奇数伪影,其中最后几个“行”是固体灰块。 这几乎就像如果编码器刚跑出像素写的。 灰的量2倍或3x取决于我作为输入(各种分辨率,JPEG,PNG)或I启用(迫使上解码的分辨率)的选项使用图像上的一个因素而变化。 最终的效果是一样的,但是,你可以从下面的图片中看到的。

我的源图像是:

输出图像(注意在底部的灰色条带):

这里发生了什么? 我如何得到一个干净的转换?

Answer 1:

这肯定是两耳之间的短路。 对于其他有类似弱点的缘故,不过,我回答我的问题。

您需要关闭/冲洗流。 或者,这将是很好的做法,创造fsusing块。

修改后的代码是这样的:

BitmapImage bi = new BitmapImage();

bi.BeginInit();
bi.UriSource = new Uri("D:\\Temp\\StackOverflow_Source.png");
bi.EndInit();

var jpg                  = new JpegBitmapEncoder();
    jpg.QualityLevel     = 90;
    jpg.Frames.Add(BitmapFrame.Create(bi));

var fs = new FileStream("D:\\Temp\\StackOverflow_Result.jpg", FileMode.Create);

jpg.Save( fs );
fs.close();       <--- duh, flush the stream to disk
jpg = null;


文章来源: JpegBitmapEncoder leaves gray streak at end of file?