Question

J'ai une application Eclipse RCP qui affiche beaucoup de petites images (10k +) les unes à côté des autres, comme une bande de film. Pour chaque image, j'utilise un objet SWT Image . Cela utilise une quantité excessive de mémoire et de ressources. Je cherche un moyen plus efficace. J'ai pensé prendre toutes ces images et les concaténer en créant un objet ImageData de la largeur totale correcte concaténée (avec une hauteur constante) et en utilisant setPixel () pour la reste des pixels. Cependant, la palette utilisée dans le constructeur ImageData est introuvable.

J'ai également recherché la fonctionnalité de mosaïque ou de mosaïque SWT pour créer une image à partir d'un groupe d'images, mais rien n'a été trouvé.

Avez-vous des idées pour afficher efficacement des milliers de petites images les unes à côté des autres? Veuillez noter qu'une fois les images affichées, elles ne sont plus manipulées. Il s'agit donc d'un coût ponctuel.

Était-ce utile?

La solution

Vous pouvez dessiner directement sur le GC (contexte graphique) d’une nouvelle image (grande). Avoir une seule grande image devrait permettre de réduire considérablement l'utilisation des ressources par rapport à des milliers d'images plus petites (chaque image de SWT conserve le traitement de certains objets graphiques du système d'exploitation)

Ce que vous pouvez essayer est quelque chose comme ceci:

        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

Autres conseils

Vraisemblablement toutes les images ne sont pas visibles à l’écran en même temps? Une meilleure solution serait peut-être de ne charger les images que lorsqu'elles deviennent (ou sont sur le point de) devenir visibles, en les éliminant après les avoir fait défiler à l'écran. Évidemment, vous voudriez en garder quelques-uns en mémoire de part et d'autre de la fenêtre d'affichage actuelle afin de faciliter la transition de l'utilisateur.

Auparavant, je travaillais avec une application Java pour créer des mosaïques photographiques et il était très difficile d’obtenir des performances et une utilisation de la mémoire suffisantes à l’aide des bibliothèques JAI (Java Imaging) et de SWT. Bien que nous n'ayons pas utilisé presque autant d'images que ce que vous avez mentionné, l'une des solutions consistait à utiliser des utilitaires en dehors de Java. Vous pouvez notamment utiliser les utilitaires de ligne de commande ImageMagick pour assembler votre mosaïque et charger la mémoire complète à partir du disque. Si vous voulez avoir du chic, il existe également une API C ++ pour ImageMagick, très efficace en mémoire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top