用Qt来进行256色位图的转换
来源:互联网 发布:防止sql注入最佳方法 编辑:程序博客网 时间:2024/06/09 16:05
接着上次的一篇文章关于“在一个图片上写字并保存”,上次说到
对于图片的格式虽然没有严格要求,但是在使用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);
这样就可以了
另外转载一篇关于灰度的贴,因为有的研究表明上面的文章说的方法不是很好。需要的请看下面一篇博文
0 0
- 用Qt来进行256色位图的转换
- 使用FreeImage来进行Qt图片的读入
- 各种位图之间的转换
- 显示 256 色的位图
- 使用stringstream 来进行string和其他类型的转换
- 运用poi来对单元格进行格式转换的方法
- 实现BMP位图色深转换的方法
- 实现BMP位图色深转换的方法
- open外面位图 对位图进行缩放的方法
- 32位位图到24位位图的转换
- 把8bit位图转换位24位图的图片
- 8位位图和24位位图的相互转换
- 32位位图到24位位图的转换
- BMP的8位位图转换24位位图
- 利用SQL2000的DTS来进行数据库的转换!(转换成ACCESS数据库)
- VC位图文件的保存与转换
- 位图索引的使用---星型转换
- 用原生js来将prompt()方法得到的字符串,转换为数字,并进行运算呢?
- 开启ubuntu下lamp的php错误提示
- easy-ui combobox
- 锁屏后还能继续运行只设置UIBackgroundModes就可以了吗
- socket监听端口实现实时通讯
- Spring MVC 4 RESTFul Web Services CRUD例子(带源码)【这才是restful,超经典】
- 用Qt来进行256色位图的转换
- 把uiviewcontroller对象作为某个类的属性
- imx6编译出错问题解决
- BorePlugin插件
- C语言学习11-25
- ROS学习(六):CMakeLists.txt 文件
- static作用(修饰函数、局部变量、全局变量)
- 认识java修饰符-----static
- OC中常用排序方法: