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
Odpowiedz
Nie wiem, czy to pomogłoby, ale oto artykuł na temat image processing with C# lambda expressions.
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).
16GB + obrazy? To niesamowite, skąd pochodzą? –
Pracujemy z obrazami radaru z syntetyczną aperturą, które mogą generować bardzo duże obrazy: P –
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. –
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.
Zrobiłbym to z ImageMagick. Dostępne jest całkiem solidne API .NET i zazwyczaj jest to najlepszy sposób na przetwarzanie obrazów w ten sposób.
Sprawdź w .NET, część strony w dół strony.
http://www.imagemagick.org/script/api.php
Oto informacji, w jaki sposób rzeczy upraw w ImageMagick działa dla wersji wiersza poleceń.
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.
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