Qt 之 QImageWriter

作者: 一去、二三里
个人微信号: iwaleon
微信公众号: 高效程序员

QImageWriter类为写入图像至文件或设备提供了一个独立的接口。QImageWriter支持格式特定的选项(如:质量和压缩率),可以在存储图像之前进行设置。如果不需要这些选项,可以使用QImage::save()或QPixmap::save()代替。

常用接口

公共函数

  • void setFileName(const QString & fileName)
    为fileName设置文件名。在内部,QImageWriter将创建一个QFile,以只写模式( QIODevice::WriteOnly)打开它,并使用此文件写入图像。

  • void setFormat(const QByteArray & format)
    设置写入图像时的格式,格式不区分大小写。

QImageWriter writer;
writer.setFormat("png");  
// 同writer.setFormat("PNG");
  • void setText(const QString & key, const QString & text)
    设置与key相关的文本。用于一些有用的信息,例如:版权信息、关于图像的其它描述信息。

  • bool supportsOption(QImageIOHandler::ImageOption option) const
    如果writer支持选项option,返回true;否则返回false。

不同的图像格式支持不同的选项。调用此函数,可以确定当前格式是否支持一个特定的选项。例如:PNG格式允许嵌入文字到图像的元数据(见text())。

QImageWriter writer(fileName);
if (writer.supportsOption(QImageIOHandler::Description))
    writer.setText("Author", "Mr Wang");
  • void setQuality(int quality)
    设置图像格式的质量。

quality的取值范围依赖于图像格式。例如:JPEG格式支持从0(低视觉质量,高压缩率)到100(高视觉质量,低压缩率)范围。

  • bool canWrite() const
    如果QImageWriter可以写入图像(即:图像格式支持,同时设备也可以写入)调用canWrite() 时会返回true

  • bool write(const QImage & image)
    将图像写入文件或设备,如果写入时出现任何错误,将返回false,可以调用error() 来查找发生错误的类型,或者通过errorString()获取可读性的描述。

  • ImageWriterError error() const
    返回上次发生的错误 - 错误类型。

QImageWriter::ImageWriterError枚举值:

常量描述
QImageWriter::DeviceError1QImageWriter写入图像数据时遇到设备错误,详细请查看设备问题。
QImageWriter::UnsupportedFormatError2Qt不支持的请求图像格式。
QImageWriter::UnknownError0未知错误。如果调用write()后得到这个值,最有可能是QImageWriter的一个Bug。
  • QString errorString() const
    返回上次发生的错误 - 可读描述。

静态函数

  • QList<QByteArray> supportedImageFormats()
    获取支持的图片格式

  • QList<QByteArray> supportedMimeTypes()
    获取支持的Mime类型

QList<QByteArray> imageFormats = QImageWriter::supportedImageFormats();
QList<QByteArray> mimeTypes = QImageWriter::supportedMimeTypes();

信息如下:

// imageFormats : ("bmp", "cur", "dds", "icns", "ico", "jp2", "jpeg", "jpg", "pbm", "pgm", "png", "ppm", "tif", "tiff", "wbmp", "webp", "xbm", "xpm")

// mimeTypes : ("", "image/bmp", "image/jp2", "image/jpeg", "image/png", "image/tiff", "image/vnd.microsoft.icon", "image/vnd.wap.wbmp", "image/webp", "image/x-dds", "image/x-icns", "image/x-portable-bitmap", "image/x-portable-graymap", "image/x-portable-pixmap", "image/x-xbitmap", "image/x-xpixmap")

示例

效果

这里写图片描述 这里写图片描述

源码

// 源图像
QImage image(":/Images/logo");

// 目标图像
QImageWriter writer("AuthorLogo.jpeg", "jpeg");
if (writer.supportsOption(QImageIOHandler::Description))
{
    // 设置描述信息
    writer.setText("Author", "Mr Wang");
    writer.setText("Description", "Qter");
}
writer.setQuality(100);
if (writer.canWrite())
{
    // 写入图片至文件AuthorLogo.jpeg
    writer.write(image);
}
else
{
    // 获取错误信息
    QImageWriter::ImageWriterError error = writer.error();
    QString strError = writer.errorString();
    qDebug() << "Last Error : " << strError;
}

这时,就会根据源图像(:/Images/logo资源文件)生成一张名为AuthorLogo.jpeg的图像,并且图像里面包含"Author""以及"Description"对应的信息。

为什么图片上看不到呢?(⊙o⊙)…这时因为保存的信息在图片的数据中,而并非直接绘制在图片上。

既然有QImageWriter,当然也会有对应的读取相关的类QImageReader,至于如何读取,敬请期待。。。下节更精彩。

注意:

  • 图一:setQuality(100),质量很高,压缩率小(很大:131KB)。
  • 图二:setQuality(0),质量很低,压缩率高(很小:9.69KB)。
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
图像处理是指通过使用计算机算法和技术来改变或改善图像的质量、外观或特征的过程。QT是一个跨平台的应用程序开发框架,可以用于开发图像处理软件。通过使用QT的图像处理模块,可以在C++编程语言中实现图像处理算法。 在QT中,图像处理可以通过以下几个步骤来实现: 1. 加载图像:使用QT提供的函数,可以加载图像文件并将其存储为图像对象。 2. 图像处理算法:通过调用QT提供的图像处理函数,可以对加载的图像进行各种处理操作,比如调整图像的亮度、对比度、色彩饱和度等。 3. 显示图像:使用QT提供的图像显示控件,可以将处理后的图像显示在窗口中。 4. 保存图像:通过调用QT的图像处理函数,可以将处理后的图像保存为文件。 在QT中,有很多图像处理相关的函数和类可以使用,比如QImage和QPixmap类可以用于加载和处理图像,QImageReader和QImageWriter类可以用于读取和写入图像文件,而QPainter类可以用于在窗口或其他绘图设备上绘制图像。 通过结合QT和C++,可以实现图像处理算法的高效和灵活性。QT提供了丰富的图像处理功能和易于使用的API,可以帮助开发者快速开发出高质量的图像处理软件。 总结起来,使用QT和C++可以实现图像处理,开发人员可以利用QT提供的图像处理模块和函数来加载、处理、显示和保存图像,从而实现各种图像处理操作。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一去丶二三里

有收获,再打赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值