RAW Bilder in zumutbarer Zeit anzeigen

01/03/2010 - 14:49 von Ulf Kadner | Report spam
Hallöchen.

Ich wollte mit heut mal ein kleines Hilfstool bauen, mit dem ich Neben den
üblichen JPG und BMP Bildern auch RAW-Bilder im Canon *.cr2 Format
anzeigen kann.

Dazu muste ich als erstes den Codec von Canon runterladen und installieren.

Dannach funtioniert die Bildanzeige bereits hervorragend in der
Windows-Bildanzeige Software. Nun hab ich aber das Problem in meinem
Programm, das ich zwar mittlerweile auch ein Cr2 Bild in der Picturebox
anzeigen kann, aber dessen Rendern und zuweisen dauert bereits bei CR2
Bildern mit nur 12 Megapixeln (14-17MB) zwischen 30 und 45 Sekunden.

Folgender Code wird momentan genutzt (Fehlerbehandlung mal weggelassen):

var dec = BitmapDecoder.Create(
new Uri(cr2File),
BitmapCreateOptions.DelayCreation,
BitmapCacheOption.None);
using (var strm = new MemoryStream())
{
BitmapEncoder encoder = new BmpBitmapEncoder();
encoder.Frames.Add(dec.Frames[0]);
encoder.Save(strm);
return Image.FromStream(strm);
}

Hat jemand ne Idee wie man das etwas beschleunigen kann?

MfG, Ulf
 

Lesen sie die antworten

#1 Ulf Kadner
01/03/2010 - 16:02 | Warnen spam
On Mon, 01 Mar 2010 14:49:33 +0100, Ulf Kadner wrote:

Hat jemand ne Idee wie man das etwas beschleunigen kann?



Ich helf mir gleich mal selbst. Fall es jemand mal braucht:

var dec = BitmapDecoder.Create(
new Uri(cr2File),
BitmapCreateOptions.DelayCreation,
BitmapCacheOption.None);
using (var strm = new MemoryStream())
{
BitmapEncoder encoder = new BmpBitmapEncoder();

Die nachfolgende Zeile ist die Problemzeile

encoder.Frames.Add(dec.Frames[0]);

In dieser wird das sehr große Originalbild weiterverarbeitet was
natürlich enorm an die Resourcen geht. Besser Man nutz hier das
Vorschaubild

encoder.Frames.Add(BitmapFrame.Create(dec.Preview));

Irgendwie hatte ich aber noch ein Problem bei der Freigabe der gebundenen
original Bilddatei. Daher noch folgende 3 Zeilen vor der Rückgabe
eingefügt, welche das Problem beseitigen

dec = null;
encoder = null;
GC.Collect();

MfG, Ulf

Ähnliche fragen