我参考书籍写了一个改变图片的透明度的程序,现在的问题如下图所示,处理后刷的paint事件完成后,总是不能直接显示背景,而是有个框,请教如何去掉,我试了一些方法,觉得还是图像在混合时的问题,不知如何解决?
#include "pictrans.h"
PicTrans::PicTrans(QWidget *parent,const char * name)
: QWidget(parent)
{
img = new QImage(QString::fromUtf8(name));
}
void PicTrans::slotChanged(int value)
{
dst=*img;
QColor bkColor = palette().color(QPalette::Window);//QColor(0,0,0,255);//
float v = 0.01*value;
int width = img->width();
int height = img->height();
for (int h=0;h<height;h++)
{
for (int w=0;w<width;w++)
{
int alpha = qAlpha(img->pixel(w,h));
if (alpha == 0)
{
int red = qRed(bkColor.rgb());
int green = qGreen(bkColor.rgb());
int blue = qBlue(bkColor.rgb());
dst.setPixel(w,h,qRgb(red,green,blue));
}
else
{
int red = (int)((qRed(bkColor.rgb()))*(1-v)+(qRed(img->pixel(w,h)))*v);
int green = (int)((qGreen(bkColor.rgb()))*(1-v)+(qGreen(img->pixel(w,h)))*v);
int blue = (int)((qBlue(bkColor.rgb()))*(1-v)+(qBlue(img->pixel(w,h)))*v);
dst.setPixel(w,h,qRgb(red,green,blue));
}
}
}
resize(dst.width(),dst.height());
repaint();
}
void PicTrans::paintEvent(QPaintEvent * e)
{
QPainter painter(this);
painter.setOpacity(1);
painter.drawImage(0,0,dst);
}
void PicTrans::SetTransValue(int value)
{
if(value>=0&&value<=100)
slotChanged(value);
}
///////////////////////////////////////////////////////////////////////////////////////
主程序调用
label = new PicTrans(this,IMAGE_IME_LOCAL);
label->setGeometry(547,430,234,194);
//label->setBackgroundOrigin(QWidget::ParentOrigin);
label->SetTransValue(100);