找了半天,还不如自己写一个图片转ico格式的程序

关于jpg、png等图片转ICO格式

最近突然急需一张ico格式的文件,就拿着处理好的png图片出网上找在线转换器,找了一个小时,绝了,不是需要注册充钱就是下载不下来,好不容易下载下来还是个文件错误。想着找个PS插件直接导出ico,也是服气,不是钓鱼网站就是下载下来用不了……

当然你们有好的方式也可以留言告诉我,心态崩了,索性写一个。

一、程序展示

直接选择需要转换的文件,输入尺寸点击转换就可以了,第五出品,质量问题你打我,文章末尾给大家提供有下载渠道,免费的!
在这里插入图片描述
会给大家一个压缩包,压缩包里有这三样东西:
在这里插入图片描述
直接双击exe文件就可以了,如果想研究下源码,最后一个文件就是源码。

二、关于源码

import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QVBoxLayout, QPushButton, QLabel,
                             QFileDialog, QHBoxLayout, QLineEdit, QGridLayout, QSpinBox, QMessageBox)
from PyQt5.QtGui import QIcon
from PIL import Image

class ImageToIcoConverter(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    
    def initUI(self):
        self.setWindowTitle('图片转 ICO 文件')
        self.setGeometry(100, 100, 500, 250)
        self.setWindowIcon(QIcon('icon.png'))  # 设置应用图标

        layout = QVBoxLayout()

        # 图片选择
        self.fileLabel = QLabel('选择图片文件:')
        self.filePath = QLineEdit()
        self.browseButton = QPushButton('浏览...')
        self.browseButton.clicked.connect(self.browseImage)
        
        fileLayout = QHBoxLayout()
        fileLayout.addWidget(self.fileLabel)
        fileLayout.addWidget(self.filePath)
        fileLayout.addWidget(self.browseButton)
        
        layout.addLayout(fileLayout)

        # 输出路径
        self.outputLabel = QLabel('保存为 ICO 文件:')
        self.outputPath = QLineEdit()
        self.saveButton = QPushButton('保存为...')
        self.saveButton.clicked.connect(self.saveAsIco)
        
        outputLayout = QHBoxLayout()
        outputLayout.addWidget(self.outputLabel)
        outputLayout.addWidget(self.outputPath)
        outputLayout.addWidget(self.saveButton)
        
        layout.addLayout(outputLayout)

        # 尺寸输入
        self.sizeLabel = QLabel('输出方形尺寸 (例如: 16 32 48 256等):')
        self.sizeInput = QLineEdit()
        
        sizeLayout = QHBoxLayout()
        sizeLayout.addWidget(self.sizeLabel)
        sizeLayout.addWidget(self.sizeInput)
        
        layout.addLayout(sizeLayout)

        # 转换按钮
        self.convertButton = QPushButton('转换')
        self.convertButton.clicked.connect(self.convertImage)
        layout.addWidget(self.convertButton)

        # 状态显示
        self.statusLabel = QLabel('')
        layout.addWidget(self.statusLabel)
        
        self.setLayout(layout)

    def browseImage(self):
        fileName, _ = QFileDialog.getOpenFileName(self, '选择图片文件', '', 'Image Files (*.png *.jpg *.jpeg *.bmp)')
        if fileName:
            self.filePath.setText(fileName)

    def saveAsIco(self):
        fileName, _ = QFileDialog.getSaveFileName(self, '保存为 ICO 文件', '', 'ICO Files (*.ico)')
        if fileName:
            if not fileName.endswith('.ico'):
                fileName += '.ico'
            self.outputPath.setText(fileName)
    
    def convertImage(self):
        input_path = self.filePath.text()
        output_path = self.outputPath.text()
        sizes_str = self.sizeInput.text().strip()
        
        if not input_path or not output_path:
            self.statusLabel.setText('请指定输入图片和输出路径')
            return

        try:
            sizes = [int(size) for size in sizes_str.split() if size.isdigit()]
            sizes = [(size, size) for size in sizes if size > 0]
            
            if not sizes:
                self.statusLabel.setText('请至少输入一个有效的尺寸')
                return

            img = Image.open(input_path)
            img.save(output_path, format='ICO', sizes=sizes)
            self.statusLabel.setText(f'转换成功,保存为 {output_path}')
            QMessageBox.information(self, "成功", f"转换成功,保存为 {output_path}")
        except Exception as e:
            self.statusLabel.setText(f'转换失败: {e}')
            QMessageBox.critical(self, "错误", f"转换失败: {e}")

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = ImageToIcoConverter()
    window.show()
    sys.exit(app.exec_())

三、注意事项

  1. ico文件是正方形的,所以输入尺寸的时候只需要一个数字就行,比如16,32,48,76,到250,根据需要自己随意输入,不要超过250,文件写入可能会失败,也不要输入其他内容,我没有写过多的防护措施(小数没试过,大家可以帮我试试会不会闪退);
  2. 其他没啥,遇到问题可以在下边评论(我看到后回复)。

四、下载资源

为了方便一堆资料的管理,照例还是放在公众号里,呐,关注后回复“图片转ico”就可以获取,没有套路。
在这里插入图片描述
最后来一个公众号二维码:
请添加图片描述
请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/691823.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot+Vue学生作业管理系统【附:资料➕文档】

前言:我是源码分享交流Coding,专注JavaVue领域,专业提供程序设计开发、源码分享、 技术指导讲解、各类项目免费分享,定制和毕业设计服务! 免费获取方式--->>文章末尾处! 项目介绍047: 【…

【讲解下ECMAScript和JavaScript之间有何区别?】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

还在为线上BUG苦苦找寻?试试IntelliJ IDEA远程调试线上Java程序

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…

持续警惕火灾风险:学校可燃气体报警器的定期校准检验

可燃气体报警器在学校中的安装、检验和校准对于保护师生生命安全至关重要。 接下来,佰德将探讨可燃气体报警器在学校中的必要性,以及相关实际案例和数据,为您呈现一个安全的学习环境。 一、学校安全不能掉以轻心 学校是培养未来的摇篮&…

还不会线程池?JUC线程池源码级万字解析

线程池主要解决了两个问题: 第一个是当大量执行异步任务的时候提供较好的性能;在不使用线程池的时候,每次需要执行一个异步任务都需要新建一个 Thread 来进行,而线程的创建和销毁都是需要时间的,所以可以通过线程池来实…

6.7.11 一种新的迁移学习方法可提高乳房 X 线摄影筛查中乳腺癌的诊断率

分割是一种将图像分割成离散区域的技术,以便将感兴趣的对象与周围环境分开。为了制定治疗计划,分割可以帮助医生测量乳房中的组织量。 二元分类问题的目的是将输入数据分为两组互斥的数据。在这种情况下,训练数据根据要解决的问题以二进制格…

HTML静态网页成品作业(HTML+CSS)—— 24节气立夏介绍网页(1个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有1个页面。 二、作品演示 三、代…

反射型xss靶场练习

反射型xss危害小,这里使用的xss靶场是常用的xss靶场:xss-labs。 当我们完成弹窗后就通过该关卡,说该关卡存在xss的一个漏洞并且可以解析js代码。 第一关: 这里没有过滤我们输入的代码:直接将js代码放在js代码中&a…

SQL学习小记(五)解决python连接Oracle数据库及出现的问题

python运行时出现错误DPI-1047: Cannot locate a 64-bit Oracle Client library: “The specified module could not be 解决python连接Oracle数据库及出现的问题 1. 配置本地Oracle的path2. python10的详细安装过程2.1. python10下载2.2. python10安装2.3.额外操作 3. python…

ARM功耗管理之功耗状态及功耗模式

安全之安全(security)博客目录导读 目录 一、功耗状态定义 ​编辑二、功耗模式定义 三、功耗状态和功耗模式区别 四、功耗模式细分 五、功耗状态细分 1、Core功耗状态 2、Cluster功耗状态 3、设备功耗状态 4、SoC功耗状态 5、功耗状态举例 思考:功耗状态?功耗模式…

论文复现:Track to Detect and Segment: An Online Multi-Object Tracker

论文下载链接:链接 简单介绍:大多数在线多目标跟踪器在神经网络中独立执行目标检测,无需任何跟踪输入。在本文中提出了一种新的在线联合检测和跟踪模型TraDeS(TRAck to DEtect and Segment),利用跟踪线索…

Git从入门到放弃

由于我的Git学的不太好,所以为了能够将以后我的学习笔记能够整理的更好,我先要系统的学习一下git,文章由此产生。 文章笔记源自尚硅谷Git入门到精通全套教程视频内容 1 进入官网 学习新技术的第一步需要熟悉官网,Git也不例外。ht…

纷享销客安全体系:安全合规认证

安全合规认证是指组织通过独立的第三方机构对其信息系统和数据进行评估和审查,以确认其符合相关的安全标准、法律法规和行业要求的过程。 安全合规认证可以帮助组织提高信息系统和数据的安全性,并向客户、合作伙伴和监管机构证明其符合相关的安全标准和…

✔️Vue基础+

✔️Vue基础 文章目录 ✔️Vue基础computed methods watchcomputed计算属性methods计算属性computed计算属性 VS methods方法计算属性的完整写法 watch侦听器(监视器)watch侦听器 Vue生命周期Vue生命周期钩子 工程化开发和脚手架脚手架Vue CLI 项目目录介…

HarmonyOS(二十三)——HTTP请求实战一个可切换的头条列表

在前一篇文章,我们已经知道如何实现一个http请求的完整流程,今天就用官方列子实战一个简单的新闻列表。进一步掌握ArkTS的声明式开发范式,数据请求,常用系统组件以及touch事件的使用。 主要包含以下功能: 数据请求。…

独立游戏之路 -- 获取OAID提升广告收益

Unity 之 获取手机:OAID、IMEI、ClientId、GUID 前言一、Oaid 介绍1.1 Oaid 说明1.2 移动安全联盟(MSA) 二、站在巨人的肩膀上2.1 本文实现参考2.2 本文实现效果2.3 本文相关插件 三、Unity 中获取Oaid3.1 查看实现源码3.2 工程配置3.3 代码实现3.4 场景搭建 四、总…

金融科技:跨境支付的新引擎,开启全球化支付新时代

一、引言 在全球经济一体化的今天,跨境支付作为连接各国经贸往来的重要桥梁,其便捷性、安全性和效率性成为了各国企业和消费者关注的焦点。金融科技,作为现代金融与传统科技深度融合的产物,正以其独特的创新力和推动力,成为跨境支付领域的新引擎,引领着全球化支付新时代…

基于SSM的旅游民宿预定系统【源码】【运行教程】

基于SSM的旅游民宿预定系统 一、项目介绍1. 游客功能2. 管理员功能3. 高级功能 二、项目技术栈三、项目运行四、项目演示总结 大家好,这里是程序猿代码之路!随着旅游业的快速发展,民宿作为一种独特的住宿方式越来越受到游客的喜爱。为了提升用…

Android端信号处理总结

最早之前不管是视频录制还是视频直播,都是从麦克风获取音频后,直接交编码器,封装复用到不同媒体格式。在后面在IM场景中做短语音消息、短语音消息转文本以及语音输入设计到语音识别,也仍然是直接从麦克风拿数据。在整个语音SDK设计…

【JavaScript】内置对象 - 字符串对象 ④ ( 根据索引位置返回字符串中的字符 | 代码示例 )

文章目录 一、根据索引位置返回字符串中的字符1、charAt 函数获取字符2、charCodeAt 函数获取字符 ASCII 码3、数组下标获取字符 String 字符串对象参考文档 : https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String 一、根据索引位置返回…