您的位置:首页 > 编程语言 > Qt开发

编写一个Qt支持TGA图像格式的插件

2012-11-30 22:30 781 查看
编写一个Qt支持TGA图像格式的插件
几天前完成了对TGA格式读取的封装,我想是否能够将这个类修改一下,使Qt中的QPixmap能够支持TGA格式?于是我开始动工了。首先我做出来的是这样一个模型:
#ifndef JCYQPIXMAP_H
#define JCYQPIXMAP_H
#define QT_NAMESPACE            // 为了让自己的类和Qt原有的类作区分,使用命名空间
#include <QPixmap>
// 使用我自己的命名空间
namespace JCY
{
class QPixmap: public QT_NAMESPACE::QPixmap
{
public:
bool load(const QString& fileName,
const char *format = 0,
Qt::ImageConversionFlags flags = Qt::AutoColor );
};
}
#undef QT_NAMESPACE                     // 不影响以后的编译单元,不用命名空间
#endif // JCYQPIXMAP_H


#include <QDebug>
#include <QFileInfo>
#include <QImage>
#include "JCYQPixmap.h"
#include "TGAFile.h"
namespace JCY
{
bool QPixmap::load(const QString& fileName,
const char *format,
Qt::ImageConversionFlags flags )// 并不好用
{
// 判断是否为TGA文件,如果是的,转至我写的TGA文件处理程序,否则使用默认处理程序
QString suffix = QFileInfo( fileName ).suffix( );
if ( suffix == "tga" || suffix == "TGA" )
{
// 用自己的TGA文件处理器读取数据
TGAFile file;
//QTextCodec::setCodecForCStrings( );
if ( !file.Load( fileName.toAscii( ).constData( ) ) )
{
qDebug( ) << file.GetLastError( ) << '\n';
return false;
}
//convertFromImage( QImage( file.Data( ),
//                                                file.Width( ),
//                                                file.Height( ),
//                                                QImage::Format_ARGB32 ) );
//return true;
// 将TGAFile的数据存储到QPixmap中
return loadFromData( file.Data( ),
file.Width( ) * file.Height( ),
format, flags );
}
return QPixmap::load( fileName, format, flags );
}
}

仅仅是重载了一下load函数,结果做出来的效果不好。而且还会放弃很多很好的函数(比如说拷贝函数,赋值函数,重载运算符等)。于是我在想是否还有其它的办法解决问题呢?
一开始我发现含有游程长度编码(RLE)算法的TGA图片无法载入,我就想是不是传入的format参数出错了呢?后面查到,format参数传入的值是诸如“BMP”“PNG”这样的字符串,而不是我们所说的ARGB32。于是我查找有关的适配函数,发现QImage的构造函数中的format是指定像素格式的,我就尝试着用QImage适配QPixmap。结果还是读不出来,不仅这样,上面的代码还有一个错误,也就是fileName.toAscii().constData()遇到了含有中文的文件名或路径,它无法进行转换,仅仅返回一个个?号。这样就无法按照路径读取文件了!最后我还是放弃了这种不专业的方法。
不过我发现了一个现象,Qt内置还是支持tga文件格式的,只是它只支持无游程长度编码(RLE)的tga文件。后面我也搜索到了存在读取tga格式的libqtga.so文件。
不甘气馁的我看了一遍Qt文档,了解了QImageIOPlugin类,于是我开始尝试编写一个支持TGA文件的Qt插件。Qt的文档很规范,为我节省了很多的时间。我只需要一个晚上就知道怎样编写Qt的图像插件了。
编写一个支持TGA格式文件的Qt插件,要创建一个类,继承自QImageIOPlugin,用来处理来自Qt系统对于TGA格式文件的请求。此外还需创建一个类,继承自QImageIOHandler,用来读取TGA文件。我创建的这两个类是TGAIOPlugin和TGAIOHandler。其实Qt这样做我个人认为实在是太好了,因为它将输入设备(文件、内存、资源)和解码方式解耦了,极大地实现了多样性。
测试自己写的插件,基本上可以支持颜色映射TGA、原始颜色TGA、游程长度编码颜色映射TGA和游程长度编码原始颜色TGA,而且修正了当TGA像素格式为24位,与QImage::Format_RGB888格式配对时颜色读取顺序不一致的问题(我们是蓝绿红,它要求的是红绿蓝)。
由于尚未实现写入TGA的功能,并且尚未移除调试代码,我还需再测试自己写的插件。不过我相信不久后我会将自己写好的插件提交到Qt版本库中,希望大家支持!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: