2010-03-19 3 views
2

이미지 크기 조정에 문제가 있습니다. 다음 코드를 사용하여 이미지의 크기를 조절할 때 이미지의 아래쪽이나 오른쪽에 줄이 생깁니다.Java : AffineTransform을 사용하여 이미지 크기를 조절할 때 줄이 나타납니다.

double scale = 1; 
if (scaleHeight >= scaleWidth) { 
    scale = scaleWidth; 
} else { 
    scale = scaleHeight; 
} 
AffineTransform af = new AffineTransform(); 
af.scale(scale, scale); 

AffineTransformOp operation = new AffineTransformOp(af, AffineTransformOp.TYPE_NEAREST_NEIGHBOR); 
BufferedImage bufferedThumb = operation.filter(img, null); 

원본 이미지

enter image description here

선이 나타나는 이유

enter image description here

사람이 알고 있나요 스케일링 된 이미지?

감사합니다.

편집 :

추가 된 전체 메소드 코드 :

public static final int SPINNER_MAX_WIDTH = 105; 
public static final int SPINNER_MAX_HEIGHT = 70; 

public void scaleImage(BufferedImage img, int maxWidth, int maxHeight, String fileName) { 
    double scaleWidth = 1; 
    double scaleHeight = 1; 

    if (maxHeight != NOT_SET) { 
     if (img.getHeight() > maxHeight) { 
      scaleHeight = (double) maxHeight/(double) img.getHeight(); 
     } 
    } 

    if (maxWidth != NOT_SET) { 
     if (img.getWidth() > maxWidth) { 
      scaleWidth = (double) maxWidth/(double) img.getWidth(); 
     } 
    } 

    double scale = 1; 

    if (scaleHeight >= scaleWidth) { 
     scale = scaleWidth; 
    } else { 
     scale = scaleHeight; 
    } 

    AffineTransform af = new AffineTransform(); 
    af.scale(scale, scale); 

    AffineTransformOp operation = new AffineTransformOp(af, AffineTransformOp.TYPE_NEAREST_NEIGHBOR); 
    BufferedImage bufferedThumb = operation.filter(img, null); 

    if (bufferedThumb != null) { 
     File imageFile = new File(fileName); 
     String fileType = fileName.substring(fileName.lastIndexOf(".") + 1); 
     try { 
      ImageIO.write(bufferedThumb, fileType, imageFile); 
     } catch (IOException e) { 
      logger.error("Failed to save scaled image: " + fileName + "\n" + e.getMessage()); 
     } 
    } 
} 

SPINNER_MAX_ * 상수로 설정되어 메소드 호출에의 maxWidth 및 maxHeight의 매개 변수를 설정합니다.

감사합니다.

+0

이미지를 입력으로 사용하여 코드를 실행했는데 문제가 없습니다. 'scaleWidth' /'scaleHeight'에 무엇을 사용하고 있습니까? 어떻게 이미지를로드하고 있습니까? 어떻게 표시하고 저장합니까? – Ash

+0

나는 완벽한 방법을 추가했다. - 고마워. – Malakim

답변

1

bufferedThumb을 어떻게 조작 할 수 있습니까? 코드를 파일에 저장하면 문제가 없어 질 수 있습니다.

ImageIO.write(bufferedThumb, "PNG", new File("img.png")); 

어떤 자바 버전을 사용하십니까?

편집 됨 :

당신이 시도 할 수있는 것은 다음과 같이 명시 적으로 최종 이미지를 구축하는 것입니다

BufferedImage bufferedThumb = new BufferedImage(maxWidth, maxHeight, BufferedImage.TYPE_INT_ARGB); 
operation.filter(img, bufferedThumb); 

를 사용하고 있습니다 어떤 색상 모드를 확인 할 수 있습니다.

나는 당신의 문제가이 버그에 관련이있을 수 있습니다 생각 : http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6725106

또 다른 것은 어쩌면 같은 differnt 한 보간 형 사용하는 것입니다 자세한 내용은

AffineTransformOp.TYPE_BILINEAR 

을 살펴 있습니다 http://www.dpreview.com/learn/?/key=interpolation

+0

완전한 메소드 추가 - JDK 1.6.0_18을 사용합니다. 감사합니다. – Malakim

+0

아마도 그럴 것입니다. 귀하의 제안을 시도하고 그들이 문제를 해결하는지 확인해 보도록하겠습니다. 감사합니다. – Malakim

관련 문제