2008-10-22 9 views
9

Czy istnieje dobry sposób na odczytanie plików obrazów RAW (w szczególności plików Canon CR2 i Adobe DNG) jako szybkich map bitowych GDI?Odczytywanie plików obrazów RAW jako map GDI + bitmapy

Znalazłem przykład działający pod WPF, który odczytał obraz przy użyciu dowolnego zainstalowanego kodeka obrazu, a następnie wyświetlał go w formancie obrazu. I zmodyfikowałem ten przykład, aby stworzyć mapę bitową GDI +, pisząc obraz WPF do MemoryStream i tworząc z niego Bitmapę. Ale ten proces jest powolny! Strasznie wolno! Otwarcie prostego obrazu zajmuje około 10 sekund na moim komputerze. To rozwiązanie wymaga również odwołań do zestawów WPF i to nie jest właściwe, szczególnie nie, ponieważ chciałbym uruchomić kod w projekcie ASP.NET.

Istnieją programy, które wykonują konwersje wsadowe obrazów, ale wolałbym dynamicznie konwertować obrazy na żądanie.

Jakieś sugestie?

Odpowiedz

6

Nota prawna: Pracuję w Atalasoft.

Nasz produkt może to zrobić za pomocą naszego produktu DotImage Photo Pro. Jeśli chcesz spróbować zrobić to sam, spójrz na owijanie opensource DCRaw lub zobacz jak to robi Paint.NET (myślę, że jest tam wtyczka RAW)

+2

DCraw: http://www.cybercom.net/~dcoffin/dcraw/ –

3

Komponent DotImage Photo Pro działał dobrze, ale miałem problem z wyodrębnianiem obrazu podglądu z plików surowych, które go używają. Jest również poza moim budżetem na ten projekt.

Ale znalazłem kod dla wtyczki RAW dla Paint.NET here i było całkiem łatwo dostosować się do moich potrzeb. Wtyczka uruchamia plik wykonywalny DCRaw o nazwie Process.Start i odczytuje jego wyjście ze strumienia StandardOutput. Całkiem proste i szybkie! :-)

Edit:

Link do wtyczki już nie działa, ale tutaj jest kod użyłem wyodrębnić obrazy. Poniższy kod wyodrębnia podgląd jpg zapisany w pliku raw. Jeśli chcesz pełny obraz, powinieneś usunąć argument -e. Ale pamiętaj, że w przypadku niektórych aparatów otrzymasz obraz ppm, którego GDI + nie odczyta.

public Stream GetImageData(string inputFile, string dcRawExe) 
{ 


    var startInfo = new ProcessStartInfo(dcRawExe) 
    { 
     Arguments = "-c -e \"" + inputFile + "\"", 
     RedirectStandardOutput = true, 
     UseShellExecute = false 
    }; 

    var process = Process.Start(startInfo); 

    var image = Image.FromStream(process.StandardOutput.BaseStream); 

    var memoryStream = new MemoryStream(); 
    image.Save(memoryStream, ImageFormat.Png); 

    return memoryStream; 
} 

Potrzebna jest również kopia DCRaw. Użyłem DcrawMS.exe z tej strony: http://www.insflug.org/raw/Downloads/

+1

Czy/może to również odczytać dane EXIF? –

+0

Nie, ale istnieją inne narzędzia wiersza poleceń, które wyodrębnią plik exif. Spróbuj google dla "dcraw exif" –

+0

Witryna, z którą się łączysz, jest wyłączona. Czy masz szansę opublikowania kodu, aby pomóc dalszym poszukiwaczom? :) – glenneroo

2

Oto port C# od dcraw, choć raczej stary (v8.88), które mogą być dostosowane do włączenia nowszych modeli Canon:
https://sourceforge.net/projects/dcrawnet/

EDIT :
właśnie dostałem go do pracy w moim projekcie dla odczytu danych EXIF ​​z plików RAW:

  1. właściwości otwartego projektu i ustawić Rodzaj wyjścia do Biblioteka klas.
  2. Przekompiluj.
  3. Dodaj odniesienie do biblioteki DLL w swoim projekcie.
  4. Dodaj using dcraw; u góry.
  5. Stwierdzenie te linie kodu:

    DcRawState state = new DcRawState(); 
    state.inFilename = filename; 
    state.ifp = new RawStream(filename); 
    
    
    Identifier id = new Identifier(state); 
    id.identify(state.ifp); 
    

teraz sprawdzić wszystkie gadżety wewnątrz stanie (zakładając, że plik RAW jest obsługiwany i nie spowodować wyjątek;)

0

whoa. Po prostu natknąłem się na to dla mojego projektu .NET MVC. Potrafię robić RAW, a także wszystko, o czym możesz marzyć. Obejmuje kod, przykłady i wiele różnych wyborów językowych. Wygląda tak dobrze, że mam ochotę wpłacić trochę pieniędzy, zanim jeszcze skorzystam z niego.

Google od "imagemagck", ponieważ umieszczenie linku nie jest zalecane. Istnieje nawet wpis w Wikipedii.

Mam nadzieję, że to pomoże komuś.

Powiązane problemy