2008-11-07 4 views
3

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

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

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

ответ

2

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

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

+0

Как обнаружить когда изображение было прокручено с экрана? – 2009-05-29 13:32:10

0

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