C # “El parámetro no es válido.” Creando un nuevo bitmap

si trato de crear un bitmap más grande que 19000 px, aparece el error: El parámetro no es válido. ¿Cómo puedo solucionar esto?

System.Drawing.Bitmap myimage= new System.Drawing.Bitmap(20000, 20000); 

Tenga en cuenta que hay mucha memoria que intenta asignar con ese bitmap.

Consulte http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/37684999-62c7-4c41-8167-745a2b486583/

Es probable que .NET se niegue a crear una imagen que consum tanta memoria contigua a la vez.

Ligeramente más difícil de leer, pero esta referencia también ayuda:

http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework.drawing/2005-06/msg00176.html

Cada imagen en el sistema tiene la cantidad de memoria definida por esta fórmula:

bit-depth * width * height / 8

Esto significa que una imagen de 40800 píxeles por 4050 requerirá más de 660 megabytes de memoria.

Sospecho que estás teniendo problemas con la tapa de la memoria. Sin embargo, hay muchas razones por las que un constructor de bitmap puede fallar. Los principales se enumeran en este artículo de Knowledge Base sobre los límites de GDI + en CreateBitmap . System.Drawing.Bitmap , internamente, usa la API nativa de GDI cuando se construye el bitmap.

Una vez dicho esto, un bitmap de ese tamaño tiene más de un GB de RAM, y es probable que esté alcanzando la limitación del tamaño de la línea de escaneo (64 KB) o se esté quedando sin memoria.

19000 píxeles cuadrados, a 32 bpp, requeriría 11552000000 bits (1,37 GB) para almacenar el ráster en la memoria. Eso es solo la información en bruto de píxeles; cualquier sobrecarga adicional inherente a System.Drawing.Bitmap se agregaría a eso. Subir a 20k píxeles cuadrados a la misma profundidad de color requeriría 1.5GB solo para la memoria de píxel bruto. En un solo objeto, está utilizando 3/4 del espacio reservado para toda la aplicación en un entorno de 32 bits. Un entorno de 64 bits tiene límites más flexibles (por lo general), pero todavía está utilizando 3/4 del tamaño máximo de un solo objeto.

¿Por qué necesitas un tamaño de imagen tan colosal? Visto a 1280×1024 res en un monitor de computadora, una imagen de 19000 píxeles en un lado sería de 14 pantallas de ancho por 18 pantallas de alto. Solo puedo imaginar que está haciendo gráficos impresos de alta calidad, en cuyo caso una imagen de 720 ppp sería un póster cuadrado de 26 “.

Configure PixelFormat cuando crea un bitmap nuevo, como:

 new Bitmap(2000, 40000,PixelFormat.Format16bppRgb555) 

y con el número exacto anterior, funciona para mí. Esto puede en parte resolver el problema.

Obtuve este error al abrir un archivo TIF. El problema se debió a que no se pudo abrir CMYK. Cambió el espacio de color de RGB a CMYK y no obtuvo un error.

Así que usé la biblioteca taglib para obtener el tamaño del archivo de imagen.

Muestra de código:

 try { var image = new System.Drawing.Bitmap(filePath); return string.Format("{0}px by {1}px", image.Width, image.Height); } catch (Exception) { try { TagLib.File file = TagLib.File.Create(filePath); return string.Format("{0}px by {1}px", file.Properties.PhotoWidth, file.Properties.PhotoHeight); } catch (Exception) { return (""); } }