SWT Конкатенация изображений или мозаика / мозаика - PullRequest
3 голосов
/ 08 ноября 2008

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

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

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

Ответы [ 3 ]

2 голосов
/ 14 ноября 2008

Вы можете рисовать непосредственно в 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
0 голосов
/ 13 ноября 2008

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

0 голосов
/ 13 ноября 2008

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

...