2009-06-19 3 views
6

Potrzebuję przetwarzać duże obrazy (20 000 x 20 000 pikseli) w języku C#. Otwieranie tych obrazów bezpośrednio nie jest drogą z powodu ograniczeń pamięci, ale chcę podzielić obraz na mniejsze fragmenty (kadrowanie). Szukałem biblioteki innej firmy, która mogłaby podstęp, ale jak na razie brak rezultatu. Próbowałem FreeImage i ImageMagick, ale nie można otworzyć obrazu o rozdzielczości 20 000 x 20 x 1000 pikseli. Jak mogę to osiągnąć?Jak przyciąć ogromny obraz

+1

W jakim formacie znajduje się ten obraz? W formatach takich jak bitmap możesz po prostu użyć pliku io bezpośrednio. Jeśli chcesz używać GDI lub czegoś podobnego, możesz przekształcić poszczególne porcje w strumień, a następnie załadować go do obrazu). Formaty takie jak PNG wymagałyby głębszego przeglądania, sprawdzania, w jaki sposób pliki PNG są dzielone na bloki i pracują z nimi bezpośrednio. – Brian

Odpowiedz

3

Mój obecny projekt w pracy składa się z programu do przeglądania obrazów/analizowania, który może ładować obrazy przekraczające 16 GB. Musisz użyć ręcznego pliku IO, wyciągnąć informacje z nagłówka i utworzyć swoje podwarstwy na żądanie (lub jeśli przetwarzasz obraz, możesz utworzyć pojedynczy kafelek i przetworzyć go na miejscu). Bardzo niewiele bibliotek da ci możliwość załadowania/zmodyfikowania obrazu 20k na 20k (1,2 gb przy 24 bpp), a te, które robią, rzadko będą to robić z czymkolwiek przypominającym wydajność (jeśli jest to problemem).

+0

16GB + obrazy? To niesamowite, skąd pochodzą? –

+0

Pracujemy z obrazami radaru z syntetyczną aperturą, które mogą generować bardzo duże obrazy: P –

+0

hah, to jest badass (google ma świetne zdjęcia), jakich języków używasz.Jestem ciekawy, czy C# radzi sobie z tego rodzaju obciążeniem. –

0

Nie znam żadnej istniejącej biblioteki, aby to zrobić.

Najprawdopodobniej będziesz musiał otworzyć strumień pliku obrazu, wyszukać lokalizację, w której znajdują się dane koloru i piksela, i odczytać część danych pikseli w postaci tablicy, a następnie utworzyć z niej obraz.

Na przykład dla BMP file format, będziesz chciał przeszukać tabelę kolorów, wczytać tabelę kolorów, następnie przeszukać sekcję tablic pikseli, załadować dowolną liczbę pikseli do tablicy, a następnie utworzyć nową bitmapę tylko z tymi pikselami.

0

można użyć wbudowanych bibliotek .NET.

Zastosowanie

sourceBitmap = (Bitmap)Image.FromStream(sourceFileStream, false, false);

To zatrzyma danych obrazowych przed buforowane w pamięci. Można utworzyć nowy docelowy bitmapę narysować podsekcji tego ogromnego obrazu do:

var output = new Bitmap(outputWidth, outputHeight); 
var outputGraphics = Graphics.FromImage(output); 

outputGraphics.DrawImage(sourceBitmap, destRect, srcRect, GraphicsUnit.Pixel); 

using (var fs = File.OpenWrite(outputFilePath)) 
{ 
    output.Save(fs, System.Drawing.Imaging.ImageFormat.Png); 
} 

Gdzie destRect może być cała wielkość outputImage lub mniejszy obszar.