SWT Конкатенация изображений или мозаика / мозаика

У меня есть приложение Eclipse RCP, которое отображает множество (10 000+) небольших изображений рядом друг с другом, например, кинопленку. Для каждого изображения я использую объект SWT Image. При этом используется чрезмерное количество памяти и ресурсов. Я ищу более эффективный способ. Я подумал о том, чтобы взять все эти изображения и соединить их, создав объект ImageData правильной общей объединенной ширины (с постоянной высотой) и используя setPixel() для остальных пикселей. Однако я не могу понять Palette, используемый в конструкторе ImageData.

Я также искал функцию тайлинга или мозаики SWT для создания одного изображения из группы изображений, но ничего не нашел.

Любые идеи, как я могу эффективно отображать тысячи маленьких изображений рядом друг с другом? Обратите внимание, что после отображения изображений они не манипулируются, поэтому это единовременная плата.


person Brian    schedule 07.11.2008    source источник


Ответы (3)


Вы можете рисовать непосредственно в GC (графическом контексте) нового (большого) изображения. Наличие одного большого изображения должно привести к гораздо меньшему использованию ресурсов, чем тысячи изображений меньшего размера (каждое изображение в SWT содержит дескриптор графического объекта ОС)

Что вы можете попробовать, это что-то вроде этого:

        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
person Herman Lintvelt    schedule 14.11.2008

Предположительно, не каждое изображение видно на экране в любой момент времени? Возможно, лучшим решением было бы загружать изображения только тогда, когда они становятся (или вот-вот станут) видимыми, и удалять их, когда они прокручиваются за пределы экрана. Очевидно, вы захотите сохранить несколько в памяти по обе стороны от текущего окна просмотра, чтобы сделать плавный переход для пользователя.

person alexmcchessers    schedule 13.11.2008
comment
Как определить, когда изображение прокручивается за пределы экрана? - person Dr. Faust; 29.05.2009

Раньше я работал с Java-приложением для создания фотомозаики, и мне было очень сложно добиться адекватной производительности и использования памяти с помощью библиотек обработки изображений Java (JAI) и SWT. Хотя мы использовали не так много изображений, как вы упомянули, один из способов заключался в том, чтобы полагаться на утилиты вне java. В частности, вы можете использовать утилиты командной строки ImageMagick, чтобы склеить мозаику и загрузить готовую память с диска. Если вы хотите пофантазировать, для ImageMagick также существует C++ API, который очень эффективно использует память.

person Scott Wegner    schedule 13.11.2008