2010-03-29 11 views
1

Java BufferedImage의 크기를 조정하여 평균을 작게 만들지 만 어떤 유형의 평균도 사용하지 않으므로 픽셀 행이 " 빈 "(흰색) 인 경우 대상 이미지의 해당 위치에 흰색 픽셀 행 ("최소 "작업)이 나타납니다. 기본 알고리즘 (getScaledInstance에 지정됨)을 사용하면 충분하게 제어 할 수 없습니다. 나는 다음과 같은 로직을 구현하고 싶습니다 : 나는 RescaleOp에 읽고,하지만이 기능을 구현하는 방법을 생각하지 않은Java의 동작을 지정하는 방법 BufferedImage resize : 평균이 아닌 픽셀 행에 대해 min이 필요합니다.

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 

- 그 것은 틀림 스케일링의 이상한 유형이다. 누구든지이 일을하는 방법에 대한 조언을 제게 제공 할 수 있습니까? 최악의 경우, 목적지 ImageBuffer를 예약하고 의사 코드 다음의 픽셀을 복사 할 수 있다고 생각하지만 더 좋은 방법이 있는지 궁금합니다.

답변

1

RescaleOp 메서드에는 RenderingHints라는 매개 변수가 포함되어 있습니다. KEY_INTERPOLATION이라는 힌트가있어 이미지 크기를 조정할 때 사용할 색상을 결정합니다.

KEY_INTERPOLATION에 VALUE_INTERPOLATION_NEAREST_NEIGHBOR 값을 사용하면 Java는 새로운 유형의 알고리즘을 사용하여 새로운 색상을 다시 계산하지 않고 원래 색상을 사용합니다.

그래서 흰색 선이 회색으로 변하거나 일부 혼합 된 색상 대신 흰색 선을 얻거나 전혀 선을 얻지 못합니다. 그것은 모두 배율 인수에 따라 달라지며 짝수 또는 홀수 행의 경우에도 마찬가지입니다. 예를 들어, 반으로 축소하면 각 1 픽셀 수평선에 새 이미지에 적어도 50 %의 변화가 나타납니다. 그러나 흰색 선의 높이가 두 픽셀 인 경우 흰색 선이 나타날 확률은 100 %입니다.

아마도 자신 만의 스케일링 방법을 쓰는 것 외에 가장 가까운 방법 일 것입니다. 불행히도, 나는 더 이상 도움이 될만한 다른 힌트를 보지 못합니다.

사용자 고유의 크기 조정 메서드를 구현하려면 BufferedImageOp 인터페이스를 구현하는 새 클래스를 만들고 filter() 메서드를 구현할 수 있습니다. BufferedImage 객체에 getRGB()setRGB()을 사용하면 원본 이미지에서 픽셀을 가져 와서 새 이미지에서 픽셀을 설정할 수 있습니다.

+0

아마 맞을 것입니다. 내 자신의 BufferedImageOp를 구현하는 것보다 더 좋은 방법이 없다고 생각합니다. 감사! – tucuxi

관련 문제