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的目录结构,将他们放在程序能找到的位置(有时在程序中指定). 

 

原创粉丝点击