Объединение изображений SWT или разбиение на плитки / мозаику
-
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, который очень эффективен в использовании памяти.