Qt绘制图形保存图片 (solaris下保存失败) .

一 问题背景

  Qt某小项目开发。开发环境为windows+Qt 4.7.0+vs2008+mysql 5 ,客户部署环境为Solaris10。

二 问题描述

 Qt在widget界面上绘图,可以将界面绘制的图像保存到用户指定的位置。用户通过保存文件对话框选择要保存图片的路径。在开发环境中,即在windows下保存图片功能可用,到了solaris下却不能实现保存图片这个功能。

三 问题分析

 #1 程序实现方法:

 程序中实现保存图片偷了个懒,在资源文件中有一张空图片 empty.png。保存图片绘图时,直接把empty.png当成绘制设备,然后保存到指定的位置。

.cpp

  1. //保存png图片   
  2. void className::savePng()  
  3. {  
  4.     QString filename = QFileDialog::getSaveFileName(  
  5.         this"保存图像文件",  QDir::currentPath(), "Document files (*.png);;All files(*.*)");  
  6.     if (filename.isNull())  //用户未选择文件   
  7.     {   
  8.         QMessageBox::information(this"文件""用户未选择文件", QMessageBox::Ok | QMessageBox::Cancel);  
  9.         return;  
  10.     }  
  11.       
  12.     //控制图像自适应大小部分略   
  13.   
  14.     QImage image(":/******/Resources/empty.jpg");       //来自资源文件的空图像   
  15.     QPainter painter;  
  16.     painter.begin(&image);   
  17.   
  18.     //自己写的方法,绘制坐标轴和曲线   
  19.     drawaxis(&painter,width,height);      
  20.     drawcurves(&painter,width,height);  
  21.   
  22.     painter.end();   
  23.     bool OK= image.save(filename);  
  24.     if (!OK)  
  25.     {  
  26.         QMessageBox::about(NULL,"","保存失败");  
  27.     }  
  28. }

以上代码在windows下可以将图片保存在用户指定的位置。但是在solaris下,却不成功。  由于是在资源文件中的空图片上绘制,怀疑在solaris下资源文件中的图像没有加载进去。故根据代码 image.load(":/******/Resources/empty.jpg");测试,发现一个在部署时候应该注意的问题,该问题稍后分析。 但是由于我的电脑Qt的sdk的环境变量都配置好了,故暂时不影响。于是上网查了查别人保存图片的代码,主要是以下两种方式:

 1.使用image的save()方法

[cpp]
  1. QPixmap pix(40,40);  
  2. QPainter p(&pix);  
  3. p.drawText(0,10,"Hello,World");   
  4. p.end();  
  5. pix.save("a.png"); 

2.创建文件,向里面写图片数据

 

[cpp]
  1. QImage iim(500,1900,QImage::Format_RGB32);  
  2. QPainter painter(&iim);  
  3. painter.setFont(QFont("Times New Roman", 122));  
  4. painter.drawText(100,300,"Hello,World");  
  5. //创建文件   
  6. QFile file("acm.PNG");  
  7. if (!file.open(QIODevice::ReadWrite)){  
  8.     return;  
  9. }  
  10. //流方式写入文件   
  11. QByteArray ba;  
  12. QBuffer buffer(&ba);  
  13. buffer.open(QIODevice::WriteOnly);  
  14. iim.save(&buffer, "PNG");  
  15. file.write(ba);

两种方法稍加修改,在solaris下测试,均能在根下保存图片(代码的图片路径为:"a.png")。在solaris下资源文件中的图片能够加载,故应该不是绘制问题,而是保存问题,但又做了一个测试,决定自己生成文件,然后在生成的文件上绘制,但是绘制设备还是资源文件中的empty.png.

[cpp]
  1. QImage image(":/******/Resources/empty.jpg");     
  2. QPainter painter;  
  3. painter.begin(&image);   
  4. drawaxis(&painter,width,height);      
  5. drawcurves(&painter,width,height);  
  6. painter.end();  
  7. QFile file("image.png");  
  8. if (!file.open(QIODevice::ReadWrite)){  
  9.     return;  
  10. }  
  11. OK=image.save(filename);  
  12. if (!OK){  
  13.     QMessageBox::about(NULL,"","保存失败");  
  14. }

和网上给出的代码测试结果一样,在根目录下(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的目录结构,将他们放在程序能找到的位置(有时在程序中指定). 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值