2017-10-08 39 views
1

저는 8x8 픽셀의 4 채널 png 이미지가 QImage에 의해로드됩니다. 그러면 QImage은 200 배로 조정되므로 이미지의 해상도는 1600x1600이고 원본 픽셀의 크기는 200x200입니다. 그러나이 이미지가 QPixmap의 수단을 통해 QLabel에 추가되고 화면에 표시되면 그려지는 픽셀의 크기가 약간 다를 수 있습니다.크기가 조정 된 QImage를 그릴 때 픽셀 크기를 균일하게 유지하는 방법은 무엇입니까?

나는 Gimp으로 스크린 샷을 찍고 그려진 이미지를 더 자세히 보았습니다. 다른 모든 픽셀은 200 픽셀 너비 대신 201 픽셀이어야합니다. 행의 마지막 픽셀은 보정을 위해 더 작아 지므로 전체 이미지의 끝에 올바른 크기가 적용됩니다.

이 100 예를 들어 괜찮 모든 확장 요인 발생하지 않는 등 같은 256

내 원래의 접근 방식은 QGraphicsViewQGraphicsPixmapItem 경우에 사용하던 같은 2의 거듭 제곱있는 요인이다 Image 대신 GraphicsItem 크기를 조정했습니다. 효과는 동일했습니다.

여기에 어떤 영향이 있습니까? 그리고 무엇이 그것에 대해 할 수 있습니까?

이 문제를 재현하는 코드는 매우 간단합니다

int scale = 200; 
image = QImage("some image file"); 
QPixmap pixmap = QPixmap::fromImage(image.scaled(image.size() * scale)); 
some_label->setPixmap(pixmap); 
+1

이 방법으로 문제를 해결할 수는 없지만 여기 (확대되지 않은) 픽스맵을 그릴 때 직접 조정할 수는 있습니다. https://github.com/gerbilvis/gerbil/blob/master/gui/ 위젯/scaledview.cpp # L103 크기 조정은 여기에 설정된 QTransform을 통해 이루어집니다 : https://github.com/gerbilvis/gerbil/blob/master/gui/widgets/scaledview.cpp#L72 (QTransform은 설정하기가 훨씬 쉽습니다.) 고정 된 규모와 번역) Btw. 이것은 GL 렌더링 백엔드를 사용하는 매우 효율적인 방법입니다. – ypnos

+0

감사합니다. 나는이 문제가 스케일링 알고리즘으로부터 왔을 것이라고 짐작하지 못했을 것이다. 나는 단순한 회화/발표 문제라고 생각했다. 그러나 나는 방금 스케일 된 이미지를 디스크에 저장했다. 팁 고마워 :) – ifschleife

답변

0

내 문제에 대한 쉬운 해결책이 QGraphicsViewQOpenGLWidget을 사용하는 것입니다 밝혀 : 생성자에서

setViewport(new QOpenGLWidget); 

이 한 줄 것입니다 종속성으로 OpenGL을 추가하는 경고가있는 이미지 크기를 조정할 때 훨씬 더 높은 정밀도를 얻습니다. 이 접근법에서 또 다른 문제는 setViewport을 호출하면 QGraphicsView에서 수행 된 많은 설정이 무효화된다는 것입니다. 따라서보기가 UI 파일에 설정되어있는 경우 내 경우와 마찬가지로setViewport 후에 다른 설정자 을 호출해야합니다.

OpenGL없이 작업 할 수있는 더 나은 솔루션을 찾지 못했습니다. 물론 내 자신의 래스터 라이저 작성이 부족합니다.