900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > qt android png透明 Qt处理照片实现白色背景转透明

qt android png透明 Qt处理照片实现白色背景转透明

时间:2023-09-13 03:45:48

相关推荐

qt android png透明 Qt处理照片实现白色背景转透明

这两天在看《Qt5 Cadaques》,书是开源的,代码里用到的图片却不是。想照着书中的示例练一练,就自己找了几张图片。需要一个飞船,找了下面这张图片,但是需要处理成背景透明的png图片。windows画图做不到,以前貌似用ps做过,但是ps本身下载安装着实费事费力。忽然灵光一闪,为啥不自己写一个呢。ok,废话不多说了(就当是写日记了),Let's get it done.

工具: Qt

计划用时: 1h

首先需要一个QFileDialog打开图片,直接把帮助文档里的例子拿过来:

_fileName = QFileDialog::getOpenFileName(this,

tr("Open Image"), "/home/xinlei", tr("Image Files (*.png *.jpg *.bmp)"));

然后显示在一个QLabel里:

ui->label->setPixmap(QPixmap::fromImage(*_img));

加一个pushButton,点击后执行process()函数:

void ImgProcessor::on_pushButton_clicked()

{

process();

ui->label->setPixmap(QPixmap::fromImage(*_img));

}

这样,重点就是process()了

处理的大致思想就是,逐像素点遍历,对每个像素点进行判断,如果某像素点的(r,g,b)> =(244, 244, 244)就认为是白色,将该点的Alpha值设为0。这里先设成红色看一下效果。

// const int _targetRed = 244;

// const int _targetBlue = 244;

// const int _targetGreen = 244;

void ImgProcessor::process()

{

QRgb point, newPoint;

for (int i = 0; i < _img->width(); ++i)

for (int j = 0; j < _img->height(); ++j)

{

point = _img->pixel(i, j);

if (qRed(point) >= _targetRed && qBlue(point) >= _targetBlue && qGreen(point) >= _targetGreen)

{

newPoint = qRgba(255, 0, 0, 1);

_img->setPixel(i, j, newPoint);

}

}

}

原图处理后

最后,保存图片(继续使用文档中的示例代码:)

QString saveFile = QFileDialog::getSaveFileName(this, tr("Save File"),

"/home/xinlei/untitled.png",

tr("Images (*.png *.xpm *.jpg)"));

_img->save(saveFile);

Ok,Big problem! 由于读入的图片是一张网上找的jpg格式图片,貌似本身不支持alpha通道,所以没法对img的alhpa值进行修改。所以需要一个新的QImage。下面是修改后的process()函数:

// rlt = QImage(_img->width(), _img->height(), QImage::Format_ARGB32);

void ImgProcessor::process()

{

QRgb point, newPoint;

for (int i = 0; i < _img->width(); ++i)

for (int j = 0; j < _img->height(); ++j)

{

point = _img->pixel(i, j);

if (qRed(point) >= _targetRed && qBlue(point) >= _targetBlue && qGreen(point) >= _targetGreen)

newPoint = qRgba(0, 0, 0, 0);

else

newPoint = qRgba(qRed(point), qBlue(point), qGreen(point), qAlpha(point));

rlt.setPixel(i, j, newPoint);

}

} 呼,用了近两小时的时间,算是完成了预期吧,Qt还是太不熟练了。。。。。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。