<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文件。我创建的这两个类是TGAIOPlugin和TGAIOHandler。其实Qt这样做我个人认为实在是太好了,因为它将输入设备(文件、内存、资源)和解码方式解耦了,极大地实现了多样性。
测试自己写的插件,基本上可以支持颜色映射TGA、原始颜色TGA、游程长度编码颜色映射TGA和游程长度编码原始颜色TGA,而且修正了当TGA像素格式为24位,与QImage::Format_RGB888格式配对时颜色读取顺序不一致的问题(我们是蓝绿红,它要求的是红绿蓝)。
由于尚未实现写入TGA的功能,并且尚未移除调试代码,我还需再测试自己写的插件。不过我相信不久后我会将自己写好的插件提交到Qt版本库中,希望大家支持!
分享到:
相关推荐
Qt实现一个简易的图片浏览器,包含图片的导入,显示,缩放,旋转,上一张下一张切换,listwidget列表显示,点击列表中缩略图显示,图片位置信息展示等。
qt 插件 本DEMO中在主界面中有一个按钮,点击按钮就会加载插件,插件是一个dialog窗口 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!...
QT版本是5.9,程序包括一个主程序和两个插件类,主程序运行后自动加载同级plugins文件夹中的插件类,如果没有该文件夹,则只需手动创建一个同名文件夹,并把生成的插件类放入其中即可正常运行
QT和Opencv图像格式转换_ qtopencv图片数组相互转化,opencv格式转换mono8 -C 代码类资源 关于QImage和Mat格式的转换
qt的sqlite加密插件,资源在qt5.9.5下编译。可以直接放到qt插件目录下使用。将产生的sqlitecipher.dll拷贝到plugins\sqldrivers路径下。打开方式如下: QSqlDatabase dbconn = QSqlDatabase::addDatabase("SQLITE...
Qt Designer 的插件的编写的源代码说明在我的博客里
1、Qt中格式化代码工具有好几种,目前使用的最多最好用的就是Astyle 2、Windows平台下:可以直接下载带有Astyle.exe文件的压缩包,放到指定的目录即可 3、单击上面一行的“工具——选项——Beautifier”进入面板,在...
QT5.9.8编译环境,支持检测系统内可以用的串口,支持中文显示和发送,16进制发送,采用QT内置的串口类编写,有需要的朋友可以下载参考 QT5.9.8编译环境,支持检测系统内可以用的串口,支持中文显示和发送,16进制...
用Qt键盘插件 gpio
Qt调用大漠插件,包含最后一个大漠插件免费版本,大漠插件3.1233,中文手册、Qt实现微信消息自动发送,自动注册,可设置发送内容和发送次数
使用Qt编写的通过Google API得到最新天气的插件。修改代码内的地址可以修改城市。注意要安装qt哦。
于是,我们需要一个插件架构。一般来说,动态链接库能够对外暴露出的是一系列函 数。对于链接库内部的变量、类以及对象则不能直接访问。编写插件则可以绕过这个限制,插件内部的变量、对象都可以直接对应用程序 暴露...
概述:本例子主要是实现了QT编写一个插件,此插件主要实现数字的加法功能。主程序实现的是ui,并且在ui中设计了按钮和显示label。如果点击按钮,那么弹出对话框显示出所需要数字的加法和,同时label也显示了这样的和...
处理图片尺寸与格式转换软件工具【QT编写】 QT编写的图片批处理工具
qt插件系统代码。 插件系统,可以分为三部分: 主系统 通过插件管理器加载插件,并创建插件对象。一旦插件对象被创建,主系统就会获得相应的指针/引用,它可以像任何其他对象一样使用。 插件管理器 用于管理插件...
QT 3D绘图插件,主要用于在qt5版本上面进行3D绘图,结合C++语法
手动编译的Qt5.15.2 mysql插件
qt下编写的gui程序,能够实现读取各种类型的图片(tga),基本的图片处理,放大,缩小等功能
编译环境:VS2019 + QT5.13.1 业务要求:界面是多窗口拖动的模式,窗口采用插件的模式(DLL)封装。
使用QTCreator5.9.1 实现的简单动态&静态插件编写 和 调用的小例子,参考了qt自代的plugandpaint,我的样例中没有复杂类和算法,只有简单的加减运算,简单明了,本质是学习静态&动态插件插件的编写调用方法。