`
jgsj
  • 浏览: 960247 次
文章分类
社区版块
存档分类
最新评论

编写一个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版本库中,希望大家支持!

分享到:
评论

相关推荐

    Qt编写的图片浏览器实例

    Qt实现一个简易的图片浏览器,包含图片的导入,显示,缩放,旋转,上一张下一张切换,listwidget列表显示,点击列表中缩略图显示,图片位置信息展示等。

    QT 之 插件编写

    qt 插件 本DEMO中在主界面中有一个按钮,点击按钮就会加载插件,插件是一个dialog窗口 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!...

    Qt插件框架 PluginFrame

    QT版本是5.9,程序包括一个主程序和两个插件类,主程序运行后自动加载同级plugins文件夹中的插件类,如果没有该文件夹,则只需手动创建一个同名文件夹,并把生成的插件类放入其中即可正常运行

    QT和Opencv图像格式转换_ qtopencv图片数组相互转化,opencv格式转换mono8

    QT和Opencv图像格式转换_ qtopencv图片数组相互转化,opencv格式转换mono8 -C 代码类资源 关于QImage和Mat格式的转换

    Qt的sqlite3加密插件

    qt的sqlite加密插件,资源在qt5.9.5下编译。可以直接放到qt插件目录下使用。将产生的sqlitecipher.dll拷贝到plugins\sqldrivers路径下。打开方式如下: QSqlDatabase dbconn = QSqlDatabase::addDatabase("SQLITE...

    Qt Designer 的插件的编写

    Qt Designer 的插件的编写的源代码说明在我的博客里

    Qt Creator 代码格式化插件Astyle

    1、Qt中格式化代码工具有好几种,目前使用的最多最好用的就是Astyle 2、Windows平台下:可以直接下载带有Astyle.exe文件的压缩包,放到指定的目录即可 3、单击上面一行的“工具——选项——Beautifier”进入面板,在...

    QT5编写的串口助手,支持显示中文

    QT5.9.8编译环境,支持检测系统内可以用的串口,支持中文显示和发送,16进制发送,采用QT内置的串口类编写,有需要的朋友可以下载参考 QT5.9.8编译环境,支持检测系统内可以用的串口,支持中文显示和发送,16进制...

    编写QT键盘插件 gpio 。linux

    用Qt键盘插件 gpio

    Qt实现自动发消息源码(Qt中使用大漠插件3.1233)

    Qt调用大漠插件,包含最后一个大漠插件免费版本,大漠插件3.1233,中文手册、Qt实现微信消息自动发送,自动注册,可设置发送内容和发送次数

    Qt编写的天气预报插件

    使用Qt编写的通过Google API得到最新天气的插件。修改代码内的地址可以修改城市。注意要安装qt哦。

    Qt 4 插件开发

    于是,我们需要一个插件架构。一般来说,动态链接库能够对外暴露出的是一系列函 数。对于链接库内部的变量、类以及对象则不能直接访问。编写插件则可以绕过这个限制,插件内部的变量、对象都可以直接对应用程序 暴露...

    QT插件编写

    概述:本例子主要是实现了QT编写一个插件,此插件主要实现数字的加法功能。主程序实现的是ui,并且在ui中设计了按钮和显示label。如果点击按钮,那么弹出对话框显示出所需要数字的加法和,同时label也显示了这样的和...

    处理图片尺寸与格式转换软件工具【QT编写】

    处理图片尺寸与格式转换软件工具【QT编写】 QT编写的图片批处理工具

    QT插件框架代码的demo

    qt插件系统代码。 插件系统,可以分为三部分: 主系统  通过插件管理器加载插件,并创建插件对象。一旦插件对象被创建,主系统就会获得相应的指针/引用,它可以像任何其他对象一样使用。 插件管理器  用于管理插件...

    Qt 3D绘图插件

    QT 3D绘图插件,主要用于在qt5版本上面进行3D绘图,结合C++语法

    Qt5.15 mysql 插件

    手动编译的Qt5.15.2 mysql插件

    Qt 读取图片GUI程序

    qt下编写的gui程序,能够实现读取各种类型的图片(tga),基本的图片处理,放大,缩小等功能

    QT插件管理器框架-master

    编译环境:VS2019 + QT5.13.1 业务要求:界面是多窗口拖动的模式,窗口采用插件的模式(DLL)封装。

    QT plugins(动态&amp;静态插件编写调用)

    使用QTCreator5.9.1 实现的简单动态&静态插件编写 和 调用的小例子,参考了qt自代的plugandpaint,我的样例中没有复杂类和算法,只有简单的加减运算,简单明了,本质是学习静态&动态插件插件的编写调用方法。

Global site tag (gtag.js) - Google Analytics