我編寫了一個小工具類,將BitmapSource
對象保存爲圖像文件。圖像文件可以是bmp,jpeg或png。下面是代碼:爲什麼在保存BitmapSource到WPF中的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 - 太暗
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的圖像編碼器。
我的設置有誤嗎?我錯過了什麼嗎?
你在內存中繪製這些圖像,然後將它們保存?還是來自磁盤加載的映像? – 2010-06-15 01:21:38
@Adam,這些圖像是使用'RenderTargetBitmap.Render(UIElement)'從內存中(和屏幕上)'Viewport3D'捕獲的。 – devuxer 2010-06-15 01:29:00