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




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