需求背景:使用华大身份证读卡器模块读取身份证信息,通过模块读取的图片为 *.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界面开发程序中,需要将背景为白色的图片改为透明
- void ConvertImageToTransparent(QPixmap qPixmap)
- {
- QImage image = qPixmap.toImage();
- image = image.convertToFormat(QImage::Format_ARGB32);
- union myrgb
- {
- uint rgba;
- uchar rgba_bits[4];
- };
- myrgb* mybits =(myrgb*) image.bits();
- int len = image.width()*image.height();
- while(len --> 0)
- {
- mybits->rgba_bits[3] = (mybits->rgba== 0xFFFFFFFF)?0:255;
- mybits++;
- }
- }