Domanda

Ho un'applicazione Eclipse RCP che visualizza molte (10k +) immagini piccole una accanto all'altra, come una striscia di pellicola. Per ogni immagine, sto usando un oggetto SWT Image . Questo utilizza una quantità eccessiva di memoria e risorse. Sto cercando un modo più efficiente. Ho pensato di prendere tutte queste immagini e concatenarle creando un oggetto ImageData della larghezza concatenata totale corretta (con un'altezza costante) e usando setPixel () per resto dei pixel. Tuttavia, la Tavolozza utilizzata nel costruttore ImageData che non riesco a capire.

Ho anche cercato funzionalità di piastrellatura o mosaico SWT per creare un'immagine da un gruppo di immagini, ma non ho trovato nulla.

Qualche idea su come posso visualizzare in modo efficiente migliaia di piccole immagini una accanto all'altra? Una volta visualizzate, le immagini non vengono manipolate, pertanto si tratta di un costo una tantum.

È stato utile?

Soluzione

Puoi disegnare direttamente sul GC (contesto grafico) di una nuova (grande) immagine. Avere una grande immagine dovrebbe comportare un utilizzo delle risorse molto inferiore rispetto a migliaia di immagini più piccole (ogni immagine in SWT mantiene un po 'di gestione dell'oggetto grafico del SO)

Quello che puoi provare è qualcosa del genere:

        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

Altri suggerimenti

Presumibilmente non tutte le immagini sono visibili sullo schermo contemporaneamente? Forse una soluzione migliore sarebbe quella di caricare le immagini solo quando diventano (o stanno per diventare) visibili, eliminandole quando sono state fatte scorrere fuori dallo schermo. Ovviamente vorresti mantenerne alcuni in memoria su entrambi i lati della finestra corrente al fine di effettuare una transizione graduale per l'utente.

In precedenza ho lavorato con un'applicazione Java per creare fotomosaici e ho trovato molto difficile ottenere prestazioni e utilizzo della memoria adeguati utilizzando le librerie java imaging (JAI) e SWT. Sebbene non stessimo utilizzando quasi tutte le immagini che hai menzionato, un percorso consisteva nel fare affidamento su una utility esterna a Java. In particolare, è possibile utilizzare le utilità della riga di comando di ImageMagick per ricucire il mosaico e caricare la memoria completa dal disco. Se vuoi divertirti, c'è anche un'API C ++ per ImageMagick, che è molto efficiente in memoria.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top