• 4952阅读
  • 5回复

急!请教高手一个透明度的问题 [复制链接]

上一主题 下一主题
离线kingnight
 
只看楼主 倒序阅读 楼主  发表于: 2009-11-09

我参考书籍写了一个改变图片的透明度的程序,现在的问题如下图所示,处理后刷的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);
离线kingnight
只看该作者 1楼 发表于: 2009-11-09
各位高手给点意见呀,小弟很急!!!!!!!!
离线kingnight
只看该作者 2楼 发表于: 2009-11-09
各位高手给点意见呀,小弟很急!!!!!!!!
离线午小夜

只看该作者 3楼 发表于: 2009-11-09
void QWidget::setAttribute(Qt::WA_TranslucentBackground);
[操作系统版本]  Windows XP;Linux Ubuntu;Linux Fedora;
[Qt SDK版本]    4.7.0
[SDK 发布日期]  2010.05
[IDE(集成开发环境)] QtCreator
个人网页:http://hi.baidu.com/午小夜
學歷:Royal Jalidon
离线午小夜

只看该作者 4楼 发表于: 2009-11-09
void setWindowOpacity ( qreal level )
[操作系统版本]  Windows XP;Linux Ubuntu;Linux Fedora;
[Qt SDK版本]    4.7.0
[SDK 发布日期]  2010.05
[IDE(集成开发环境)] QtCreator
个人网页:http://hi.baidu.com/午小夜
學歷:Royal Jalidon
离线kingnight
只看该作者 5楼 发表于: 2009-11-10
谢谢楼上,不过这个我都试过了,没效果的
快速回复
限100 字节
 
上一个 下一个