Die Fortsetzung von diesem Thread hier.
Ich erzeuge ein rechteckiges 16-Bit-Testbild und speichere es mit diesem Code:
Geladen wird es mit diesem Code:
Das Testbild sieht so aus:
das gespeicherte Bild sieht so aus:
Wenn dieses Bild wieder eingelesen wird, wird es richtig dargestellt.
Am quadratischen Testbild habe ich festgestellt, dass Zeilen und Spalten getauscht abgespeichert werden.
Nun habe ich mir eine Hin-Tausch- und eine Rück-Tausch-Routine gebaut, so dass die gespeicherten Bilder gut aussehen.
Mit Rücktausch beim Einlesen werden auch fremde Bilder ordentlich behandelt.
Kennt jemand diesen Effekt (ich nehme an, dass er auf Gray16-Bilder beschränkt ist) und weiß, wie man ihn "ordentlich" beheben kann?
Ich erzeuge ein rechteckiges 16-Bit-Testbild und speichere es mit diesem Code:
C#-Quellcode
- WriteableBitmap bitmap = new WriteableBitmap(this.Header.Width, this.Header.Height, 96, 96, PixelFormats.Gray16, null);
- bitmap.WritePixels(new Int32Rect(0, 0, this.Header.Width, this.Header.Height), this.Data, this.Header.Width * 2, 0);
- PngBitmapEncoder encoder = new PngBitmapEncoder();
- encoder.Frames.Add(BitmapFrame.Create(bitmap));
- using (FileStream stream = File.Create(path))
- {
- encoder.Save(stream);
- }
C#-Quellcode
- BitmapDecoder decoder = null;
- try
- {
- decoder = BitmapDecoder.Create(stream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.None);
- BitmapFrame bmp = decoder.Frames[0];
- int stride = bmp.PixelWidth * 2;
- this.Data = new ushort[bmp.PixelWidth, bmp.PixelHeight];
- // diese 1-D-Array-Instanz muss erstellt werden,
- // sonst funktioniert CopyPixels nicht
- ushort[] array1D = new ushort[bmp.PixelWidth * bmp.PixelHeight];
- // Pixel aus dem stream auslesen
- bmp.CopyPixels(array1D, stride, 0);
- // Copy 1D zu 2D
- System.Buffer.BlockCopy(array1D, 0, this.Data, 0, bmp.PixelHeight * bmp.PixelWidth * 2);
- }
- catch
- {
- return false;
- }
- return true;
das gespeicherte Bild sieht so aus:
Wenn dieses Bild wieder eingelesen wird, wird es richtig dargestellt.
Am quadratischen Testbild habe ich festgestellt, dass Zeilen und Spalten getauscht abgespeichert werden.
Nun habe ich mir eine Hin-Tausch- und eine Rück-Tausch-Routine gebaut, so dass die gespeicherten Bilder gut aussehen.
Mit Rücktausch beim Einlesen werden auch fremde Bilder ordentlich behandelt.
Kennt jemand diesen Effekt (ich nehme an, dass er auf Gray16-Bilder beschränkt ist) und weiß, wie man ihn "ordentlich" beheben kann?
Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert!
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert!