Qt绘制图形保存图片 (solaris下保存失败)
2012-03-08 20:14
381 查看
一 问题背景
Qt某小项目开发。开发环境为windows+Qt 4.7.0+vs2008+mysql 5 ,客户部署环境为Solaris10。
二 问题描述
Qt在widget界面上绘图,可以将界面绘制的图像保存到用户指定的位置。用户通过保存文件对话框选择要保存图片的路径。在开发环境中,即在windows下保存图片功能可用,到了solaris下却不能实现保存图片这个功能。
三 问题分析
#1 程序实现方法:
程序中实现保存图片偷了个懒,在资源文件中有一张空图片 empty.png。保存图片绘图时,直接把empty.png当成绘制设备,然后保存到指定的位置。
以上代码在windows下可以将图片保存在用户指定的位置。但是在solaris下,却不成功。 由于是在资源文件中的空图片上绘制,怀疑在solaris下资源文件中的图像没有加载进去。故根据代码 image.load(":/******/Resources/empty.jpg");测试,发现一个在部署时候应该注意的问题,该问题稍后分析。 但是由于我的电脑Qt的sdk的环境变量都配置好了,故暂时不影响。于是上网查了查别人保存图片的代码,主要是以下两种方式:
1.使用image的save()方法
2.创建文件,向里面写图片数据
两种方法稍加修改,在solaris下测试,均能在根下保存图片(代码的图片路径为:"a.png")。在solaris下资源文件中的图片能够加载,故应该不是绘制问题,而是保存问题,但又做了一个测试,决定自己生成文件,然后在生成的文件上绘制,但是绘制设备还是资源文件中的empty.png.
和网上给出的代码测试结果一样,在根目录下(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某小项目开发。开发环境为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开发】在QLabel已经显示背景图片后绘制图形注意事项
- qt中如果使用svg格式的图片在QPainter中绘制图形
- 【改进】Qt界面显示图片,在图上绘制图形,拖动顶点改变大小
- Qt实现简单图形绘制,双缓冲机制和显示SVG格式图片
- ECharts绘制的图形保存为图片
- gnuplot绘制图形并保存为图片
- <Linux+Qt>使用Qt绘制2D 图形 <五 图片变换>
- 把Java面板中绘制的图形保存为图片的格式
- IOS中图片相关操作(读取、保存、绘制、其它相关)
- Gdi+绘制半透明文字并保存为透明背景图片
- 解决使用 libjpeg 保存图片时因磁盘写入失败导致程序退出的问题
- Qt基本图形绘制(圆、圆角矩形、圆弧、椭圆、扇形等)
- 绘制系统(绘制系统简介,画笔和画刷,渐变系统,坐标系统,绘制文字和图片,图形视图框架)
- QT绘制图形
- iPhone/iOS图片相关(读取、保存、绘制、其它相关)
- Qt图形简单绘制(4)-贪吃蛇小游戏(2)
- IOS Quartz 各种绘制图形用法---实现画图片、写文字、画线、椭圆、矩形、棱形等
- QT5 OpenGL (四, 绘制立体图形)
- [Swift]iOS开发:使用模拟器绘制图片并保存到电脑本地