Creación y dibujo de imágenes enormes (en búfer) en Java

Estoy trabajando en una aplicación que extrae una matriz, utilizando Java 2D, que puede llegar a ser bastante grande, por ejemplo, 30000 x 30000 píxeles. En este momento, he experimentado un poco con BufferedImage, pero la creación de una BufferedImage tan grande provoca excepciones de falta de memoria, incluso cuando se amplía el montón. Ahora estaba pensando en dividir la imagen en varias imágenes/regiones, y cuando termine en una región determinada, escríbala en el disco y cree una nueva región/Imagen almacenada en búfer y continúe dibujando. Estoy interesado en los pensamientos de otras personas sobre cómo manejarían esto. He estado alejado de Java por un tiempo, por lo que cualquier ejemplo concreto es bienvenido.

preguntado el 03 de mayo de 12 a las 22:05

2 Respuestas

Contribuyo a un nuevo/pequeño proyecto de código abierto que puede ser muy adecuado para sus necesidades.

El proyecto es Vislumbrar. Su objetivo es ayudar en la construcción de visualizaciones de datos 2D en Java con un enfoque en el manejo adecuado de grandes conjuntos de datos y facilitar la interactividad en tiempo real para permitir una fácil exploración de datos.

Mapa principal de Glimpse

Utiliza OpenGL para aprovechar las funciones de hardware de las GPU modernas, como la memoria de texturas y los sombreadores, para lograr los objetivos anteriores. Entonces, si está configurado para usar Java2D, esto no funcionará para usted. Sin embargo, los paneles de Glimpse se pueden colocar uno al lado del otro con otros componentes de Swing, por lo que es fácil colocarlos en su GUI de Swing existente. La única advertencia es que necesitarás una tarjeta gráfica decente.

La imagen es un ejemplo de una gran matriz de datos cuyo color se ajusta dinámicamente a través de la escala de color de la derecha (los datos de la matriz se almacenan en una textura de GPU y el cambio de color dinámico se logra a través de un sombreador personalizado). La fuente de este ejemplo es HeatMapExample.java. Hay muchos otros ejemplos como ese que proporcionan puntos de partida para trabajar con otras características de Glimpse.

Puedes aprender más en vislumbre.metsci.com. Hay un video de introducción en la página principal, junto con Ejemplos de Java WebStart. La fuente está alojada en GitHub.

contestado el 03 de mayo de 12 a las 22:05

Interesante, definitivamente investigaré esto. Gracias. - Rbaarda

si solo desea generar la imagen en el disco, mire pngj - puede generar a lo grande imágenes png sin problemas porque escribe líneas de píxeles en el disco a medida que están disponibles. la api es un poco específica de png, pero no es demasiado compleja (puede ser útil leer un poco de información sobre el formato de imagen png antes de usarlo).

contestado el 04 de mayo de 12 a las 00:05

Gracias por tu respuesta. He buscado en pngj, pero todavía estoy averiguando cómo dibujarías, por ejemplo, una imagen almacenada en el disco usando pngj. - Rbaarda

no lo harías Pensé que el problema era que la imagen almacenada en búfer ocupa demasiada memoria. pngj evita eso: escribe los píxeles directamente en el disco. lo siento si he entendido mal. - Andrew Cooke

Lo siento por ser confuso, pero tienes razón, ese es el problema. Déjeme ponerlo de esta manera, ¿cómo usaría la API de Java 2D junto con PNGJ? - Rbaarda

de nuevo, ¡no lo harías! :Oh, perdón. si necesita realizar un procesamiento complejo en Java con la API de imágenes de Java, entonces no funcionará, no está conectado a él en absoluto. es completamente independiente. pero si tiene algún proceso numérico que genera datos que desea convertir en una imagen, y puede hacer ese cálculo píxel por píxel a lo largo de las filas, entonces calcularía los valores rgb y los enviaría al png (donde i Pensé que podría usar herramientas de terceros para generar subconjuntos/versiones escaladas de la imagen que luego podría leerse en Java ...) - Andrew Cooke

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.