我写了一个小型的实用类,可以将BitmapSource
对象保存为图像文件。这些图像文件可以是bmp、jpeg或png格式。以下是代码:
public class BitmapProcessor
{
public void SaveAsBmp(BitmapSource bitmapSource, string path)
{
Save(bitmapSource, path, new BmpBitmapEncoder());
}
public void SaveAsJpg(BitmapSource bitmapSource, string path)
{
Save(bitmapSource, path, new JpegBitmapEncoder());
}
public void SaveAsPng(BitmapSource bitmapSource, string path)
{
Save(bitmapSource, path, new PngBitmapEncoder());
}
private void Save(BitmapSource bitmapSource, string path, BitmapEncoder encoder)
{
using (var stream = new FileStream(path, FileMode.Create))
{
encoder.Frames.Add(BitmapFrame.Create(bitmapSource));
encoder.Save(stream);
}
}
}
每个
Save
方法都可以工作,但是对于 bmp 和 jpeg 格式,我得到了意外的结果。只有 png 格式可以精确地复制我在使用 WPF Image
控件在屏幕上显示 BitmapSource
时所看到的内容。以下是结果:
BMP - 太暗了
太暗了 http://img822.imageshack.us/img822/7403/terrainbmp.png
JPEG - 过度饱和
过度饱和 http://img816.imageshack.us/img816/8127/terrainjpeg.jpg
PNG - 正确的格式
正确的格式 http://img810.imageshack.us/img810/6243/terrainpng.png
为什么不同文件类型的结果完全不同?
需要注意的是,我的示例中BitmapSource
使用了0.1的alpha值(因此看起来非常褪色),但应该可以在任何图像格式中显示结果颜色。我知道如果我使用HyperSnap之类的工具进行屏幕截图,无论保存成什么文件类型,它都会显示正确。
这是一个以bmp格式保存的HyperSnap屏幕截图:
correct http://img815.imageshack.us/img815/9966/terrainbmphypersnap.png
正如您所看到的,这不是一个问题,因此WPF的图像编码器肯定有一些奇怪的地方。
我是否设置错误?我是否遗漏了什么?