2011-11-25 17 views
6

Obecnie pracuję nad oprogramowaniem do mozaiki zdjęć open source C# (Sourceforge Link). To oprogramowanie łączy ze sobą duże ilości małych zdjęć (płytek) w jeden duży obraz.C#: Zapisywanie JPG w częściach

Ponieważ ostateczny rozmiar obrazu jest zwykle rzędu 20k px razy 15k px, zapisuję tylko mapę rozmieszczenia płytek w pamięci. Aby skonstruować ostateczny obraz, konstruuję go w częściach, a mianowicie w paśmie 8 linii (może też dowolną inną liczbą).

W przypadku bmps, dane te mogą następnie łatwo zapisać porcję poprzez porcję najpierw zapisując nagłówek bmp, a następnie dołączając dane ARGB do tego pliku.

Jednak otrzymane bmps są o wiele za duże, aby można było nimi manipulować (np. Dając je drukarni plakatu). Chciałbym więc zapisać te duże obrazy jako pliki jpg na moim dysku HDD.

Problem polega na tym, że ponieważ jpgs są skompresowane, zapisywanie danych w porcjach wydaje się być bardzo trudne (normalna funkcja Bitmap.Save() najpierw załaduje pełny obraz do pamięci i dlatego nie będzie stosowana), ponieważ pisanie w czystej postaci , nieskompresowane dane RGB tego nie zrobią.

Podstawowa funkcja pisania jpgs w party powinna istnieć, ponieważ o ile mi wiadomo algorytm kompresji jpg działa z porcjami lub 8x8 px.

Przejrzałem kilka bibliotek obrazów (FreeImage, GraphicsMagick, LibTiff.NET), aby znaleźć rozwiązania tego problemu, ale nie mogłem znaleźć żadnych. LibTiff zasadniczo ma pożądaną funkcjonalność, ale tylko dla formatu obrazu tiff.

Bardzo dziękuję za pomoc! Max

Odpowiedz

1

Ponieważ nie wspomniałeś o OpenJPEG library, pomyślałem, że mogłeś go nie zauważyć.

http://www.openjpeg.org/

Oczywiście trzeba będzie trochę obwoluty wokół niego, ale myślę, że można osiągnąć to, co chcesz zrobić za pomocą tej biblioteki. Ale nie jest to najłatwiejsze rozwiązanie, wiem. Jeśli ktoś wymyśli lepszą, łatwiejszą sugestię, możesz pominąć tę bibliotekę.

Edycja: Wygląda to bardzo niekompletnie, ale może być pomocne, ponieważ jest to kod C#. http://www.codeproject.com/KB/graphics/SimpleJpeg.aspx

+0

Dzięki, naprawdę za nią tęskniłem. Sprawdzę to jak najszybciej! – mgulde

+0

Hmm, okazuje się, że OpenJPEG to tylko konwersja JPEG i JPEG2K z powrotem. Prosty koder jest fajnym rozwiązaniem, nawet jeśli wygląda na bardzo skomplikowane;) – mgulde

+0

Hmm, _does_ biblioteka OpenJpeg obsługuje inkrementalne operacje wejścia/wyjścia? Spojrzałem na to trochę (chociaż dokumenty są bardzo minimalne), a wszystkie interfejsy I/O obrazu działały tylko na pełnych obrazach ... Czy możesz wskazać wywołania API, których używasz do inkrementacji we/wy z biblioteka openjpeg ...? Dzięki! – snogglethorpe