Esta es una pregunta de dos partes.La primera pregunta es cómo puede cargar imágenes grandes sin quedarse sin memoria (1), la segunda está mejorando el rendimiento de carga (2).
(1) concider una aplicación como Photoshop, donde usted tiene la capacidad de trabajar con imágenes de gran consumo de gigabites en el sistema de archivos. Mantener la imagen completa en la memoria y aún tener suficiente memoria libre para realizar operaciones (filtros, procesamiento de imágenes, etc., o simplemente agregar capas) sería imposible en la mayoría de los sistemas (incluso en sistemas de 8gb x64).
Es por eso que aplicaciones como esta utilizan el concepto de archivos de intercambio. Internamente, estoy asumiendo que photoshop usa un formato de archivo propietario, adecuado para el diseño de su aplicación y construido para admitir cargas parciales del intercambio, lo que les permite cargar partes de un archivo en la memoria para procesarlo.
(2) Performande se puede mejorar (mucho) escribiendo cargadores personalizados para cada formato de archivo. Esto requiere que lea los encabezados de los archivos y la estructura de los formatos de archivo con los que desea trabajar. Una vez que tienes la mano, no es tan malo, pero no es tan trivial como hacer una llamada a un método.
Por ejemplo, usted podría google para FastBitmap para ver ejemplos de cómo se puede cargar un mapa de bits (BMP) presentar muy rápido, incluyó decodificar la cabecera de mapa de bits. Esto implicó PInvoke y para darle una idea de lo que está en contra tendrá que definir los structues de mapa de bits, como
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct BITMAPFILEHEADER
{
public Int16 bfType;
public Int32 bfSize;
public Int16 bfReserved1;
public Int16 bfReserved2;
public Int32 bfOffBits;
}
[StructLayout(LayoutKind.Sequential)]
public struct BITMAPINFO
{
public BITMAPINFOHEADER bmiHeader;
public RGBQUAD bmiColors;
}
[StructLayout(LayoutKind.Sequential)]
public struct BITMAPINFOHEADER
{
public uint biSize;
public int biWidth;
public int biHeight;
public ushort biPlanes;
public ushort biBitCount;
public BitmapCompression biCompression;
public uint biSizeImage;
public int biXPelsPerMeter;
public int biYPelsPerMeter;
public uint biClrUsed;
public uint biClrImportant;
}
Posiblemente trabajar con la creación de un DIB (http://www.herdsoft.com/ti/davincie/imex3j8i.htm) y rarezas como los datos que se almacenan "al revés "en un mapa de bits, que es necesario tomar en cuenta o se verá una imagen de espejo cuando u abrirlo :-)
Ahora eso es sólo para mapas de bits. Digamos que querías hacer PNG, entonces necesitarías hacer cosas similares, pero decodificando el encabezado PNG, que en su forma más simple no es tan difícil, pero si quieres obtener soporte completo para la especificación PNG, entonces te espera un divertido paseo: -)
PNG es diferente decir un mapa de bits, ya que utiliza un formato basado trozo donde tiene "cabeceras" se puede loacate para encontrar los datos diffrent. Ejemplo de algunos trozos que utilicé mientras juega con el formato era
string[] chunks =
new string[] {"?PNG", "IHDR","PLTE","IDAT","IEND","tRNS",
"cHRM","gAMA","iCCP","sBIT","sRGB","tEXt","zTXt","iTXt",
"bKGD","hIST","pHYs","sPLT","tIME"};
Usted también va a tener que aprender sobre las sumas de comprobación Adler32 para archivos PNG. Por lo tanto, cada formato de archivo que desee hacer agregará un conjunto diferente de desafíos.
Realmente me gustaría poder dar ejemplos de código fuente más completos en mi respuesta, pero es un tema complejo, y para ser sincero, no he implementado un intercambio yo mismo, así que no podría dar demasiados consejos sólidos sobre ese.
La respuesta corta es que las capacidades de procesamiento de imágenes en el BCL no son tan altas. La respuesta mediana sería intentar y encontrar si alguien ha escrito una biblioteca de imágenes que podría ayudarlo y la respuesta más larga sería quitarse las mangas y escribir el núcleo de su aplicación usted mismo.
Desde que me conoces en la vida real ya sabes dónde encontrarme;)
No creo que esto va a funcionar en un sistema de 32 bits basado en las limitaciones – WiiMaxx