Qt 如何使用 QImage 设置指定的颜色为透明色?

Qt 如何使用 QImage 设置指定的颜色为透明色?

需求背景:使用华大身份证读卡器模块读取身份证信息,通过模块读取的图片为 *.BMP 格式,无透明色,故绘制到身份证上无法美观的显示。

通过查询身份证拍摄要求,得知不得穿白色的领子拍摄,采用白底背景。

通过工具得知图片底色颜色值 QColor(254,254,254,255)

故只需遍历图片把颜色值等于图片底色的值设置为 QColor(254,254,254,0)

void IDCard::Bmp2Png(QImage &bmp,QString &path)
{
    //BMP颜色格式转换成RGBA颜色格式
    bmp  = bmp.convertToFormat(QImage::Format_RGBA8888_Premultiplied,Qt::NoFormatConversion);
    int bmpWidth = bmp.width();
    int bmpHeight = bmp.height();
    //透明颜色
    QColor bmpBack(254,254,254);
    QColor bmpBackA(254,254,254,0);
    for(int i=0;i< bmpWidth;++i)
    {
        for(int j=0;j<bmpHeight;++j)
        {
            //如果身份证背景色等于 Color(254,254,254,255),则设置为透明色 Color(254,254,254,0)
            if(bmp.pixelColor(i,j)==bmpBack)
            {
                bmp.setPixelColor(i,j,bmpBackA);
            }
        }
    }
    //保存转换的图片
    bmp.save(path);
    return;
}Qt QImage图片透明设置(Thinkvd开发日志)


   开发Thinkvd中的player,设置透明度用的是sdl来实现的,转换中的水印用的是png, 如何设置水印的透明度,实际上要求把图片转换成带alpha的32位即可。

实现代码:

//! [8]void ImageComposer::recalculateResult(){    
 int alpha = 100;   
 QPainter::CompositionMode mode = currentMode();

    QPainter painter(&resultImage);   
 painter.setCompositionMode(QPainter::CompositionMode_Source);   
 painter.fillRect(resultImage.rect(), Qt::transparent);   
 painter.setCompositionMode(QPainter::CompositionMode_SourceOver);  
  //painter.drawImage(0, 0, destinationImage);
    //painter.setCompositionMode(mode); 
   painter.drawImage(0, 0, sourceImage);   
 //painter.setCompositionMode(QPainter::CompositionMode_DestinationOver);   
 //painter.fillRect(resultImage.rect(), Qt::white); 
//painter.fillRect(resultImage.rect(), QColor(0, 0, 0, alpha));  
painter.setCompositionMode(QPainter::CompositionMode_DestinationIn); 
painter.fillRect(resultImage.rect(), QColor(0, 0, 0, alpha));

    painter.end(); 
resultImage.save("f:/tmp/dddd.png");

  resultLabel->setPixmap(QPixmap::fromImage(resultImage)); }

注意:1. painter.setCompositionMode(QPainter::CompositionMode_DestinationIn);不能少2.  painter.drawImage与 painter.fillRect(resultImage.rect(), QColor(0, 0, 0, alpha));顺序.



Qt处理图片背景为透明色

Qt界面开发程序中,需要将背景为白色的图片改为透明

[cpp]  view plain  copy
  1. void ConvertImageToTransparent(QPixmap qPixmap)  
  2. {  
  3.     QImage image = qPixmap.toImage();  
  4.     image = image.convertToFormat(QImage::Format_ARGB32);  
  5.     union myrgb  
  6.     {  
  7.         uint rgba;  
  8.         uchar rgba_bits[4];  
  9.     };  
  10.     myrgb* mybits =(myrgb*) image.bits();  
  11.     int len = image.width()*image.height();  
  12.     while(len --> 0)  
  13.     {  
  14.         mybits->rgba_bits[3] = (mybits->rgba== 0xFFFFFFFF)?0:255;  
  15.         mybits++;  
  16.     }  
  17. }  

 Qt 中如何实现对图片设置透明色显示

咋看题目可能不是很明白是什么意思,用下面的一个简单的例子来简单的解释下。


比如说下面的一张图1:


图 1 


我们通过设置透明色为分周围的粉红色,就得到下面图2这个效果。



   图 2 


当然,也可以不必这么麻烦,可以直接通过ps等图片处理的工具,把这个图片处理成透明背景的图片然后保存成png格式也可,我这里只是想说说怎么用Qt实现。怎么写过文章,写的不好大家别扔砖哈,错误之处还请大家指出,共同进步!呵呵。


好啦,不说多的,直接上代码吧!


  1. QImage  TestDialog::getTransImage(QImage image , QPoint ponit)  
  2.   
  3.   
  4. {  
  5.   
  6.   
  7.     //判断所取的点是否在图片内部  
  8.   
  9.   
  10.     if( image.valid( ponit ) )  
  11.   
  12.   
  13.     {  
  14.   
  15.   
  16.         QRgb  rgb = image.pixel( ponit );  
  17.   
  18.   
  19.         QVector<QRgb> rgbVector = image.colorTable () ;  
  20.   
  21.   
  22.         for (int i = 0; i < rgbVector.size(); ++i)  
  23.   
  24.   
  25.         {  
  26.   
  27.   
  28.              if( rgbVector.at(i) == rgb )  
  29.   
  30.   
  31.              {  
  32.   
  33.   
  34.                  /* 
  35.  
  36.  
  37.                 注意这里如果要变成黑色背景的话就是QRgb rgb2 = QColor(0, 0, 0, 0).rgb() ; 
  38.  
  39.  
  40.                 留意 rgb()与rgba()的区别 
  41.  
  42.  
  43.                 */  
  44.   
  45.   
  46.                  QRgb rgb2 = QColor(0, 0, 0, 0).rgba() ;  
  47.   
  48.   
  49.                  image.setColor( i,rgb2 );  
  50.   
  51.   
  52.                  return image ;  
  53.   
  54.   
  55.              }  
  56.   
  57.   
  58.          }  
  59.   
  60.   
  61.     }  
  62.   
  63.   
  64.     return image ;  
  65.   
  66.   
  67. }  



上面用到的两个重要的函数就是:
QRgb QImage::pixel ( const QPoint & position ) const
这个得到图片中某点的色素的rgb的值。
void QImage::setColor ( int index, QRgb colorValue )
设定图片的color table的索引值index所对应的颜色为 colorValue 。呵呵,英语很菜的,还是直接看文档吧,我把我的整个测试程序放到这个下面,感兴趣的可以看看,最后程序运行的结果如下:

测试程序的下载地址:

http://download.csdn.net/detail/xj178926426/3893256


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值