Pergunta

Eu tenho um aplicativo Eclipse RCP que exibe um monte (10k +) de pequenas imagens ao lado do outro, como uma tira de filme. Para cada imagem, eu estou usando um objeto SWT Image. Este usa uma quantidade excessiva de memória e recursos. Eu estou procurando uma maneira mais eficiente. Pensei em tomar todas essas imagens e concatenando-los através da criação de um objeto ImageData do total adequada, largura concatenados (com uma altura constante) e usando setPixel() para o resto dos pixels. No entanto, o Palette usado no construtor ImageData eu não consigo descobrir.

Eu também procurou azulejos SWT ou funcionalidade mosaico para criar uma imagem de um grupo de imagens, mas não encontrou nada.

Alguma idéia de como eu posso mostrar milhares de pequenas imagens ao lado do outro de forma eficiente? Por favor, note que uma vez que as imagens são exibidas, eles não são manipuladas, de modo que este é um custo único.

Foi útil?

Solução

Você pode desenhar diretamente sobre o GC (contexto gráfico) de uma nova imagem de (grande). Ter uma grande imagem deve resultar em muito o uso de recursos menos de milhares de imagens menores (cada imagem em SWT mantém alguns alça OS gráficos objeto)

O que você pode tentar é algo como isto:

        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

Outras dicas

Provavelmente não cada imagem é visível na tela a qualquer momento? Talvez a melhor solução seria a de carregar apenas as imagens quando eles se tornam (ou estão prestes a tornar-se) visível, eliminá-los quando eles foram rolaram para fora da tela. Obviamente que você gostaria de manter alguns na memória de cada lado da janela de visualização atual, a fim de fazer uma transição suave para o usuário.

Eu já trabalhei com uma aplicação Java para criar fotomosaicos, e achei muito difícil de alcançar um desempenho adequado e uso de memória usando a imagem java (JAI) bibliotecas e SWT. Embora não estavam usando quase tantas imagens como você menciona, uma rota era contar com um utilitários fora do java. Em particular, você pode usar utilitários de linha de comando ImageMagick para unir seu mosaico, e a carga da memória concluída a partir do disco. Se você quiser começar a fantasia, há também uma API C ++ para ImageMagick, que é muito eficiente na memória.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top