SWT Объединение изображений или мозаика / мозаика

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

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

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
0
2 050
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Как определить, когда изображение было прокручено за пределы экрана?

Dr. Faust 29.05.2009 17:32

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

Ответ принят как подходящий

Вы можете рисовать прямо в 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

Другие вопросы по теме