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

一 问题背景

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

 

你可能感兴趣的:(1st,Qt_project)