找了半天,还不如自己写一个图片转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 Imageclass 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('请指定输入图片和输出路径')returntry: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('请至少输入一个有效的尺寸')returnimg = 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.mzph.cn/bicheng/24806.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

烧写uboot、linux镜像、根文件系统到开发板

烧写uboot、linux镜像、根文件系统到开发板 环境介绍 本博客使用x6818开发板。 公司:三星 ARM架构 Cortex-A53核 型号:S5P6818 特性:8核,最高主频2GHz 烧写uboot 使用网络烧写 网络烧写上位机是Ubuntu虚拟机。 先利用上…

基于STM32智能小车

一、前置准备 前置知识:需要学习stm32,建议去b站看江科大的视频,讲的很详细,学完串口那一块就可以制作了,软件用的是Keil5,开发语言C语言,手机连接蓝牙模块软件是蓝牙调试器。 需要准备的器件…

数学+思维,CF1056B - Divide Candies

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 Problem - 1056B - Codeforces 二、解题报告 1、思路分析 考虑i^2 j^2 | m 而m的余数有限,且m很小 我们枚举两重循环,都枚举m的余数,分别记为x,y 如果x ^ …

Linux☞进程控制

在终端执行命令时,Linux会建立进程,程序执行完,进程会被终止;Linux是一个多任务的OS,允许多个进程并发运行; Linxu中启动进程的两种途径: ①手动启动(前台进程(命令gedit)...后台进程(命令‘&’)) ②…

数据库安全加固与API防护策略

在数字化时代,数据库作为企业核心资产的安全性至关重要。然而,随着网络攻击手段的不断演进,数据库和API接口成为了黑客的主要攻击目标。本文将探讨数据库被攻击、API接口被滥用的情况,并提供一系列实用的防护措施,旨在…

【玩转C语言】第三讲---> scanf 和 printf 函数详解(非常重要)!

🔥博客主页🔥:【 坊钰_CSDN博客 】 欢迎各位点赞👍评论✍收藏⭐ 引言: 大家好,我是坊钰,为了让大家深入了解C语言,我开创了【玩转C语言系列】,将为大家介绍C语言相关知识…

C++ ─── STL 以及string

前言:什么是STL STL(standard template libaray-标准模板库):是C标准库的重要组成部分,不仅是一个可复用的组件库,而且 是一个包罗数据结构与算法的软件框架 STL的六大组件 1. 为什么学习string类? 1.1 C语言中的字符…

Ambari集成Apache Kyuubi实践

目前还有很多公司基于HDP来构建自己的大数据平台,随着Apache Kyuubi的持续热度,如何基于原有的HDP产品来集成Apache Kyuubi,很多人都迫切的需求。集成Apache Kyuubi到HDP中,主要涉及Ambari的二次开发。本文详细叙述了集成Apache K…

分享一个用python的本地WIFI密码查看器

本章教程,主要分享一个本地wifi密码查看器,用python实现的,感兴趣的可以试一试。 具体代码 import subprocess # 导入 subprocess 模块,用于执行系统命令 import tkinter as tk # 导入 tkinter 模块,用于创建图形用…

实现Ingress-Nginx Controller高可用方案

文章目录 前提准备1.修改Ingress-Controller 运行模式为hostNetwork并生效2.给部署ingress-controller的节点打标签3.查看ingress-controller的部署情况 方式一:LVSKeepalivedNginxIngress一、部署ipvsadm和keepalived二、配置keepalived1.配置lvs01(keepalived mas…

Java Web学习笔记27——对话框、表单组件

常见组件对话框: Dialog对话框:在保留当前页面状态下,告知用户并承载相关操作。 dialogTableVisible: false 默认是不可见的。 在按钮属性中设置为true的意思,点击按钮的时候,才会true,对话框才会显示。 …

python Tk 获取输入框内容,分割内容

创建输入框、一个按钮和一个标签的GUI。 用户可以在输入框中输入文本,点击按钮后,程序将在控制台打印输入的文本(已经分割为列表),并在GUI中的标签上显示一些静态文本。 import tkinter as tk# 创建主窗口 root tk.…

基于SpringBoot+Vue学生请假管理系统设计和实现(源码+LW+调试文档+讲解等)

💗博主介绍:✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,还…

linux指令--sed

sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。 语法解析 sed [选项] 编辑命令 文件 选项: -n:只显示匹配处理的行-e:执行多个编辑命令时-i:在原文件中进行修改,不输出到屏幕-…

qsort函数

学习c语言的过程中少不了的就是排序&#xff0c;例如冒泡排序&#xff08;不清楚的同学可以翻找一下之前的文章&#xff09;&#xff0c; 我们这里将冒泡排序作为一个自定义函数来呈现一下 #include<stdio.h>void bubble_sort(int arr[], int len) {for (int i 0; i &…

【Vue】mutations

文章目录 一、定义mutations二、组件中提交 mutations三、带参数的 mutations 一、定义mutations mutations是vuex中的对象&#xff0c;这个对象可以定义在当前store的配置项中 const store new Vuex.Store({state: {count: 0},// 定义mutations// mutations是一个对象&#x…

Progressive Feature Fusion Framework Based on Graph Convolutional Network

以Resnet50作为主干网络&#xff0c;然后使用GCN逐层聚合多级特征&#xff0c;逐级聚合这种模型架构早已不新鲜&#xff0c;这篇文章使用GCN的方式对特征进行聚合&#xff0c;没有代码。这篇文章没有过多的介绍如何构造的节点特征和邻接矩阵&#xff0c;我觉得对于图卷积来说&a…

自动化Reddit图片收集:Python爬虫技巧

引言 Reddit&#xff0c;作为一个全球性的社交平台&#xff0c;拥有海量的用户生成内容&#xff0c;其中包括大量的图片资源。对于数据科学家、市场研究人员或任何需要大量图片资源的人来说&#xff0c;自动化地从Reddit收集图片是一个极具价值的技能。本文将详细介绍如何使用…

多个p标签一行展示,溢出隐藏

一开始&#xff0c;我是让div包裹多个p标签&#xff0c;并让div“flex”布局&#xff0c;且单行溢出隐藏&#xff0c;可是发现当父元素或当前元素有flex时&#xff0c;text-overflow: ellipsis;是不生效的 大多数解决办法都是&#xff0c;不要flex&#xff0c;或者给div下的每个…

【启程Golang之旅】网络编程与反射

欢迎来到Golang的世界&#xff01;在当今快节奏的软件开发领域&#xff0c;选择一种高效、简洁的编程语言至关重要。而在这方面&#xff0c;Golang&#xff08;又称Go&#xff09;无疑是一个备受瞩目的选择。在本文中&#xff0c;带领您探索Golang的世界&#xff0c;一步步地了…