【问题标题】:JpegBitmapEncoder leaves gray streak at end of file?JpegBitmapEncoder 在文件末尾留下灰色条纹?
【发布时间】:2012-11-30 09:53:05
【问题描述】:

我正在使用 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;

代码 sn-p 创建了一个奇怪的工件,其中最后几“行”是一块纯灰色。就好像编码器的像素快用完了一样。根据我用作输入的图像(各种分辨率、jpeg、png)或我启用的选项(强制解码时的分辨率),灰度的数量会变化 2 倍或 3 倍。然而,最终效果是相同的,如下图所示。

我的源图片是:

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

这里发生了什么?如何获得干净的转换?

【问题讨论】:

  • 只是一个疯狂的猜测,但是当你设置bi.CacheOption = BitmapCacheOption.OnLoad;时也会发生这种情况吗?
  • 设置bi.CacheOption时行为没有变化

标签: wpf encoding bitmap jpeg


【解决方案1】:

这绝对是耳朵之间的短路。但是,为了其他有类似弱点的人,我正在回答我自己的问题。

您需要关闭/刷新流。或者,最好在 using 块中创建 fs

修改后的代码如下:

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;

【讨论】:

    猜你喜欢
    • 2012-07-26
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    相关资源
    最近更新 更多