Jag har i många år använt ett program som heter Pixort för att gallra mina nytagna digitala bilder. Jag tar oftast MASSOR med bilder och behåller enbart de bäst, om man t.ex. har 1000 bilder från en fotbollsturnering så reduceras det oftast till runt 40 bilder innan de åker in i mitt katalogprogram (Lightroom). Pixort är väldigt snabb och effektiv för detta ändamål, men det finns några små saker som jag irriterar mig på.

Därför funderade jag på hur svårt det skulle vara att skriva ett eget program som kunde användas för gallring. Jag gjorde ett försök för ett par år sedan men allt krångel med avkodning av RAW formatet blev för mycket… Men nu är det ett bättre läge eftersom Vista (och XP) har stöd för RAW avkodare som kan läsa de olika RAW formaten, avkodarna skapas av kameratillverkarna (Canons avkodare finns att ladda ner på http://www.usa.canon.com/consumer/controller?act=ModelInfoAct&tabact=DownloadDetailTabAct&fcategoryid=314&modelid=15206).

Från och med .NET Framework 3.0 finns det nu stöd via BitmapDecoder.Create för att använda dessa avkodare för att läsa upp RAW bilder från egna program, utan att man behöver bry sig om vilka algoritmer som används för att avkoda RAW filen.

FileStream stream = new FileStream(file, FileMode.Open);
BitmapDecoder decoder = BitmapDecoder.Create(stream, BitmapCreateOptions.None, BitmapCacheOption.Default);

img.Source = decoder.Frames[0];
img.Source = decoder.Preview;
img.Source = decoder.Thumbnail;
img.Stretch = Stretch.Uniform;
stream.Close();

Som visas ovan finns det tre olika sätt att hämta information från avkodaren. För min Canon 30D med 8 MP ger de olika alternativen bilder med följande storlekar:

  • Frames[0]: 2336*4672 = 8 MP
  • Preview: 1152*1728 = 2 MP
  • Thumbnail = 120*160 = 0,02 MP

Jag har hittills enbart använt Thumbnail och Preview. När man använder Frames[0] får man ett problem med timing eftersom avkodaren verkar ladda ner filen i bakgrunden och om man stänger FileStream innan allt är klart så visas ingen bild. Antagligen ska man använda händelsen DownloadComplete men jag orkar inte bry mig just nu, ett snabbt test med en loop som kollar egenskapen IsDownloading visade sig inte funka så det är nog händelsen som ska användas.

Avkodningshastigheten är helt ok för Thumbnail och Preview medans hela bilden såklart ta lite längre tid. Man behöver fortfarande jobba med async operations om man ska visa 100 filer, men de 30 filer jag har i mitt test tar ingen längre tid.

Det var grunderna för att visa RAW filer i WPF, nu ska jag labba vidare och se om jag får ihop något användbart.