문제

저는 경험이 풍부한 Java 프로그래머이지만 Java2D를 처음 접한 사람입니다.이미지 크기를 조정하려고 하는데 결과 품질이 좋지 않습니다.이미지는 패널의 미리보기이므로 텍스트 및 텍스트 필드와 같은 항목이 포함되어 있습니다.나는 항상 규모를 축소할 것이며 결코 확대하지 않을 것입니다.

현재 다음 코드를 사용하고 있습니다.

g.drawImage(panelImage, 0, 0, scaledWidth, scaledHeight, null);

여기서 panelImage는 전체 크기 미리보기(BufferedImage)이고 scaledWidth 및 scaledHeight는 각각의 대상 크기입니다.텍스트 필드 등의 텍스트와 가장자리에서 많은 세부 정보가 손실되는 것 같습니다.

이미지 크기를 조정하는 데 사용해야 하는 더 나은 호출이 있습니까?

고마워요, 존

도움이 되었습니까?

해결책

내가 할 수 있는 제안은 먼저 이미지의 크기를 별도의 크기로 조정하는 것입니다. BufferedImage.그 이유는, Graphics2D 의 대상 BufferedImage 더 나은 품질의 스케일링된 이미지를 생성하기 위해 얻을 수 있습니다.

Graphics2D 이미지 처리가 수행되어야 하는 방식을 지시하는 "렌더링 힌트"를 받아들일 수 있습니다. Graphics2D 물체.그만큼 setRenderingHint 메소드는 렌더링 힌트를 설정하는 데 사용할 수 있는 메소드 중 하나입니다.렌더링 힌트는 RenderingHints 수업을 사용할 수 있습니다.

그럼 그걸 이용해서 Graphics2D 객체에 이미지를 그릴 수 있습니다. BufferedImage 이전에 지정한 렌더링 힌트를 사용합니다.

대략적인(테스트되지 않은) 코드는 다음과 같이 작동합니다.

BufferedImage scaledImage = new BufferedImage(
    scaledWidth,
    scaledHeight,
    BufferedImage.TYPE_INT_RGB
);

Graphics2D g = scaledImage.createGraphics();
g.setRenderingHints(
    RenderingHints.Key.KEY_INTERPOLATION,
    RenderingHints.VALUE_INTERPOLATION_BICUBIC
);

g.drawImage(panelImage, 0, 0, scaledWidth, scaledHeight, null);
g.dispose();

관심 있는 다른 렌더링 힌트는 다음과 같습니다.

그만큼 렌더링 품질 제어 Java Tutorials 섹션에는 렌더링 품질을 제어하는 ​​방법에 대한 추가 정보도 있습니다. Graphics2D 사물.

일반적으로 그래픽 인터페이스를 다루는 방법에 대한 매우 유용한 정보 소스는 다음과 같습니다. 더러운 부자 고객 Chet Haase와 Romain Guy의 작품을 적극 추천합니다.책에는 이미지 크기 조정 문제를 다루는 섹션이 있는데, 꽤 관련성이 있어 보입니다.

다른 팁

전화해야 할 수도 있습니다.

 g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);

그리고

g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

Coobird는 충분히 작은 썸네일에 대한 잘 생긴 결과를 얻으려면 점진적으로 다운 스케일 (바람직하게는 Bicubic을 사용)해야한다는 것이 옳습니다. image.getScaledInstance area_avered 접근법 에서이 작업을 수행하는 데 사용되었지만 Chris Campbell이 그의 "Image.getScaledInstance ()의 위험에 대해 제안한 원래의 증분 다운 스케일보다 훨씬 느립니다.

여기서 자체 홍보를 실례합니다. 그러나 나는 이미지 스케일링이라는 라이브러리로 이미지 스케일링과 관련하여 소수의 "Native Java 모범 사례"를 굴 렸습니다. imgscalr.

Apache 2 라이센스에 따라 사용할 수 있으며 소스는 모두 Github에 있습니다. 도서관의 목표는 기본 Java Dead-Easy (1 클래스, 5 개의 정적 방법)에서 이미지 스케일링을 만들고 가장 좋은 결과 (원래 원하는 것), 가장 빠른 결과 (큰 이미지 중 스케일링 할 때 훌륭합니다)를 보장하는 것이 었습니다. ) 또는 둘 사이의 균형과 도서관이 어떤 것을 사용할 것인지 결정하도록합니다.

나는 단지 "내 이미지를 조정하고 내 길을 벗어날 수있는"lib를 원했고, 나는 며칠 동안이 모든 게시물을 읽은 후 (내 자신도)를 돌리고 다른 사람을 위해 일을 공유하고 있었기 때문에 며칠 동안이 게시물을 읽은 후 그렇지 않으면 도움이 될 수 있습니다.

Coobird 올바른 아이디어가 있습니다. 나는 또한 시도 할 것이다 RenderingHints.VALUE_INTERPOLATION_BILINEAR 보간하고 그것이 더 멋지게 보이는지 확인하십시오. 그러나 Bicubic은 업 스케일링 할 때 더 잘 작동합니다. 다운 스케일링시 최상의 결과를 얻으려면 하나가 있어야합니다 여러 단계로 다운 스케일. 먼저 해상도를 절반으로 반한 다음 다시 반으로 반으로 반복하십시오. 마지막 단계는 원하는 해상도로 확장하는 것입니다.

예를 들어 입력 이미지가 800x600 그리고 당신은 다운 스케일을 원합니다 160x120:

  1. 다운 스케일 50%. --> 400x300
  2. 다운 스케일 50%. --> 200x150
  3. 다운 스케일 160x120.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top