我正在使用WPF成像组件尝试进行一些简单的图像处理。我大致在关注How to Encode & Decode a JPEG Image的MS文章。
我的代码很简单:
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;
代码片段会创建一个奇怪的工件,其中最后几个“线”是一个实心灰色的块。这几乎就像编码器的像素耗尽一样。根据我用作输入的图像(各种分辨率,jpeg,png)或我启用的选项(强制解码时的分辨率),灰度变化2倍或3倍。然而,净效果是相同的,如下图所示。
我的源图片是:
输出图像(注意底部的灰色条带):
这里发生了什么?我如何获得干净的转换?
答案 0 :(得分:2)
这绝对是耳朵之间的短路。然而,为了其他有类似弱点的人,我正在回答我自己的问题。
您需要关闭/刷新流。或者,最好在fs
块中创建using
。
修改后的代码是:
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;