четверг, 5 февраля 2009 г.

Проблемы осуществления Border + Crop в JAI

Часто возникает необходимость последовательного расширения изображения с последующим обрезанием расширенных границ. Например, при проведении медианной или фурье-фильтрации для избежания информационных потерь по границе изображения.
Если использовать библиотеку JAI из JMF v.2.1.1e, данную операцию можно провести последовательным применением операторов Border и Crop.
И здесь возникает проблема смещения указателей на начало изображения. Схематически, представленая на рис.1


Рис.1. Представление проблемы осуществления border-crop операции

В дебагере это можно определить через свойства PlanarImage.tileX и PlanarImage.tileY. При отображении изображения через, например, DisplayJAI, производится вывод с позиции (0,0) - т.е. изображение целиком не выводится. А осущетвление попиксельных операций уже выдает исключение выхода за область памяти. Таким образом, проведение операции border-crop над изображением неустойчиво и делает последнее непригодным к какому-либо использованию.
Как было выяснено из одной книги, проблема известная и её предлагается решать операторами Format или Translate. Но они не работают. Format просто не работает. Translate срабатывает по прямому назначению, но не решает проблемы в целом.
Несколько корявым, но работоспособным явлется процедура переоткрытия графического файла. Например, такая:
JAI.create("filestore", cropImage, "temp.bmp", "BMP");
cropImage = JAI.create("fileload", "temp.bmp");
Возможно, существуют иные варианты решения?