Jakiś czas temu pojawił się u mnie malutki pomysł na prostą aplikacyjkę porządkującą pliki z obrazkami w postaci RAW na moim dysku. Dokładnie chodzi o pliki CR2 powstałe z Canona. Chciałem mieć także możliwość podglądu w tymże programiku. Pomyślałem, że może udostępnione ostatnio narządko Microsoft RAW Image Thumbnailer and Viewer for Windows XP ułatwi mi sprawę i w sumie tak się stało. :)
Stworzyłem małą biblioteczkę do której dodałem referencję do biblioteczki COM RawViewer. W ten sposób powstał Interop pozwalający już na bezbolesne korzystanie z jej dobrodziejstw.
Podstawową i jedyną klasą jest klasa RawManager.CRawViewerClass.Udostępnia ona kilka metod, ale mi była potrzebna tylko jedna:
public virtual System.Array GetThumbnailBitmap( lDesiredWidth, int lDesiredHeight, out int pRotationAngleAsShot, out int pActualWidth, out int pActualHeight)
W ten sposób stworzyłem prostą biblioteczkę, dzięki której możemy posługiwać się już obiektem typu Bitmap. Kod klasy zamieszczam poniżej.
Dodatkowo ładuje dane Exif do klasy DRawExif i zwraca za pomocą property LastRAWExif.
Skompilowana biblioteka (Framework 2.0, wymagany Microsoft RAW Image Thumbnailer and Viewer for Windows XP) do ściągnięcia i użycia tutaj: http://www.dario-g.com/download.aspx?file=DRaw/DRaw.zip
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | public class DRawThumbnailer { RawManager.CRawViewerClass _raw = null; DRawExif _dRawExif = null;
public DRawThumbnailer() { _raw = new RawManager.CRawViewerClass(); }
public DRawExif LastRAWExif { get { return this._dRawExif; } }
/// <summary> /// Tworzy miniaturkę z zadanego pliku RAW o zadanej wielkości i zwraca w postaci array'a bajtów. /// </summary> /// <param name="maxWidth">Maksymalna szerokość miniaturki</param> /// <param name="maxHeight">Maksymalna wysokość miniaturki</param> /// <param name="fileName">Plik typu RAW</param> /// <returns>Miniaturka w postaci array'a bajtów</returns> public byte[] GetThumbnailBytes(int maxWidth, int maxHeight, string fileName) { byte[] ar = new byte[0]; try { _raw.Load(fileName); int pRotationAngleAsShot, pActualWidth, pActualHeight; ar = (byte[])_raw.GetThumbnailBitmap(maxWidth, maxHeight, out pRotationAngleAsShot, out pActualWidth, out pActualHeight); LoadRAWExif(_raw); } finally { _raw.Unload(); } return ar; }
private void LoadRAWExif(RawManager.CRawViewerClass _raw) { _dRawExif = new DRawExif(_raw); }
/// <summary> /// Tworzy miniaturkę z zadanego pliku RAW o zadanej wielkości i zwraca w postaci obiektu Bitmap. /// </summary> /// <param name="maxWidth">Maksymalna szerokość miniaturki</param> /// <param name="maxHeight">Maksymalna wysokość miniaturki</param> /// <param name="fileName">Plik typu RAW</param> /// <returns>Miniaturka w postaci obiektu Bitmap</returns> public Bitmap GetThumbnailBitmap(int maxWidth, int maxHeight, string fileName) { MemoryStream ms = new MemoryStream(GetThumbnailBytes(maxWidth, maxHeight, fileName)); return new Bitmap(ms); }
/// <summary> /// Tworzy miniaturkę z zadanego array'a bajtów i zwraca w postaci obiektu Bitmap. /// </summary> /// <param name="imageData">Miniaturka w postaci array'a bajtów</param> /// <returns>Miniaturka w postaci obiektu Bitmap</returns> public Bitmap GetThumbnailFromBytes(byte[] imageData) { return new Bitmap(new MemoryStream(imageData)); } } |