Pregunta

Me gustaría poder crear un mapa de bits de píxeles grandes (por ejemplo, 20,000 x 20,000) en una aplicación MFC de C ++, usando una clase derivada de CDC para escribir en el mapa de bits. He intentado usar CD de memoria como se describe en los documentos de MSDN, pero parece que están restringidos a tamaños compatibles con el controlador de pantalla actual.

Actualmente estoy usando un controlador de impresión de mapa de bits para hacer el trabajo, pero es extremadamente lento y utiliza una gran cantidad de almacenamiento intermedio debido a la puesta en cola de la información GDI.

La solución que estoy buscando no debe incluir metarchivos ni spooling, ya que el modelo que estoy dibujando requiere muchos millones de llamadas GDI para procesar.

Podría usar un enfoque de dividir y conquistar a través de múltiples CD de memoria, pero parece una técnica bastante pesada y poco elegante.

algún pensamiento?

¿Fue útil?

Solución

CDC y CBitmap parecen admitir solo mapas de bits dependientes del dispositivo, es posible que tenga más suerte al crear su mapa de bits con :: CreateDIBSection , luego adjunta un CBitmap a eso. Las interfaces GDI sin procesar son un poco aburridas, desafortunadamente.

Probablemente no tendrá mucha suerte con 20,000 x 20,000 a 32 BPP, al menos en una aplicación de 32 bits, ya que sale con aproximadamente 1.5 GB de memoria, pero obtuve un HBITMAP válido con 16 bpp:

BITMAPINFOHEADER bmi = { sizeof(bmi) };
bmi.biWidth = 20000;
bmi.biHeight = 20000;
bmi.biPlanes = 1;
bmi.biBitCount = 16;
HDC hdc = CreateCompatibleDC(NULL);
BYTE* pbData = 0;
HBITMAP hbm = CreateDIBSection(hdc, (BITMAPINFO*)&bmi, DIB_RGB_COLORS, (void**)&pbData, NULL, 0);
DeleteObject(SelectObject(hdc, hbm));

Otros consejos

Esto es inusual, ya que a menudo creé un DC basado en la pantalla que se usará para una imagen de mapa de bits que es mucho más grande que la pantalla (3000 píxeles más en algunos casos) sin ningún problema. ¿Tiene algún código de muestra que muestre este problema en acción?

Teniendo en cuenta una resolución de imagen tan grande, no puede crear la imagen utilizando mapas de bits compatibles.

Ejemplo:

profundidad de píxel = 32 bits = 4 bytes por píxel

cantidad de píxeles = 20.000 * 20.000 = 400.000.000

bytes totales = recuento de píxeles * 4 = 1.600.000.000 bytes = 1.562.500 kb ~ = 1525 MB ~ = 1.5GB

Estoy especulando sobre las intenciones finales, pero supongamos que quieres crear y permitir que los usuarios exploren un mapa inmenso con acercamientos muy detallados. Debe crear un formato de archivo de imagen personalizado; puede colocar dentro de ese archivo varias capas que contienen cuadrículas de mapas de bits, por ejemplo, para acelerar la representación. El proceso de procesamiento puede usar GDI DIB o GDI + para crear imágenes parciales y luego renderizarlas juntas. Por supuesto, esto necesita un poco de experimentación / optimización para alcanzar la sensación perfecta del usuario.

buena suerte

Para mantener el uso de la memoria dentro de límites aceptables, tendrás que usar tu estrategia de "dividir y conquistar". No es un hack, si se implementa correctamente, en realidad es una forma muy elegante de tratar con mapas de bits de tamaño ilimitado. Si lo diseña correctamente, puede combinar el 'solo renderizar / mostrar parte de la imagen', 'renderizar toda la imagen a baja resolución para la visualización en pantalla' y 'renderizar todo a un mapa de bits en disco' en un motor y usuarios de escudo de su código (lo más probable es que usted mismo en dos semanas;)) de las partes internas. Trabajo en un producto con los mismos problemas: la representación (potencialmente grande) se asigna a la pantalla o a los archivos .bmp.

Si la imagen tiene que tener esta resolución, por ejemplo, un escaneo de alta resolución de una radiografía, es posible que desee ver cómo escribir rutinas de spooling personalizadas para el mismo - 1.5 gb es muy costoso, incluso para computadoras de escritorio modernas.

Si está basado en vectores, puede ver SVG ya que admite puertos de vista y la mayoría le permite renderizar a otros formatos. Uso SVG para JPG a través de Batik (java), por lo que es posible hacerlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top