2014-02-18 2 views
2

현재 Windows에서 이미지 렌더링을위한 상용 라이브러리를 사용하고 있습니다. 이미지 원래 크기보다 작은 크기의 흑백 이미지를 표시 할 때 여전히 대부분이 인식 할 수 있도록,이 라이브러리 회색 이미지를 조정 : QImage 디더링 품질

enter image description here

는 지금은 Qt는 4.8 응용 프로그램과 같은 시도했다. 기본적으로 무슨 완료 호출 : paintRect이 mImage.rect보다 작은

QImage mImage; 
... 
mImage.load(...); 
... 
painter.drawImage(paintRect, mImage, mImage.rect()); 

(). 즉, 잘 작동하지만 출력이 훨씬 덜 만족입니다 :

enter image description here

나는 여러 renderHints (QPainter를 :: SmoothPixmapTransform, 앤티 엘리 어싱, HighQualityAntialiasing)을 시도하고도

mImage = mImage.convertToFormat(QImage::Format_RGB32); 

QPainter를 사용하여 이미지를 변환

: : SmoothPixmapTransform은 약간의 출력 향상을 보였습니다 (스크린 샷에 포함됨). 다른 모든 것들은 아무 것도 변하지 않는 것처럼 보입니다.

내가 뭔가를 잃어버린거야?

감소 크기로 이미지를 표시하는 방법은 어떻습니까?

+0

가로 세로 비율을 유지 하시겠습니까? 'QImage :: scaled'로 이미지의 프리 스케일링을 시도 했습니까 – UmNyobe

+0

가로 세로 비율 유지 : 응용 프로그램에서는 필요하지 않지만 이러한 경우에는 그렇습니다. 프리 스케일링이 없으며, 사용자가 확대/축소하고 따라서 스케일 요소가 항상 변경됩니다. –

답변

4

painter.drawImage(paintRect, mImage, mImage.rect()); 

동안 화가 단지 크기가 다른 경우, 초기 화상으로 이용할지, 화소를 보간하는 것이 가능하다. 두 번째 이미지를 설명 할 것입니다.

만에 (모든 페인트 이벤트를 확장 피하기 위해) 크기 조절 이벤트를

QImage todraw = mImage.scaled(
      paintRect.size(), 
      Qt::IgnoreAspectRatio, 
      Qt::SmoothTransformation); 
... 
painter.drawImage(paintRect, todraw, mImage.rect()); 

당신은 이미지 todraw를 계산하여 스케일 설명서 하고 대신 화가와 함께 사용.

+1

실제로 그 차이가 있습니다. 놀랄 만한. 나는 이것이 버그라고 생각한다. 감사합니다 –

+1

@REDSOFTADAIR 이것은 버그가 아닙니다. QPainter :: drawImage는 이미지 리 스케일링에서 선형 보간을 수행하지 않습니다. 그것은 결코 이런 행동을하지 못했습니다. 픽스맵을 사용하지 않으므로 SmoothPixmapTransform을 사용할 수 없습니다. 이 문제는 앤티 앨리어싱과 관련이 없으므로 앤티 앨리어싱 설정을 사용하면 아무 효과가 없습니다. –