2012-10-31 2 views
0

PyQt를 사용 중이며 디스크의 이미지를 QPixmap에로드했습니다.어떻게 QImage와 QPixmap을 결합합니까?

self.mask = QImage(self.image.width(), self.image.height(), QImage.Format_Mono) 
self.mask.fill(0) 

내가 그것을 렌더링 할 때 이미지 위에 마스크에 검은 색 모든 픽셀이 반투명 빨간색으로 그려되도록, 표시하기 위해 두 가지를 결합하고 싶습니다 : 나는 또한 사용하여 마스크를 만들었습니다.

def paintEvent(self, event): 
    p = QPainter(self) 
    r = event.rect() 

    p.drawPixmap(r, self.image, r) 

이 잘 작동 :

그래서 같은 페인트 이벤트에 이미지를 렌더링하는 사용자 정의 위젯을 만들었습니다. 내가 덜 명확한 점은 마스크에서 데이터를 가져와 대상 이미지의 픽셀 위에 반투명 한 빨강을 칠하는 방법입니다.

mask = QPixmap.fromImage(self.mask.createMaskFromColor(self.mask.color(0))) 
p.setClipRegion(QRegion(mask)) 

color = QColor(255, 0, 0, 128) 
p.setPen(Qt.NoPen) 
p.setBrush(QBrush(color)) 
p.drawRect(r) 

를 ... 그러나 그것은 아무것도 그려하지 않습니다 (그리고 나는 돈 경우 전체 이미지 위에 반투명 빨간색 상자를 그립니다

나는 다음과 같이 클리핑 영역으로 마스크를 돌려 시도했습니다 전화 setClipRegion).

마스크를 QImage.Format_ARGB4444_Premultiplied으로 만들고 투명도를 사용하여 시도해 보았습니다. 그리고 이것이 작동하는 동안 내 프로그램에서 마스크를 편집 할 수 있으며 마스크의 일부분이 투명하고 일부가 불투명하다는 것을 확인하면 self.mask.createAlphaMask() 메서드는 흰색 사각형을 반환합니다.

"마스크 만들기"방법이 실제로 어떤 작업을 수행합니까?

+0

완전한 예를 들려 줄 수 있습니까? 그 마스크는 완전 검정이에요. – Avaris

+0

예, 마스크가 완전히 검은 색입니다. 프로그램에서 편집하는 방법이 있습니다. 그것은 나를 위해 문제를 일으키는'QImage'와'QPixmap'을 결합합니다. –

+0

무엇을하고 싶으십니까? 하나의 이미지의 일부분을 강조하는 것입니까? 마스크에 뭐가 들었 니? 픽셀이나 다른 색상을 강조 표시하려는 곳이 검은 색입니까? – Uflex

답변

2

마스크의 디자인을 변경하거나 마스크를 기반으로 새 QImage를 만드십시오. 그런 다음 대상에 QImage를 그립니다. 그것은 작동하는 방법 일뿐만 아니라 단일 픽셀 또는 sth을 그리는 것보다 빠른 방법입니다. 비슷한. 몇 가지 방법을 시도하고 이것은 가장 빠른 지금까지 (QGLWidget에).

: 참고로

QImage dest(<width>, <height>, QImage::Format_ARGB32); 
dest.fill(qRgba(0, 0, 0, 0)); 
for (int y = 0; y < <height>; ++y) { 
    QRgb *destrow = (QRgb*)dest.scanLine(y); 
    for (int x = 0; x < <width>; ++x) { 
     if (<should be marked>) 
      destrow[x] = qRgba(255, 0, 0, 127); 
    } 
} 
painter.drawImage(0, 0, dest); 

는, 여기에 코드를 살펴 :

아이디어는이 같은 직접 QImage에서, 또한 비 표시 픽셀 투명도를 인코딩하고 있다는 것입니다

https://sourceforge.net/p/gerbil/svn/60/tree/trunk/gerbil-gui/bandview.cpp#l59