Escribí una pequeña clase de utilidad que guarda BitmapSource
objetos en archivos de imagen. Los archivos de imagen pueden ser bmp, jpeg o png. Aquí está el código:¿Por qué obtengo resultados completamente diferentes al guardar un BitmapSource en bmp, jpeg y png en WPF
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);
}
}
}
Cada uno de los tres métodos Save
funciona, pero me da resultados inesperados con BMP y JPEG. Png es el único formato que produce una reproducción exacta de lo que veo si muestro el BitmapSource
en la pantalla usando un control WPF Image
.
Éstos son los resultados:
BMP-demasiado oscuro
too dark http://img822.imageshack.us/img822/7403/terrainbmp.png
JPEG-demasiado saturado
too saturated http://img816.imageshack.us/img816/8127/terrainjpeg.jpg
PNG - correctas
correct http://img810.imageshack.us/img810/6243/terrainpng.png
¿Por qué recibo resultados completamente diferentes para diferentes tipos de archivos?
Debo notar que el BitmapSource
en mi ejemplo usa un valor alfa de 0.1 (por lo que parece muy desaturado), pero debería ser posible mostrar los colores resultantes en cualquier formato de imagen. Sé que si tomo una captura de pantalla usando algo como HyperSnap, se verá correctamente independientemente del tipo de archivo que guarde.
Aquí hay una captura de pantalla HyperSnap guardado como BMP:
correct http://img815.imageshack.us/img815/9966/terrainbmphypersnap.png
Como se puede ver, esto no es un problema, por lo que definitivamente hay algo extraño en codificadores de imagen de WPF.
¿Tengo una configuración incorrecta? ¿Me estoy perdiendo de algo?
¿Está dibujando estas imágenes en la memoria y luego guardándolas? ¿O es de una imagen cargada en el disco? –
@ Adam, estas imágenes se capturan desde una memoria (y en pantalla) 'Viewport3D' usando' RenderTargetBitmap.Render (UIElement) '. – devuxer