2009-05-31 7 views
8

필자는 합리적인 경험을 가진 Java 프로그래머이지만 Java2D는 비교적 새로운 사람입니다. 이미지의 크기를 조정하려고하지만 품질이 좋지 않습니다. 이미지는 패널의 미리보기이므로 텍스트 및 텍스트 필드와 같은 요소가 포함됩니다. 나는 항상 아래로 스케일을 조정할 것이고 결코 위로하지 않을 것이다. Java2D : 스케일링 문제

현재 나는 다음과 같은 코드를 사용하고 있습니다 : -
g.drawImage(panelImage, 0, 0, scaledWidth, scaledHeight, null); 

panelImage 전체 크기의 미리보기 (BufferedImage의)와 scaledWidth 및 scaledHeight가

는 각각의 대상 차원이다. 나는 텍스트 필드와 같은 것들의 텍스트와 가장자리에서 많은 세부 사항을 잃어 가고있는 것 같습니다.

이미지 크기를 조정할 때 더 나은 호출이 필요합니까?

덕분에, 존

답변

11

제안은 먼저 별도의 BufferedImage에 이미지 크기를 조정하는 것입니다. 그 이유는 더 나은 품질의 스케일 된 이미지를 생성하기 위해 BufferedImageGraphics2D 객체를 얻을 수 있기 때문입니다.

Graphics2DGraphics2D 개체가 이미지 처리를 수행해야하는 방식을 지시하는 "렌더링 힌트"를 허용 할 수 있습니다. 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(); 

다른 렌더링 힌트 :

거친 (테스트되지 않은) 코드는 다음과 같이 작동합니다

Controlling Rendering Quality The Java Tutorials의 섹션 o Graphics2D 개체의 렌더링 품질을 제어하는 ​​방법에 대한 자세한 정보가 있습니다.

일반적으로 그래픽 인터페이스를 다루는 데 대한 정보를 얻기 위해 Chet Haase와 Romain Guy의 Filthy Rich Clients을 적극 권장합니다. 이미지의 스케일링 문제를 다루는 책의 한 섹션이 있습니다.

+0

감사합니다. 나는이 책의 사본을 가지고 있으며 그 책을 읽으려고 그 책을 읽었습니다. 게시하기 전에 거기를보아야한다고 생각 했어야합니다. 나는 스케일링을위한 힌트를 렌더링하는 것을 완전히 잊었다. 감사! John – Johnathan

+0

당신은 환영합니다 :) 페이지 98-113은 이미지 스케일링을 다루며 몇 가지 좋은 예를 포함합니다. 특히 흥미로운 점은 104 페이지에 제시된 점진적 쌍 선형 스케일링이라는 아이디어였습니다. – coobird

+0

그래, 그걸 보았으나 내 응용 프로그램이 실제로 그것을 보장한다고 생각하지 않습니다. BICUBIC 또는 BILINEAR은 나를 위해 충분합니다. 실험 할 시간! – Johnathan

2

당신이 호출해야 할 수 있음 : 내가 할 수

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

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

Coobird에는 올바른 아이디어가 있습니다. 또한 RenderingHints.VALUE_INTERPOLATION_BILINEAR 보간을 시도하고 더 멋지게 보이는지 봅니다. Bicubic은 업 스케일링 할 때 더 잘 작동합니다. 다운 스케일링 할 때 최상의 결과를 얻으려면을 다운 스케일해야합니다. 원하는 해상도에 가까워 질 때까지 (예 : 반으로 줄이거 나 이미지가 너무 작아 질 때까지) 해상도를 반으로 줄이고 다시 반 등하십시오.마지막 단계는 원하는 해상도로 축소하는 것입니다.

예를 들어, 사용자의 입력 이미지가 800 × 600라고하자 당신은 는 160x120로 다운 스케일 원하는 :

  1. 저소득층 50 %을. ->400x300
  2. 다운 스케일 50 %. ->200x150
  3. 다운 스케일 to 160x120.
+0

몇 단계의 축소가 이점이되는 이유는 무엇입니까? 제발 정교하게 : D –

+0

여기에 주제에 뭔가가있다 : http://www.nobel-joergensen.com/roller/java/entry/downscaling_images_in_java 그 이외에는 아무것도 없어,하지만 내 경험에 계단 축소 더 나은 최종 결과를 제공합니다. 그럴만 한 가치가있다. :) – MH114

+1

이것은 "progressive bilinear scaling"의 배경입니다. 여러 단계에서 쌍 선형 스케일링을 수행하면 이미지의 단일 단계 바이블 리니어 재배치를 수행하여 각 픽셀의 정보가 삭제되지 않고 보존됩니다. – coobird

1

Coobird는 작은 축소판에 대해 좋은 결과를 얻으려면 점진적으로 축소 (BICUBIC 사용 권장)해야합니다. Image.getScaledInstance는 AREA_AVERAGED 방식으로이 작업을 수행했지만 Chris Campbell이 "Perils of Image.getScaledInstance()"기사에서 제안한 점진적인 축소보다 훨씬 느립니다.

여기에 셀프 프로모션을 권유하지만, imgscalr 라이브러리에 이미지 스케일링에 관해서는 소수의 "네이티브 Java 베스트 프랙티스"를 사용했습니다.

아파치 2 라이선스에 따라 제공되며 소스는 모두 GitHub에 있습니다. 라이브러리의 목적은 기본 Java에서 쉽게 이미지 스케일링 (1 클래스, 5 정적 메소드)을 수행하고 최상의 결과 (원래 원하는 것)를 보장하는 것이 었습니다. 가장 빠른 결과 (대형 이미지) 또는 둘 사이의 균형을 맞추고 라이브러리가 사용할 책을 결정하게하십시오.

"내 이미지 크기를 조절하고 내 방식으로 벗어날 수있는"라이브러리를 원했고 며칠 동안 모든 게시물을 읽은 후 고통 지점을 언급하면서 (내 자신뿐) 방금 돌아 다니며 공유하고있는 lib를 원했습니다. 도움이 될만한 사람을위한 작업.

+0

원본 사이트가 지금 답장을 보내지 않고 lib 디렉토리의 공식 저장소가 https://github.com/rkalla/imgscalr 인 것으로 보입니다 –

+0

예 repo를 찾았습니다. 이전의 모든 버즈를 닫았습니다. 미디어 '물건 (나는 그것을 유지하기 위해 약 5 년 동안 시간이 없었습니다) 내 개인 레포 공간에 모든 것을 옮겼습니다. 또한 기본 Maven 저장소에 있습니다. –