Napisałem małą klasę narzędzi, która zapisuje obiekty BitmapSource
do plików graficznych. Pliki obrazów mogą być bmp, jpeg lub png. Oto kod:Dlaczego uzyskuję zupełnie różne wyniki podczas zapisywania BitmapSource do bmp, jpeg i png w 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);
}
}
}
Każdy z trzech Save
metod pracy, ale otrzymuję nieoczekiwane wyniki z BMP i JPEG. Png jest jedynym formatem, który zapewnia dokładną reprodukcję tego, co widzę, jeśli pokażę ekran BitmapSource
przy użyciu kontrolki WPF Image
.
tutaj wyniki:
BMP - zbyt ciemny
too dark http://img822.imageshack.us/img822/7403/terrainbmp.png
JPEG - zbyt nasyconego
too saturated http://img816.imageshack.us/img816/8127/terrainjpeg.jpg
PNG - poprawne
correct http://img810.imageshack.us/img810/6243/terrainpng.png
Dlaczego otrzymuję zupełnie różne wyniki dla różnych typów plików?
Należy zauważyć, że BitmapSource
w moim przykładzie używa wartości alpha 0,1 (dlatego wydaje się bardzo desaturated), ale powinno być możliwe, aby pokazać uzyskane kolory w dowolnym formacie obrazu. Wiem, że jeśli zrobię zrzut ekranu za pomocą czegoś takiego jak HyperSnap, będzie wyglądać poprawnie, bez względu na to, jaki typ pliku zapisuję.
Oto zrzut ekranu HyperSnap zapisany jako BMP:
correct http://img815.imageshack.us/img815/9966/terrainbmphypersnap.png
Jak widać, nie jest to problem, więc na pewno coś dziwnego przetworników obrazu WPF użytkownika.
Czy ustawienie jest nieprawidłowe? Czy czegoś brakuje?
Czy rysujesz te obrazy w pamięci, a następnie je zapisujesz? A może z obrazu ładowanego na dysk? –
@Adam, obrazy te są przechwytywane z "Viewport3D" w pamięci (i na ekranie) za pomocą 'RenderTargetBitmap.Render (UIElement)'. – devuxer