logo头像

技术引领生活!

Qt图片转ICON多尺寸小工具

在逛吾爱破解论坛的时候,看到有个帖子,是关于图片转ICON的python版本,打包有点问题,加上自己确实有时候会用到每次都是打开在线网站,于是我就自己写了一个支持多尺寸的Qt图片转ICON小工具,分享给大家

实现过程(思路)

众所周知,Qt已经帮我们封装好了图片转ICON的函数,但是Qt的图片转ICON函数只支持一个尺寸,所以我们需要自己写一个支持多尺寸的图片转ICON函数,将任意图片调用QImage的save函数(如果指定了后缀名为.ico,则自动保存为的ICON文件)。
函数原型如下:

1
2
bool save(const QString &fileName, const char *format = Q_NULLPTR, int quality = -1) const
bool save(QIODevice *device, const char *format = Q_NULLPTR, int quality = -1) const

在逛论坛的时候看到帖子得知Icon支持一个文件多个尺寸,同时在QIcon函数中发现有一个QICon添加多个图片的接口

1
2
void addFile(const QString &fileName, const QSize &size = QSize(), Mode mode = Normal, State state = Off)
void addPixmap(const QPixmap &pixmap, Mode mode = Normal, State state = Off)

同时也有函数

1
QList<QSize> availableSizes() const

看来确实支持多尺寸,但是找来有找去就没有发现保存的接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

void ImgToIcon(const QString &imgPath, const QString &iconPath, const QList<int> &sizeList)
{
// 读取图片
QImage img(imgPath);
// 创建QIcon对象
QIcon icon;
// 遍历尺寸列表
for (int size : sizeList){
// 创建QPixmap对象
QImage scaledImage = img.scaled(size, Qt::KeepAspectRatio, Qt::SmoothTransformation);
// 将QPixmap对象添加到QIcon对象中
icon.addPixmap(scaledImage);
}


// 保存QIcon对象为文件
//要是有这么个接口就好了
icon.save(iconPath);
}

查看QIcon的头文件发现有个函数,可惜是私有的,不管了,先拿过来用用,但是转化结果不对

1
friend Q_GUI_EXPORT QDataStream &operator<<(QDataStream &, const QIcon &);

不死心就继续查找,发现QtIcoHandler内部类ICOReader的write接口看起来像实现了保存的接口只是没有暴露,于是改写摘录出来,最终完美收官

1
bool ICOReader::write(QIODevice *device, const QVector<QImage> &images)

软件界面

图片

结果验证

支持多尺寸,支持png、jpg、bmp等格式,vs2019打开可以看到支持多尺寸

图片

代码

我的github

Ps

记得很久以前发现有个将文件追加到图片后面的命令,于是惊叹竟然还有这个骚操作,现在想起来ICON 就是利用了图片格式玩的花样吧,具体代码上方的github链接

1
  copy /b 原图片.bmp+大片.mp4 目标.bmp  
支付宝打赏 微信打赏

您的支持是我前行的动力!