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

StackOverflow https://stackoverflow.com/questions/273711

  •  07-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

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

        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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top