【发布时间】:2010-06-15 00:54:59
【问题描述】:
我编写了一个小实用程序类,将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 得到了意想不到的结果。如果我使用 WPF Image 控件在屏幕上显示 BitmapSource,Png 是唯一一种可以精确复制我看到的内容的格式。
结果如下:
BMP - 太暗
too dark http://img822.imageshack.us/img822/7403/terrainbmp.png
JPEG - 太饱和了
too saturated http://img816.imageshack.us/img816/8127/terrainjpeg.jpg
PNG - 正确
correct 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 的图像编码器肯定有些奇怪。
我的设置有误吗?我错过了什么吗?
【问题讨论】:
-
你是在内存中绘制这些图像然后保存它们吗?还是来自磁盘加载的图像?
-
@Adam,这些图像是使用
RenderTargetBitmap.Render(UIElement)从内存中(和屏幕上)Viewport3D捕获的。
标签: c# wpf image image-processing