Qt绘制图形保存图片 (solaris下保存失败)
来源:互联网 发布:洛阳青峰网络黄伟 编辑:程序博客网 时间:2024/05/11 00:15
一 问题背景
Qt某小项目开发。开发环境为windows+Qt 4.7.0+vs2008+mysql 5 ,客户部署环境为Solaris10。
二 问题描述
Qt在widget界面上绘图,可以将界面绘制的图像保存到用户指定的位置。用户通过保存文件对话框选择要保存图片的路径。在开发环境中,即在windows下保存图片功能可用,到了solaris下却不能实现保存图片这个功能。
三 问题分析
#1 程序实现方法:
程序中实现保存图片偷了个懒,在资源文件中有一张空图片 empty.png。保存图片绘图时,直接把empty.png当成绘制设备,然后保存到指定的位置。
//保存png图片void className::savePng(){QString filename = QFileDialog::getSaveFileName(this, "保存图像文件", QDir::currentPath(), "Document files (*.png);;All files(*.*)");if (filename.isNull())//用户未选择文件{ QMessageBox::information(this, "文件", "用户未选择文件", QMessageBox::Ok | QMessageBox::Cancel);return;}//控制图像自适应大小部分略QImage image(":/******/Resources/empty.jpg");//来自资源文件的空图像QPainter painter;painter.begin(&image); //自己写的方法,绘制坐标轴和曲线drawaxis(&painter,width,height);drawcurves(&painter,width,height);painter.end(); bool OK= image.save(filename);if (!OK){QMessageBox::about(NULL,"","保存失败");}}
以上代码在windows下可以将图片保存在用户指定的位置。但是在solaris下,却不成功。 由于是在资源文件中的空图片上绘制,怀疑在solaris下资源文件中的图像没有加载进去。故根据代码 image.load(":/******/Resources/empty.jpg");测试,发现一个在部署时候应该注意的问题,该问题稍后分析。 但是由于我的电脑Qt的sdk的环境变量都配置好了,故暂时不影响。于是上网查了查别人保存图片的代码,主要是以下两种方式:
1.使用image的save()方法
QPixmap pix(40,40);QPainter p(&pix);p.drawText(0,10,"Hello,World"); p.end();pix.save("a.png");
2.创建文件,向里面写图片数据
QImage iim(500,1900,QImage::Format_RGB32);QPainter painter(&iim);painter.setFont(QFont("Times New Roman", 122));painter.drawText(100,300,"Hello,World");//创建文件QFile file("acm.PNG");if (!file.open(QIODevice::ReadWrite)){return;}//流方式写入文件QByteArray ba;QBuffer buffer(&ba);buffer.open(QIODevice::WriteOnly);iim.save(&buffer, "PNG");file.write(ba);
两种方法稍加修改,在solaris下测试,均能在根下保存图片(代码的图片路径为:"a.png")。在solaris下资源文件中的图片能够加载,故应该不是绘制问题,而是保存问题,但又做了一个测试,决定自己生成文件,然后在生成的文件上绘制,但是绘制设备还是资源文件中的empty.png.
QImage image(":/******/Resources/empty.jpg");QPainter painter;painter.begin(&image); drawaxis(&painter,width,height);drawcurves(&painter,width,height);painter.end();QFile file("image.png");if (!file.open(QIODevice::ReadWrite)){return;}OK=image.save(filename);if (!OK){QMessageBox::about(NULL,"","保存失败");}
和网上给出的代码测试结果一样,在根目录下(solaris保存在根下,而不是可执行文件所在的文件加下。参见solaris下QApplication::applicationDirPath()测试路径)保存绘制的图片"image.png"。现在情况是在代码中给图片指定存储路径的时候成功保存。但是用户指定路径下却无法保存。OK,查看QFileDialog中用户选择的路径,发现问题:solaris保存文件对话框也分为文件类型和文件名,和windows下的长相差不多:,但是windows下,系统会将文件名和文件类型全部捕获,如图,windows得到的文件名为test.png 。但是solaris下,系统对文件类型不明感,虽然对话框是由文件名和文件类型组成,但是solaris只会捕获文件名,而忽略文件类型,即得不到文件的后缀名,图中在solaris下保存为test。 这就是问题的原因,是文件路径出了问题。虽然solaris下对应文件类型是很随意的,但是image.save()方法必须认文件类型,否则无法存储。
#2 解决方法:
既然是缺少文件后缀名,那么就好办了。在最初的代码上进行修改:给solaris下的filaname加上.png就行了。即filename+=".png"; 然后image.save(filename);就可以了
四、补充问题
在QtDIR下(即Qt的安装目录),有一个plugins文件夹,里面有一个imageformats文件夹,貌似load图片和处理一些图片的时候要用的里面的东西,故在干净的部署环境时候,要按照plugins/imageformats的目录结构,将他们放在程序能找到的位置(有时在程序中指定).
- Qt绘制图形保存图片 (solaris下保存失败)
- Qt绘制图形保存图片 (solaris下保存失败) .
- gnuplot绘制图形并保存为图片
- ECharts绘制的图形保存为图片
- QPainter绘制 保存图片
- 保存GDI+绘制的图形
- Qt:显示、保存图片
- qt保存图片
- android,保存绘制的图片
- TIE绘制图形的文件保存实现
- 把Java面板中绘制的图形保存为图片的格式
- qt截屏 保存为图片
- qt 截屏 保存为图片
- Qt打开,保存,另存为图片
- qt 保存为svg图片
- 将Echarts的图形保存为图片
- iPhone/iOS图片读取、保存、绘制
- vc绘制艺术字并保存成图片
- dmraid的介绍
- C++第三周任务3请在原类基础上,增加成员函数,要求前三个设计成内置函数,在main()数中增加适当的调用以展示扩充类定义后的功能(最好能一次运行)。
- 《编程珠玑》学习总结1—bitmap
- Excel导入数据
- android定位和地图开发实例
- Qt绘制图形保存图片 (solaris下保存失败)
- php json 中文乱码
- objective-c的常用基础类
- 类型后面带三点啥意思?
- android ViewFlipper屏幕切换
- 代码调不通,OJ题不会做?寻求帮助,学会提问-《提问的智慧》
- 最新一批毕业课题参考网址资源分享
- 手机摄像头介绍及其参数配置
- Coroutine(协程)