2013-10-29 14 views
1

내가 가진 QImage의 알파를 변경해야합니다. 그래서 다른 QImages와 뒤섞여 있습니다. 이것은 신속하게 켜고 끌 필요가 있습니다.QT 변경 QImage 알파

이전에는 모든 단일 이미지를 다시 만들고 각기 다른 알파 값으로 새로운 색상을 지정해야했습니다. 그러나 이제 다시 그리기와 그림 그리기 대신에 같은 원본 이미지를 유지하고 싶습니다.

나는이 지금처럼 할 노력하고있어 :

QImage image; 
unsigned int rgb; 

for(int y=0;y<image.height();y++){ 
    for(int x=0;x<image.width();x++){ 
    rgb=image.pixel(x,y); 
    image.setPixel(x,y,qRgba(qRed(rgb),qGreen(rgb),qRed(rgb),120)); 
    } 
} 

은 좀 상당히 예기치 않은 동작을 얻고있다. 이미지를 전환 할 때 가끔 색상이 손실되거나 알파가 변경되지 않습니다. 알파가 돌아 왔을 때 알파가 바뀌면 (나는 알파 255를 120 대신 다른 곳으로 하드 코드합니다) 정상으로 돌아 가지 않습니다.

어쨌든이 작업을 수행하는 올바른 방법이 아닌 것 같습니다. 그렇게 어렵지는 않습니다. 알파를 변경하려면 이미지에 단일 함수 호출이 있어야하지만 아직은 찾지 못했던 것 같습니다. 당신이 QGraphicsView 또는 다른 QWidgetQImage를 사용하는 경우

+1

오타가 있습니다. 마지막 두 번째 qRgba() 인수는 qRed 대신 qBlue 여야합니다. –

+1

어떤 상황에서 이미지를 페인트합니까? QPainter를 사용하는 경우 대신 칠할 때 QPainter :: setOpacity를 사용하는 것이 좋습니다. –

답변

1

,이 QGraphicsEffect에 표시되어야합니다

http://qt-project.org/doc/qt-4.8/qgraphicsopacityeffect.html

http://doc-snapshot.qt-project.org/4.8/qwidget.html#setGraphicsEffect

http://doc-snapshot.qt-project.org/4.8/qgraphicsitem.html#setGraphicsEffect

을 당신이 QLabel를 사용하는 경우 , 나는 이것을 시도 할 것이다 :

#include <QLabel> 
#include <QPainter> 

class TransparentQLabel : public QLabel 
{ 
    Q_OBJECT 
public: 
    explicit TransparentQLabel() : QLabel() {} 
    ~TransparentQLabel(){} 
    void setOpacity(const qreal & val) 
    { 
      if (this->pixmap() == null || this->pixmap().isNull()) 
       return; 
      QPixmap result(this->pixmap()->size()); 
      result.fill(Qt::transparent); 

      QPainter painter; 
      painter.begin(&result); 
      painter.setOpacity(val); 
      painter.drawPixmap(0, 0, *(this->pixmap())); 
      painter.end(); 

      QLabel::setPixmap(result); 
    } 
}; 

이 다음 비트는 질문과 약간 관련이 있지만 알아두면 좋습니다. 운영 시스템에 당신의 QApplication의 외부를 적층하는 경우는 다음과 같이 몇 가지가 필요합니다

여기
this->setWindowFlags(Qt::WindowStaysOnTopHint | 
           Qt::FramelessWindowHint | Qt::Tool); 
this->setAttribute(Qt::WA_TranslucentBackground, true); 
this->setAttribute (Qt::WA_TransparentForMouseEvents, true); 

행동이 물건의 예입니다 도움이

http://qt-project.org/wiki/QSplashScreen-Replacement-for-Semitransparent-Images

희망을.

+0

QGraphicsItem을 사용하여 제 3의 링크가 정확하게 찾고자합니다. QGraphicsItem의 기능을 잊어 버렸던 부분을 그리기 위해 사용했던 이미지를 변경하는 데 너무 집중했습니다. 감사합니다 Vash. – RidesTheShortBus

+0

기꺼이 도와 드리겠습니다. http://meta.stackexchange.com/a/5235 :) – phyatt