Как указать поведение Java BufferedImage resize: нужно минимум для строк пикселей вместо усреднения - PullRequest
1 голос
/ 29 марта 2010

Я хотел бы изменить размер Java BufferedImage, уменьшив его по вертикали, но без использования какого-либо усреднения, чтобы строка пикселя была «пустой» (белой) в исходном изображении, чтобы был белый пиксель строка в соответствующей позиции конечного изображения: операция «min». Алгоритмы по умолчанию (указанные в getScaledInstance ) не дают мне достаточно детального управления. Я хотел бы реализовать следующую логику:

for each pixel row in the w-pixels wide destination image, d = pixel[w]
   find the corresponding j pixel rows of the source image, s[][] = pixel[j][w]
   write the new line of pixels, so that d[i] = min(s[j][i]) over all j, i

Я читал на RescaleOp , но не выяснил, как реализовать эту функцию - это, по общему признанию, странный тип масштабирования. Кто-нибудь может дать мне советы о том, как это сделать? В худшем случае я полагаю, что могу просто зарезервировать целевой ImageBuffer и скопировать пиксели, следующие за псевдокодом, но мне было интересно, есть ли лучший способ.

1 Ответ

1 голос
/ 29 марта 2010

Методы RescaleOp включают параметр RenderingHints. Есть подсказка под названием KEY_INTERPOLATION, которая решает, какой цвет использовать при масштабировании изображения.

Если вы используете значение VALUE_INTERPOLATION_NEAREST_NEIGHBOR для KEY_INTERPOLATION, Java будет использовать исходные цвета, а не какой-либо тип алгоритма для пересчета новых цветов.

Таким образом, вместо того, чтобы белые линии стали серыми или какой-то другой смесью цветов, вы получите либо белые линии, либо вообще не получите никаких линий. Все зависит от коэффициента масштабирования и четной или нечетной строки. Например, если вы масштабируете вдвое, то каждая горизонтальная линия размером 1 пиксель имеет как минимум 50% -ное изменение в новом изображении. Однако, если бы белые линии имели высоту два пикселя, у вас была бы 100% вероятность появления белой линии.

Это, вероятно, самое близкое, что вы получите, кроме написания собственного метода масштабирования. К сожалению, я не вижу других подсказок, которые могли бы помочь в дальнейшем.

Чтобы реализовать собственный метод масштабирования, вы можете создать новый класс, который реализует интерфейс BufferedImageOp, и реализовать метод filter(). Используйте getRGB() и setRGB() на объекте BufferedImage, чтобы получить пиксели от исходного изображения и установить пиксели на новом изображении.

...