Pregunta

Tengo una aplicación Eclipse RCP que muestra muchas (10k +) de imágenes pequeñas una al lado de la otra, como una tira de película. Para cada imagen, estoy usando un objeto SWT Image . Esto usa una cantidad excesiva de memoria y recursos. Estoy buscando una forma más eficiente. Pensé en tomar todas estas imágenes y concatenarlas creando un objeto ImageData del ancho total y concatenado adecuado (con una altura constante) y usando setPixel () para el resto de los píxeles Sin embargo, la Palette utilizada en el constructor ImageData no puedo entender.

También busqué la funcionalidad de mosaico o mosaico SWT para crear una imagen de un grupo de imágenes, pero no encontré nada.

¿Alguna idea de cómo puedo mostrar miles de imágenes pequeñas una al lado de la otra de manera eficiente? Tenga en cuenta que una vez que se muestran las imágenes, no se manipulan, por lo que este es un costo único.

¿Fue útil?

Solución

Puede dibujar directamente en el GC (contexto de gráficos) de una nueva imagen (grande). Tener una imagen grande debería dar como resultado un uso de recursos mucho menor que miles de imágenes más pequeñas (cada imagen en SWT mantiene algún identificador de objeto de gráficos del sistema operativo)

Lo que puedes probar es algo como esto:

        final List<Image> images;
        final Image bigImage = new Image(Display.getCurrent(), combinedWidth, height);
        final GC gc = new GC(bigImage);
        //loop thru all the images while increasing x as necessary:
        int x = 0;
        int y = 0;
        for (Image curImage : images) {
            gc.drawImage(curImage, x, y);
            x += curImage.getBounds().width;
        }
        //very important to dispose GC!!!
                    gc.dispose();
        //now you can use bigImage

Otros consejos

¿Presumiblemente no todas las imágenes son visibles en la pantalla al mismo tiempo? Quizás una mejor solución sería cargar las imágenes solo cuando se vuelvan (o estén a punto de) ser visibles, eliminándolas cuando se hayan desplazado fuera de la pantalla. Obviamente, querrá mantener algunos en la memoria a ambos lados de la ventana gráfica actual para hacer una transición sin problemas para el usuario.

Anteriormente trabajé con una aplicación Java para crear fotomosaicos, y me resultó muy difícil lograr un rendimiento adecuado y el uso de memoria utilizando las bibliotecas de imágenes Java (JAI) y SWT. Aunque no estábamos usando tantas imágenes como usted menciona, una ruta era confiar en servicios públicos fuera de Java. En particular, puede usar las utilidades de línea de comandos de ImageMagick para unir su mosaico y cargar la memoria completa del disco. Si quieres ponerte elegante, también hay una API de C ++ para ImageMagick, que es muy eficiente en la memoria.

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