首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >WebP图片制作GUI工具

WebP图片制作GUI工具

作者头像
forrestlin
发布于 2018-05-24 02:37:37
发布于 2018-05-24 02:37:37
3K00
代码可运行
举报
文章被收录于专栏:蜉蝣禅修之道蜉蝣禅修之道
运行总次数:0
代码可运行

WebP是Google近几年推出的新型网络图片格式,有静态和动态两种类型,其中静态webp比jpg和png的压缩率都要大,而且失真率接近于png,远胜于jpg,因为他支持8位的透明通道。而动态webp比gif好了不止一两点,gif只支持2位的透明通道,而且图片锯齿严重。OK,既然有这么牛逼的图片格式,我们当然要好好使用了,而且现在Android端有Facebook推出的Fresco框架完美支持,不仅静态还是动态。可惜,现在制作WebP的工具寥寥无几,更不用说动态WebP了,只能靠Google提供的命令行工具,但是对于批量图片转换,命令未免太长了,着实不方便,故写下了这篇文章。

为了三种开发系统(Mac OS X,WindowsLinux)都能使用,这次就使用wxPython做这个GUI程序吧,最后再用pyinstaller打包到各个平台,好了,废话不多说,上源代码,由于篇幅原因,这里只贴关键逻辑代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding: utf-8 -*-
__author__ = 'linfuyuan'
import base_window
import wx
import os
import my_process as mp
import sys

reload(sys)
sys.setdefaultencoding("utf-8")
import platform
import codecs
import shutil


class MyDialog(base_window.MyDialog1):
    def __init__(self, parent):
        base_window.MyDialog1.__init__(self, parent)
        self.my_process_dlg = mp.MyProcess(None, self.onCancel)
        self.is_cancel = False
        self.env = platform.system()

    def on_choose_dir(self, event):
        file_wildcard = "*"
        dlg = wx.FileDialog(self, u"请选择图片目录",
                            os.getcwd(),
                            style=wx.OPEN | wx.MULTIPLE,
                            wildcard=file_wildcard)
        if dlg.ShowModal() == wx.ID_OK:
            file_names = dlg.GetPaths()
            for fn in file_names:
                self.m_listBox1.Append(fn)
                # self.pic_gallery.Add(wx.StaticText(self, -1, fn), 0, wx.ALIGN_LEFT)
        dlg.Destroy()
        pass

    def on_png_to_webp(self, event):
        items = self.m_listBox1.GetItems()
        if len(items) > 0 and self.lib_exist():
            command = 'lib_mac%simg2webp' % os.sep
            if self.env == 'Linux':
                command = 'lib_linux%simg2webp' % os.sep
            elif self.env == 'Windows':
                command = 'lib_windows%simg2webp.exe' % os.sep
            self.my_process_dlg.m_staticText3.SetLabel(u'处理中')
            self.my_process_dlg.m_button5.SetLabel(u'取消')
            self.is_cancel = False
            self.my_process_dlg.m_gauge1.SetRange(len(items))
            self.my_process_dlg.m_gauge1.SetValue(0)
            self.my_process_dlg.Show()
            count = 0
            dest_dir = '%s%shappy_webp' % (os.getcwd(), os.sep)
            if not os.path.exists(dest_dir):
                os.mkdir(dest_dir)
            tmp_dir = '%s%stmp' % (os.getcwd(), os.sep)
            if not os.path.exists(tmp_dir):
                os.mkdir(tmp_dir)
            for item in items:
                if not self.is_cancel:
                    filename = item[item.rindex(os.sep):]
                    shutil.copy(item, '%s%s' % (tmp_dir, os.sep))
                    os.system(
                        '%s %s%s%s -o %s%s%s.webp' % (
                            command, tmp_dir, os.sep, filename, dest_dir, os.sep,
                            item[item.rindex(os.sep) + 1:item.rindex('.')]))
                    os.remove('%s%s%s' % (tmp_dir, os.sep, filename))
                    count += 1
                    self.my_process_dlg.m_gauge1.SetValue(count)
                else:
                    break
            self.my_process_dlg.m_staticText3.SetLabel(u"输出路径:%s" % dest_dir)
            self.my_process_dlg.m_button5.SetLabel(u'完成')

    def on_webp_to_animate(self, event):
        items = self.m_listBox1.GetItems()
        if len(items) > 0 and self.lib_exist():
            command = 'lib_mac%swebpmux' % os.sep
            if self.env == 'Linux':
                command = 'lib_linux%swebpmux' % os.sep
            elif self.env == 'Windows':
                command = 'lib_windows%swebpmux' % os.sep
            self.my_process_dlg.m_staticText3.SetLabel(u'处理中')
            self.my_process_dlg.m_button5.SetLabel(u'取消')
            self.is_cancel = False
            self.my_process_dlg.m_gauge1.SetRange(len(items))
            self.my_process_dlg.m_gauge1.SetValue(0)
            self.my_process_dlg.Show()
            dest_dir = '%s%shappy_animate_webp' % (os.getcwd(), os.sep)
            gap = int(self.m_textCtrl1.GetValue())
            if not os.path.exists(dest_dir):
                os.mkdir(dest_dir)
            tmp_dir = '%s%stmp' % (os.getcwd(), os.sep)
            if not os.path.exists(tmp_dir):
                os.mkdir(tmp_dir)
            tmp_files = []
            for item in items:
                filename = item[item.rindex(os.sep):]
                shutil.copy(item, '%s%s' % (tmp_dir, os.sep))
                tmp_files.append('%s%s%s' % (tmp_dir, os.sep, filename))
                # webpmux -frame 1.webp +100 -frame 2.webp +100+50+50 -frame 3.webp +100+50+50+1+b -loop 10 -bgcolor 255,255,255,255 -o anim_container.webp
            os.system(
                '%s %s -o %s%sanimate.webp' % (command,
                                               ' '.join(['-frame %s +%d+0+0+1+b' % (x, gap) for x in tmp_files]),
                                               dest_dir,
                                               os.sep))
            for tf in tmp_files:
                os.remove(tf)
            self.my_process_dlg.m_gauge1.SetValue(len(items))
            self.my_process_dlg.m_staticText3.SetLabel(u"输出路径:%s" % dest_dir)
            self.my_process_dlg.m_button5.SetLabel(u'完成')

    def onClear(self, event):
        self.m_listBox1.Clear()

    def onCancel(self):
        self.is_cancel = True
        self.my_process_dlg.Close()

    def lib_exist(self):
        if self.env == 'Darwin':
            if not os.path.exists('lib_mac'):
                dlg = wx.MessageDialog(None,
                                       u"请到http://download.csdn.net/detail/xanxus46/9794013 下载并解压到%s下" % os.getcwd(),
                                       u"lib_mac/webp类库找不到")
                dlg.ShowModal()
                dlg.Destroy()
                return False
            else:
                return True
        elif self.env == 'Linux':
            if not os.path.exists('lib_linux'):
                dlg = wx.MessageDialog(None,
                                       u"请到http://download.csdn.net/detail/xanxus46/9793858 下载并解压到%s下" % os.getcwd(),
                                       u"lib_linux/webp类库找不到"
                                       )
                dlg.ShowModal()
                dlg.Destroy()
                return False
            else:
                return True
        elif self.env == 'Windows':
            if not os.path.exists('lib_windows'):
                dlg = wx.MessageDialog(None,
                                       u"请到http://download.csdn.net/detail/xanxus46/9794046 下载并解压到%s下" % os.getcwd(),
                                       u"lib_windows\\webp类库找不到")
                dlg.ShowModal()
                dlg.Destroy()
                return False
            else:
                return True
        else:
            return True

其余的可参考http://download.csdn.net/detail/xanxus46/9794411完整的代码

下面介绍一下用pyinstaller打包好的程序的使用方法吧

下载地址:

windows http://download.csdn.net/detail/xanxus46/9794351

mac http://download.csdn.net/detail/xanxus46/9794400,程序是main.cpp不是main,两者运行当前目录不同~

linux 由于google提供的libwep二进制程序运行不了,需要编译源码,我就没弄了

使用很简单,打开软件会看到主界面

点击选择图片,然后如果是需要png转webp则选择png图片,需要静态webp转动态webp则选择webp图片,填上每帧的时间间隔,可多选。点击清除可清除已选的所有图片。

注意,这里不要选文件名带有中文的图片,因为python自古以来的编码问题,你懂的,但路径中可以带中文,这没问题。转化过程中,可能会报错,最可能是libwebp工具包不在当前目录,这里提供几个下载地址,其他的自行百度到google开发者页面下载吧

libwebp工具包下载地址:

windows64位:http://download.csdn.net/detail/xanxus46/9794046

mac:http://download.csdn.net/detail/xanxus46/9794013,mac真心简单

linux:http://download.csdn.net/detail/xanxus46/9793858,这个在ubuntu12.04运行不了,需要重新编译源码,不过其他系统可以尝试一下

转化完成后,会在程序的当前目录产生两个文件夹,一个是png转webp的目录happy_webp,另一个是静态转动态的目录happy_animate_webp,文件名和原来一样,只是扩展名改成webp,如图

对于webp图片的查看,可以用chrome浏览器打开,毕竟是google自家的产品嘛。

在用windows的程序时,可能会出现什么windows imaging component找不到的错误,这时需要从微软官网上下载,http://www.microsoft.com/en-us/download/details.aspx?id=32,windows问题真不少,博主推荐大家用mac的程序,几乎不会有什么兼容性问题哈~

好了,程序介绍完毕,欢迎大家留言咨询~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年03月27日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
python爬取某乎评论下的所有图片
对于很多人来说,拥有一个漂亮的女朋友是一件非常幸福的事情。某乎上就有一个非常热门的话题,叫做有个漂亮女朋友是种怎样的体验?在某乎上阅读量已经达到了5亿的阅读量,受到了十万多人的关注。
@莜莜
2021/04/17
8760
喜欢去知乎炸鱼?用python吧
知乎高赞贴: 有一双大长腿是什么体验? 有一副迷人的身材是什么体验? 别用手机费劲的翻了,python帮你一臂之力 import re import requests import os import urllib.request import ssl from urllib.parse import urlsplit from os.path import basename # 全局禁用证书验证 ssl._create_default_https_context = ssl._create_unve
超蛋lhy
2019/05/23
8260
Python学习笔记四(Python
Python os模块提供了一个统一的操作系统接口函数,通过python os模块可以实现对系统本身的命令,文件,目录进行操作,官方参考文档( http://docs.python.org/library/os)。 1)os.sep 可以取代操作系统特定的路径分割符(在Linux、Unix下它是'/',在Windows下它是'\\',而在Mac OS下它是':')。
py3study
2020/01/10
3600
python 跨平台python脚本启动器
------------------------------------调用方式-------------------------------- import Launcher Launcher.launchBookExamples(['PyDemos.pyw'], trace=False) ----------------------------------Launcher.py--------------------------------
用户5760343
2022/05/13
7530
python的pip快速安装代码
pip install xx,经常由于网速,或者安装版本问题导致安装速度慢超时等问题,
全栈程序员站长
2021/04/07
7590
python实现的摩斯电码解码\编码器
代码地址如下:http://www.demodashi.com/demo/14743.html
用户7886150
2021/01/01
8720
python学习_24(目录)
os.curdir 返回当前目录 >>> os.curdir '.' os.pardir 返回当前目录的父目录 >>> os.pardir '..' #切换到上级目录 >>> os.chdir(os.pardir) >>> os.getcwd() 'E:\\' os.getcwd() 获取当前工作目录 >>> os.getcwd() 'E:\\' >>> os.chdir("个人") >>> os.getcwd() 'E:\\个人' os.chdir(path) 切换到指定工作目录 >>> os.c
py3study
2020/01/14
6610
Python小工具 | 如何自动下载、压缩并批量替换文章中的外链图片
由于前段时间JsdelivrCDN加速的崩盘,博主存在Github上的图片全部访问失败,文章阅读体验极差,于是2022年以后的文章全部采用npm做图床,在此之前的文章由于数量过多并没有替换。再加上之前一直忙着研一阶段的期末考,懒得动博客。幸好这段时间有空,于是写了个python小工具来替换博客中外链图片,具体流程如下:
Justlovesmile
2022/09/02
8240
ansible自动化部署工具
Ansible是一种IT自动化工具。它可以配置系统,部署软件以及协调更高级的IT任务,例如持续部署,滚动更新。Ansible适用于管理企业IT基础设施,从具有少数主机的小规模到数千个实例的企业环境。Ansible也是一种简单的自动化语言,可以完美地描述IT应用程序基础结构。
yuezhimi
2020/09/30
2.3K0
ansible自动化部署工具
wxPython:Python首选的GUI库 | CSDN博文精选
跨平台的GUI工具库,较为有名的当属GTK+、Qt 和 wxWidgets 了。GTK+是C实现的,由于C语言本身不支持OOP,因而GTK+上手相当困难,写起来也较为复杂艰涩。Qt 和 wxWidgets 则是C++实现的,各自拥有庞大的用户群体。虽然我喜欢wxWidgets,但还是尽可能客观地搜集了关于Qt 和 wxWidgets 的对比评价。
AI科技大本营
2019/11/12
3.2K0
wxPython_04_实现Frame之间的跳转/更新的一种方法
wxPython是Python中重要的GUI框架,下面通过自己的方法实现模拟类似PC版微信登录,并跳转到主界面(朋友圈)的流程。
码农帮派
2020/04/01
1.2K0
wxPython_04_实现Frame之间的跳转/更新的一种方法
python3基础:目录操作
os模块提供了统一的操作系统接口函数,python中对文件和文件夹的操作都要涉及到os和shutil模块,在使用前需要使用import引入,例如;
py3study
2020/01/09
1.4K0
爬虫 (二十二) 最常见的文件操作模块(值得收藏) (十三)
相信如果你慢慢把这篇文章读完,然后加以实践,你会对 python 文件操作会有很大的理解,加油看完哦
公众号---人生代码
2020/01/14
1K0
爬虫 (二十二) 最常见的文件操作模块(值得收藏) (十三)
编写一个网易云音乐爬虫程序
本次借助wxPython编写一个网易云音乐的爬虫程序,能够根据一个歌单链接下载其下的所有音乐
冰霜
2022/03/15
1.3K0
编写一个网易云音乐爬虫程序
Python之os.path路径模块中的操作方法总结
#os.path模块主要集成了针对路径文件夹的操作功能,这里我们就来看一下Python中的os.path路径模块中的操作方法总结,需要的朋友可以参考下 解析路径 路径解析依赖与os中定义的一些变量: os.sep-路径各部分之间的分隔符。 os.extsep-文件名与文件扩展名之间的分隔符。 os.pardir-路径中表示目录树上一级的部分。 os.curdir-路径中当前目录的部分。 split()函数将路径分解为两个单独的部分,并返回包含这些结果的tuple。第二个元素是路径的最后部分,地一个元素是其他
Jetpropelledsnake21
2018/05/03
1.2K0
配置文件管理维护到gitlab上(下)
二.脚本 服务端 ecs-file-master.py 要修改脚本,host为服务端ip,git的url为项目地址,要手动建好 #!/usr/bin/python3 #当同一个文件更新2次时,则提交一次到线上 #nohup /usr/bin/python3 -u /root/bin/ecs-file-master.py >> /var/log/ecs-file-master.log 2>&1 & from socket import * import sys, time, os, json, struct
陈不成i
2021/05/31
3670
python sftp
http://kaifly.blog.51cto.com/3209616/1832200
py3study
2020/01/10
3.2K0
python生成微信好友头像图
更新本地pip python -m pip install --upgrade pip C:\Users\allms>python -m pip install --upgrade pip Collecting pip Downloading https://files.pythonhosted.org/packages/f9/fb/863012b13912709c13cf5cfdbfb304fa6c727659d6290438e1a88df9d848/pip-19.1-py2.py3-none-any
暖月寒星
2020/03/12
1.8K0
用 Python 爬取豆瓣电影海报
之前写过一篇用 Python 爬取豆瓣上的图片,那今天就来写一下爬取豆瓣上的电影海报,算是姐妹篇。
伪君子
2019/03/01
1.5K0
用 Python 爬取豆瓣电影海报
python练习记录
# -*- coding: utf-8 -*- import random,fileinput,calendar import string,datetime import time import re,os,sys class Monday(): # 现在日期 now = datetime.datetime.now() NowYear = now.year LastYear = now.year - 1 NextYear = now.year + 1 de
py3study
2020/01/08
5550
相关推荐
python爬取某乎评论下的所有图片
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档