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

<style type="text/css"> <!-- @page {margin:2cm} pre.cjk {font-family:"DejaVu Sans Condensed",monospace} p {margin-bottom:0.21cm} --> </style>

编写一个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文件。我创建的这两个类是TGAIOPluginTGAIOHandler。其实Qt这样做我个人认为实在是太好了,因为它将输入设备(文件、内存、资源)和解码方式解耦了,极大地实现了多样性。

测试自己写的插件,基本上可以支持颜色映射TGA、原始颜色TGA、游程长度编码颜色映射TGA和游程长度编码原始颜色TGA,而且修正了当TGA像素格式为24位,与QImage::Format_RGB888格式配对时颜色读取顺序不一致的问题(我们是蓝绿红,它要求的是红绿蓝)。

由于尚未实现写入TGA的功能,并且尚未移除调试代码,我还需再测试自己写的插件。不过我相信不久后我会将自己写好的插件提交到Qt版本库中,希望大家支持!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值