这两天在看《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还是太不熟练了。。。。。