2009-06-19 21 views
6

Necesito procesar imágenes grandes (20,000x20,000pixels) en C#. Abrir estas imágenes directamente no es el camino a seguir debido a limitaciones de memoria, pero lo que quiero hacer es dividir la imagen en pedazos más pequeños (recorte). Estaba buscando una biblioteca de terceros que pudiera ser el truco, pero hasta ahora no hay resultados. Intenté FreeImage e ImageMagick, pero no pueden abrir una imagen de 20,000x20x000 píxeles. ¿Cómo puedo conseguir esto?Cómo recortar una imagen enorme

+1

¿En qué formato está la imagen? En formatos como mapa de bits, puede usar el archivo io directamente. Si desea usar GDI o lo que sea, entonces convierta los fragmentos individuales a una secuencia y luego cárguelos en una imagen). Los formatos como PNG requerirían profundizar, examinar cómo los archivos PNG se dividen en bloques y trabajar con ellos directamente. – Brian

Respuesta

3

Mi proyecto actual en el trabajo consiste en un visor de imágenes/programa de análisis capaz de cargar imágenes de más de 16 gb. Debe usar el archivo IO manual, extraer la información del encabezado y crear sus subimágenes a pedido (o si está procesando la imagen, puede crear un único mosaico y procesarlo en el lugar). Muy pocas bibliotecas le darán la capacidad de cargar/modificar una imagen de 20k por 20k (1.2gb a 24bpp) y las que lo hacen raramente lo harán con algo parecido al rendimiento (si eso es una preocupación).

+0

16gb + images? Eso es increíble, ¿de dónde vienen? –

+0

Trabajamos con imágenes de radar de apertura sintética que pueden generar imágenes muy grandes: P –

+0

ja, eso es rudo (Google tiene algunas buenas imágenes sobre eso), qué idiomas usas.Tengo curiosidad si C# podría manejar ese tipo de carga de trabajo –

0

No conozco ninguna biblioteca existente para hacer esto.

Probablemente tenga que descifrar la secuencia del archivo de imagen, buscar la ubicación donde existen los datos de color y píxel, y leer una sección de los datos de píxeles en una matriz, y crear su imagen a partir de eso.

Por ejemplo, para el BMP file format, tendrá que buscar en la tabla de colores, cargar la tabla de colores, a continuación, busque la sección matriz de píxeles, sin embargo, muchas de carga pixes que desea en una matriz, a continuación, hacer un nuevo mapa de bits con solo esos píxeles.

0

Lo haría con ImageMagick. Hay una API .NET bastante sólida disponible, y normalmente es la mejor manera de hacer un procesamiento de imágenes como este.

Busque en .NET, parte del camino hacia abajo de la página.

http://www.imagemagick.org/script/api.php

Aquí está la información sobre la forma en la materia de cultivos en ImageMagick trabaja, para la versión de línea de comandos.

http://www.imagemagick.org/Usage/crop/#crop

0

Usted puede utilizar el incorporado en las bibliotecas .NET.

Uso

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

que detendrá los datos de las imágenes en caché en la memoria. Se puede crear un nuevo mapa de bits de destino para dibujar una subsección de esa imagen masiva a:

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

Dónde destRect puede ser todo el tamaño del outputImage, o un área más pequeña.

Cuestiones relacionadas