2009-06-19 7 views
6

Ho bisogno di elaborare immagini di grandi dimensioni (20.000 x 20.000 pixel) in C#. L'apertura diretta di queste immagini non è la via da percorrere a causa dei limiti di memoria, ma quello che voglio fare è dividere l'immagine in pezzi più piccoli (ritaglio). Stavo cercando una libreria di terze parti che potesse essere il trucco, ma finora nessun risultato. Ho provato FreeImage e ImageMagick, ma non possono aprire un'immagine da 20.000x20x000 pixel. Come posso raggiungere questo obiettivo?Come ritagliare un'immagine enorme

+1

In che formato è l'immagine? In formati come bitmap puoi usare direttamente il file io. Se si desidera utilizzare GDI o qualsiasi altra cosa, si converte quindi i singoli pezzi in un flusso e quindi lo si carica in un'immagine). Formati come PNG richiederebbero di approfondire, esaminando come i file PNG sono suddivisi in blocchi e lavorando direttamente con essi. – Brian

risposta

3

Il mio attuale progetto sul posto di lavoro è costituito da un programma visualizzatore di immagini/analisi in grado di caricare le immagini superiori a 16 GB. È necessario utilizzare il file I/O manuale, estrarre le informazioni dell'intestazione e creare le sottorimmagini su richiesta (o se si sta elaborando l'immagine, è possibile creare una singola tessera ed elaborarla sul posto). Pochissime librerie ti daranno la possibilità di caricare/modificare un'immagine 20k per 20k (1.2 gb a 24 bpp) e quelle che lo fanno raramente lo fanno con qualcosa che assomiglia alle prestazioni (se questo è un problema).

+0

16 GB + immagini? È fantastico, da dove vengono? –

+0

Lavoriamo con immagini radar ad apertura sintetica che possono generare immagini molto grandi: P –

+0

hah, che è pessimo (su Google ci sono alcune immagini fantastiche), che lingue usi.Sono curioso di sapere se C# potrebbe gestire quel tipo di carico di lavoro –

0

Non conosco nessuna libreria esistente per farlo.

Probabilmente dovresti aprire il flusso del file di immagine, cercare la posizione in cui sono presenti i dati di colore e pixel, leggere una sezione di dati di pixel in una matrice e creare la tua immagine da quella.

Ad esempio, per BMP file format, si desidera cercare nella tabella dei colori, caricare la tabella dei colori, quindi cercare la sezione di matrice di pixel, caricare comunque molti pixel desiderati in una matrice, quindi creare una nuova bitmap con solo quei pixel.

0

È possibile utilizzare il built-in librerie .NET.

Usa

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

che fermerà i dati di immagine vengano memorizzate nella cache in memoria. È possibile creare una nuova bitmap di destinazione per disegnare una sottosezione di tale immagine enorme per:

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); 
} 

Dove destRect può essere l'intera dimensione della outputImage, o di un'area più piccola.