2012-02-03 4 views
4

В моем приложении eclipse-rcp мне нужно создать изображение размером 30000x10000 или более. Это изображение NatTable Представление. Используя стандартный подход к созданию образа, он терпит неудачу с различными проблемами: OutOfMemory, SWTError - IllegalArgument или мой компьютер перестает отвечать (кстати, его Windows 7, 64bit, 4 RAM - клиент имеют гораздо более медленные ноутбуки, но изображение все равно необходимо создать) , Ниже приведен фрагмент кода:Как создать большой SWT-образ?

private Image getNattableImageRepresentation(final Display display) { 
     final Rectangle totalGridArea = getTotalGridArea(); //this returns Rectangle(0,0,30000,10000) 
     setGridLayerSize(totalGridArea); 
     final Image nattableImage = new Image(display, totalGridArea); 
     final GC nattableGC = new GC(nattableImage); 
     gridLayer.getLayerPainter().paintLayer(gridLayer, nattableGC, 0, 0, totalGridArea, configRegistry);//nattable API, which draws an image into a specified gc 
     restoreGridLayerState(); 
     return nattableImage; 
    } 
    return null; 
} 

Есть ли какие-либо уловки для создания таких огромных изображений или может быть API? Является ли Java Advanced Imaging Api подходящей для этой цели?

Любые предложения приветствуются.

+0

Итак, вы хотите сохранить таблицу в файл изображения ..? – Sorceror

+0

Эта статья всегда помогала мне, когда я искал некоторые проблемы с изображениями - [Ресурсы изображения SWT] (http://www.eclipse.org/articles/Article-SWT-images/graphics-resources.html) – Sorceror

+0

Благодарим вас за статью, я обязательно посмотрю на это. Нет, мне не нужно сохранять таблицу в файл, мне действительно нужно получить объект ImageData, чтобы печатать NatTable с помощью PaperClips ImagePrint. В основном, мне нужно распечатать таблицу. –

ответ

1

ImageMagick аккуратный инструмент для обработки изображений, как это .. новый CG пока не так, определенно .. Если вы присоединитесь все запасные изображения в один большой, не должно быть никаких проблем ..

+1

Композиция работает так, как ожидалось, но кажется, что она потребляет довольно много памяти. Я пробовал интерфейс im4java для ImageMagick, но это не должно быть причиной. И когда скомпилированное изображение загружается обратно в приложение, Java по-прежнему не может справиться с этим. Изображение составляет всего 10 Мб (15000x400), но оно не справляется с ошибками SWT, это печально. –

+1

Это определенно не только 10 МБ (это, но сжато), вы получили 15000x400 = 6 М пикселей на 32 бита, но на каждом изображении есть огромные накладные расходы, особенно когда SWT использует некоторые зависящие от платформы ручки. Но вы правы, это печально, так или иначе .. – Sorceror

1

Вы можете использовать BigBufferedImage. Он имеет реальную выгоду, что он сохраняет изображение на жестком диске и вам не нужно беспокоиться о размере кучи или пределе физической памяти. Он может хранить максимум 2,147,483,647 пикселей (или 46,340 x 46,340 пикселей).

Создание пустого BigBufferedImage:

BigBufferedImage image = BigBufferedImage.create(
      tempDir, width, height, type); 

загрузить существующее изображение BigBufferedImage:

BigBufferedImage image = BigBufferedImage.create(
      imagePath, tempDir, type); 

Отрендерьте часть изображения:

part = image.getSubimage(x, y, width, height); 

Для получения дополнительной информации о большой обработке изображений read this article.

+0

Спасибо за предложение. Я думаю, что это очень хороший подход. Но, к сожалению, я не могу подтвердить это, так как я больше не в проекте. Может быть, кто-то еще может. –