接着上次的一篇文章关于“在一个图片上写字并保存”,上次说到
对于图片的格式虽然没有严格要求,但是在使用BMP的时候,由于QImage里不支持RGB565的格式,会导致setPen没有效果,不能写字,所以必须先转换成任意一种Qt可以支持的格式,然后再写,弄完后,如果需要保留256色,可以选择再转回带调色盘的Format_Indexed8就可以了.
但是上次这里有个问题,Indexed_8是带有调色盘的转换格式,当不带调色盘直接使用的时候会导致画面非常的差,因此此处的代码需要修改
第一步还是创建一个新的合成的图片
- void Widget::SaveImage()
- {
- QImage image = QPixmap(fileName).toImage();//绝对路径
- //以你原来的那张图片来
- //构造一个image
- QPainter painter(&image); //为这个QImage构造一个QPainter
- painter.setCompositionMode(QPainter::CompositionMode_SourceIn);
- //设置画刷的组合模式CompositionMode_SourceOut这个模式为目标图像在上。
- //改变画笔和字体
- QPen pen = painter.pen();
- pen.setColor(Qt::white);
- QFont font = painter.font();
- font.setBold(true);//加粗
- font.setPixelSize(18);//改变字体大小
- painter.setPen(pen);
- painter.setFont(font);
- painter.drawText(220,190,"XXXXXXXX");
- //将XXXX写在Image的220.190的位置
- image.save("C:/X1.bmp",0);
- //将画好的图片保存起来。
- //可以将png改为其他格式
- }
关键在于之后
void Widget::SaveImage()
{
QImage image = QPixmap(fileName).toImage();//绝对路径
//以你原来的那张图片来
//构造一个image
QImage img = image.convertToFormat(QImage::Format_RGB888); //先转成标准的RGB888或者别的可以支持的模式
QPainter painter(&img); //为这个QImage构造一个QPainter
painter.setCompositionMode(QPainter::CompositionMode_SourceIn);
//设置画刷的组合模式CompositionMode_SourceOut这个模式为目标图像在上。
//改变画笔和字体
QPen pen = painter.pen();
pen.setColor(Qt::white);
QFont font = painter.font();
font.setBold(true);//加粗
font.setPixelSize(18);//改变字体大小
painter.setPen(pen);
painter.setFont(font);
painter.drawText(220,190,"XXXXXXXX");
//将Hello写在Image的中心
QImage Foto = img.convertToFormat(QImage::Format_Indexed8); //再用8位指标转化成Colormap
Foto.save("C:/X1.bmp",0);
//将画好的图片保存起来。
//可以将png改为其他格式
}
注意红色的这行,不能直接这样
在这里,我套用的是windows的256色的调色盘,头文件加入
/*-----------windows 256色颜色索引表----------------------*/
unsigned char rgb_quad[1024] = {
0, 0, 0, 0, 0, 0, 128, 0, 0, 128, 0, 0, 0, 128, 128, 0,
128, 0, 0, 0, 128, 0, 128, 0, 128, 128, 0, 0, 192, 192, 192, 0,
192, 220, 192, 0, 240, 202, 166, 0, 0, 32, 64, 0, 0, 32, 96, 0,
0, 32, 128, 0, 0, 32, 160, 0, 0, 32, 192, 0, 0, 32, 224, 0,
0, 64, 0, 0, 0, 64, 32, 0, 0, 64, 64, 0, 0, 64, 96, 0,
0, 64, 128, 0, 0, 64, 160, 0, 0, 64, 192, 0, 0, 64, 224, 0,
0, 96, 0, 0, 0, 96, 32, 0, 0, 96, 64, 0, 0, 96, 96, 0,
0, 96, 128, 0, 0, 96, 160, 0, 0, 96, 192, 0, 0, 96, 224, 0,
0, 128, 0, 0, 0, 128, 32, 0, 0, 128, 64, 0, 0, 128, 96, 0,
0, 128, 128, 0, 0, 128, 160, 0, 0, 128, 192, 0, 0, 128, 224, 0,
0, 160, 0, 0, 0, 160, 32, 0, 0, 160, 64, 0, 0, 160, 96, 0,
0, 160, 128, 0, 0, 160, 160, 0, 0, 160, 192, 0, 0, 160, 224, 0,
0, 192, 0, 0, 0, 192, 32, 0, 0, 192, 64, 0, 0, 192, 96, 0,
0, 192, 128, 0, 0, 192, 160, 0, 0, 192, 192, 0, 0, 192, 224, 0,
0, 224, 0, 0, 0, 224, 32, 0, 0, 224, 64, 0, 0, 224, 96, 0,
0, 224, 128, 0, 0, 224, 160, 0, 0, 224, 192, 0, 0, 224, 224, 0,
64, 0, 0, 0, 64, 0, 32, 0, 64, 0, 64, 0, 64, 0, 96, 0,
64, 0, 128, 0, 64, 0, 160, 0, 64, 0, 192, 0, 64, 0, 224, 0,
64, 32, 0, 0, 64, 32, 32, 0, 64, 32, 64, 0, 64, 32, 96, 0,
64, 32, 128, 0, 64, 32, 160, 0, 64, 32, 192, 0, 64, 32, 224, 0,
64, 64, 0, 0, 64, 64, 32, 0, 64, 64, 64, 0, 64, 64, 96, 0,
64, 64, 128, 0, 64, 64, 160, 0, 64, 64, 192, 0, 64, 64, 224, 0,
64, 96, 0, 0, 64, 96, 32, 0, 64, 96, 64, 0, 64, 96, 96, 0,
64, 96, 128, 0, 64, 96, 160, 0, 64, 96, 192, 0, 64, 96, 224, 0,
64, 128, 0, 0, 64, 128, 32, 0, 64, 128, 64, 0, 64, 128, 96, 0,
64, 128, 128, 0, 64, 128, 160, 0, 64, 128, 192, 0, 64, 128, 224, 0,
64, 160, 0, 0, 64, 160, 32, 0, 64, 160, 64, 0, 64, 160, 96, 0,
64, 160, 128, 0, 64, 160, 160, 0, 64, 160, 192, 0, 64, 160, 224, 0,
64, 192, 0, 0, 64, 192, 32, 0, 64, 192, 64, 0, 64, 192, 96, 0,
64, 192, 128, 0, 64, 192, 160, 0, 64, 192, 192, 0, 64, 192, 224, 0,
64, 224, 0, 0, 64, 224, 32, 0, 64, 224, 64, 0, 64, 224, 96, 0,
64, 224, 128, 0, 64, 224, 160, 0, 64, 224, 192, 0, 64, 224, 224, 0,
128, 0, 0, 0, 128, 0, 32, 0, 128, 0, 64, 0, 128, 0, 96, 0,
128, 0, 128, 0, 128, 0, 160, 0, 128, 0, 192, 0, 128, 0, 224, 0,
128, 32, 0, 0, 128, 32, 32, 0, 128, 32, 64, 0, 128, 32, 96, 0,
128, 32, 128, 0, 128, 32, 160, 0, 128, 32, 192, 0, 128, 32, 224, 0,
128, 64, 0, 0, 128, 64, 32, 0, 128, 64, 64, 0, 128, 64, 96, 0,
128, 64, 128, 0, 128, 64, 160, 0, 128, 64, 192, 0, 128, 64, 224, 0,
128, 96, 0, 0, 128, 96, 32, 0, 128, 96, 64, 0, 128, 96, 96, 0,
128, 96, 128, 0, 128, 96, 160, 0, 128, 96, 192, 0, 128, 96, 224, 0,
128, 128, 0, 0, 128, 128, 32, 0, 128, 128, 64, 0, 128, 128, 96, 0,
128, 128, 128, 0, 128, 128, 160, 0, 128, 128, 192, 0, 128, 128, 224, 0,
128, 160, 0, 0, 128, 160, 32, 0, 128, 160, 64, 0, 128, 160, 96, 0,
128, 160, 128, 0, 128, 160, 160, 0, 128, 160, 192, 0, 128, 160, 224, 0,
128, 192, 0, 0, 128, 192, 32, 0, 128, 192, 64, 0, 128, 192, 96, 0,
128, 192, 128, 0, 128, 192, 160, 0, 128, 192, 192, 0, 128, 192, 224, 0,
128, 224, 0, 0, 128, 224, 32, 0, 128, 224, 64, 0, 128, 224, 96, 0,
128, 224, 128, 0, 128, 224, 160, 0, 128, 224, 192, 0, 128, 224, 224, 0,
192, 0, 0, 0, 192, 0, 32, 0, 192, 0, 64, 0, 192, 0, 96, 0,
192, 0, 128, 0, 192, 0, 160, 0, 192, 0, 192, 0, 192, 0, 224, 0,
192, 32, 0, 0, 192, 32, 32, 0, 192, 32, 64, 0, 192, 32, 96, 0,
192, 32, 128, 0, 192, 32, 160, 0, 192, 32, 192, 0, 192, 32, 224, 0,
192, 64, 0, 0, 192, 64, 32, 0, 192, 64, 64, 0, 192, 64, 96, 0,
192, 64, 128, 0, 192, 64, 160, 0, 192, 64, 192, 0, 192, 64, 224, 0,
192, 96, 0, 0, 192, 96, 32, 0, 192, 96, 64, 0, 192, 96, 96, 0,
192, 96, 128, 0, 192, 96, 160, 0, 192, 96, 192, 0, 192, 96, 224, 0,
192, 128, 0, 0, 192, 128, 32, 0, 192, 128, 64, 0, 192, 128, 96, 0,
192, 128, 128, 0, 192, 128, 160, 0, 192, 128, 192, 0, 192, 128, 224, 0,
192, 160, 0, 0, 192, 160, 32, 0, 192, 160, 64, 0, 192, 160, 96, 0,
192, 160, 128, 0, 192, 160, 160, 0, 192, 160, 192, 0, 192, 160, 224, 0,
192, 192, 0, 0, 192, 192, 32, 0, 192, 192, 64, 0, 192, 192, 96, 0,
192, 192, 128, 0, 192, 192, 160, 0, 240, 251, 255, 0, 164, 160, 160, 0,
128, 128, 128, 0, 0, 0, 255, 0, 0, 255, 0, 0, 0, 255, 255, 0,
255, 0, 0, 0, 255, 0, 255, 0, 255, 255, 0, 0, 255, 255, 255, 0
};
然后此处代码改成
QVector<QRgb> colorTable;
for (int i = 0; i < 256; i++){
colorTable.push_back(qRgb(rgb_quad[i * 4], rgb_quad[i * 4 + 1], rgb_quad[i * 4 + 2]));
}
image_End.setColorTable(colorTable);
QImage Foto = img.convertToFormat(QImage::Format_Indexed8, colorTable, Qt::AutoColor);
如果此处需要的是8位的灰度图,则是不需要头文件的调色板,此处直接改为
QVector<QRgb> grayTable;
for(int i = 0; i < 256; i++)
graytable.push_back(qRgb(i,i,i));
qi->setColorTable(grayTable);
QImage Foto = img.convertToFormat(QImage::Format_Indexed8, colorTable, Qt::AutoColor);
这样就可以了
另外转载一篇关于灰度的贴,因为有的研究表明上面的文章说的方法不是很好。需要的请看下面一篇博文