mirror of
https://github.com/Kilian/Trimage.git
synced 2026-01-26 10:08:40 -05:00
py2exe support
Usage: setup.py py2exe You must be able to start trimage.py before even attempting to use py2exe. It generates a standalone executable. That standalone exacutable starts up only if the following files can be found on the path: jpegoptim.exe optipng.exe advpng.exe (they must return 0) Compression does not work yet and the Windows versions of these tools are a lot slower than on Linux. The binaries I found were pretty old. They should most probably be recompiled to make use of new cpu features. Or we should find other tools. trimage.hurry.filename -> trimage.filename because py2exe couldn't deal with it
This commit is contained in:
parent
464337d033
commit
d282bcf8e9
5 changed files with 140 additions and 8 deletions
21
setup.py
21
setup.py
|
|
@ -1,5 +1,11 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
import sys
|
||||||
|
win=(sys.platform == "win32")
|
||||||
|
if win:
|
||||||
|
import py2exe
|
||||||
|
sys.path.append("src/trimage")
|
||||||
|
|
||||||
from distutils.core import setup
|
from distutils.core import setup
|
||||||
|
|
||||||
setup(name = "trimage",
|
setup(name = "trimage",
|
||||||
|
|
@ -11,8 +17,7 @@ setup(name = "trimage",
|
||||||
license = "MIT license",
|
license = "MIT license",
|
||||||
package_dir = {'trimage' : 'src/trimage'},
|
package_dir = {'trimage' : 'src/trimage'},
|
||||||
packages = ["trimage",
|
packages = ["trimage",
|
||||||
"trimage.hurry",
|
"trimage.filesize",
|
||||||
"trimage.hurry.filesize",
|
|
||||||
"trimage.ThreadPool",],
|
"trimage.ThreadPool",],
|
||||||
package_data = {"trimage" : ["pixmaps/*.*"] },
|
package_data = {"trimage" : ["pixmaps/*.*"] },
|
||||||
data_files=[('share/icons/hicolor/scalable/apps', ['desktop/trimage.svg']),
|
data_files=[('share/icons/hicolor/scalable/apps', ['desktop/trimage.svg']),
|
||||||
|
|
@ -20,4 +25,16 @@ setup(name = "trimage",
|
||||||
scripts = ["trimage"],
|
scripts = ["trimage"],
|
||||||
long_description = """Trimage is a cross-platform GUI and command-line interface to optimize image files via optipng, advpng and jpegoptim, depending on the filetype (currently, PNG and JPG files are supported). It was inspired by imageoptim. All image files are losslessy compressed on the highest available compression levels. Trimage gives you various input functions to fit your own workflow: A regular file dialog, dragging and dropping and various command line options.""",
|
long_description = """Trimage is a cross-platform GUI and command-line interface to optimize image files via optipng, advpng and jpegoptim, depending on the filetype (currently, PNG and JPG files are supported). It was inspired by imageoptim. All image files are losslessy compressed on the highest available compression levels. Trimage gives you various input functions to fit your own workflow: A regular file dialog, dragging and dropping and various command line options.""",
|
||||||
requires = ["PyQt4 (>=4.4)"],
|
requires = ["PyQt4 (>=4.4)"],
|
||||||
|
|
||||||
|
#for py2exe
|
||||||
|
windows=[r'src\trimage\trimage.py'],
|
||||||
|
zipfile=None,
|
||||||
|
options={"py2exe":{
|
||||||
|
"optimize":2,
|
||||||
|
"compressed":1,
|
||||||
|
"bundle_files":1,
|
||||||
|
"includes":["sip",],
|
||||||
|
"excludes":['email'],
|
||||||
|
},
|
||||||
|
},
|
||||||
)
|
)
|
||||||
|
|
|
||||||
1
src/trimage/filesize/README.txt
Normal file
1
src/trimage/filesize/README.txt
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
http://pypi.python.org/pypi/hurry.filesize
|
||||||
2
src/trimage/filesize/__init__.py
Normal file
2
src/trimage/filesize/__init__.py
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
from filesize import size
|
||||||
|
from filesize import traditional, alternative, verbose, iec, si
|
||||||
110
src/trimage/filesize/filesize.py
Normal file
110
src/trimage/filesize/filesize.py
Normal file
|
|
@ -0,0 +1,110 @@
|
||||||
|
|
||||||
|
traditional = [
|
||||||
|
(1024 ** 5, 'P'),
|
||||||
|
(1024 ** 4, 'T'),
|
||||||
|
(1024 ** 3, 'G'),
|
||||||
|
(1024 ** 2, 'M'),
|
||||||
|
(1024 ** 1, 'K'),
|
||||||
|
(1024 ** 0, 'B'),
|
||||||
|
]
|
||||||
|
|
||||||
|
alternative = [
|
||||||
|
(1024 ** 5, ' PB'),
|
||||||
|
(1024 ** 4, ' TB'),
|
||||||
|
(1024 ** 3, ' GB'),
|
||||||
|
(1024 ** 2, ' MB'),
|
||||||
|
(1024 ** 1, ' KB'),
|
||||||
|
(1024 ** 0, (' byte', ' bytes')),
|
||||||
|
]
|
||||||
|
|
||||||
|
verbose = [
|
||||||
|
(1024 ** 5, (' petabyte', ' petabytes')),
|
||||||
|
(1024 ** 4, (' terabyte', ' terabytes')),
|
||||||
|
(1024 ** 3, (' gigabyte', ' gigabytes')),
|
||||||
|
(1024 ** 2, (' megabyte', ' megabytes')),
|
||||||
|
(1024 ** 1, (' kilobyte', ' kilobytes')),
|
||||||
|
(1024 ** 0, (' byte', ' bytes')),
|
||||||
|
]
|
||||||
|
|
||||||
|
iec = [
|
||||||
|
(1024 ** 5, 'Pi'),
|
||||||
|
(1024 ** 4, 'Ti'),
|
||||||
|
(1024 ** 3, 'Gi'),
|
||||||
|
(1024 ** 2, 'Mi'),
|
||||||
|
(1024 ** 1, 'Ki'),
|
||||||
|
(1024 ** 0, ''),
|
||||||
|
]
|
||||||
|
|
||||||
|
si = [
|
||||||
|
(1000 ** 5, 'P'),
|
||||||
|
(1000 ** 4, 'T'),
|
||||||
|
(1000 ** 3, 'G'),
|
||||||
|
(1000 ** 2, 'M'),
|
||||||
|
(1000 ** 1, 'K'),
|
||||||
|
(1000 ** 0, 'B'),
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def size(bytes, system=traditional):
|
||||||
|
"""Human-readable file size.
|
||||||
|
|
||||||
|
Using the traditional system, where a factor of 1024 is used::
|
||||||
|
|
||||||
|
>>> size(10)
|
||||||
|
'10B'
|
||||||
|
>>> size(100)
|
||||||
|
'100B'
|
||||||
|
>>> size(1000)
|
||||||
|
'1000B'
|
||||||
|
>>> size(2000)
|
||||||
|
'1K'
|
||||||
|
>>> size(10000)
|
||||||
|
'9K'
|
||||||
|
>>> size(20000)
|
||||||
|
'19K'
|
||||||
|
>>> size(100000)
|
||||||
|
'97K'
|
||||||
|
>>> size(200000)
|
||||||
|
'195K'
|
||||||
|
>>> size(1000000)
|
||||||
|
'976K'
|
||||||
|
>>> size(2000000)
|
||||||
|
'1M'
|
||||||
|
|
||||||
|
Using the SI system, with a factor 1000::
|
||||||
|
|
||||||
|
>>> size(10, system=si)
|
||||||
|
'10B'
|
||||||
|
>>> size(100, system=si)
|
||||||
|
'100B'
|
||||||
|
>>> size(1000, system=si)
|
||||||
|
'1K'
|
||||||
|
>>> size(2000, system=si)
|
||||||
|
'2K'
|
||||||
|
>>> size(10000, system=si)
|
||||||
|
'10K'
|
||||||
|
>>> size(20000, system=si)
|
||||||
|
'20K'
|
||||||
|
>>> size(100000, system=si)
|
||||||
|
'100K'
|
||||||
|
>>> size(200000, system=si)
|
||||||
|
'200K'
|
||||||
|
>>> size(1000000, system=si)
|
||||||
|
'1M'
|
||||||
|
>>> size(2000000, system=si)
|
||||||
|
'2M'
|
||||||
|
|
||||||
|
"""
|
||||||
|
for factor, suffix in system:
|
||||||
|
if bytes >= factor:
|
||||||
|
break
|
||||||
|
amount = int(bytes/factor)
|
||||||
|
if isinstance(suffix, tuple):
|
||||||
|
singular, multiple = suffix
|
||||||
|
if amount == 1:
|
||||||
|
suffix = singular
|
||||||
|
else:
|
||||||
|
suffix = multiple
|
||||||
|
return str(amount) + suffix
|
||||||
|
|
||||||
14
src/trimage/trimage.py
Executable file → Normal file
14
src/trimage/trimage.py
Executable file → Normal file
|
|
@ -9,7 +9,7 @@ from optparse import OptionParser
|
||||||
|
|
||||||
from PyQt4.QtCore import *
|
from PyQt4.QtCore import *
|
||||||
from PyQt4.QtGui import *
|
from PyQt4.QtGui import *
|
||||||
from hurry.filesize import *
|
from filesize import *
|
||||||
from imghdr import what as determinetype
|
from imghdr import what as determinetype
|
||||||
|
|
||||||
from Queue import Queue
|
from Queue import Queue
|
||||||
|
|
@ -209,18 +209,19 @@ class StartQT4(QMainWindow):
|
||||||
|
|
||||||
def checkapps(self):
|
def checkapps(self):
|
||||||
"""Check if the required command line apps exist."""
|
"""Check if the required command line apps exist."""
|
||||||
|
exe=".exe" if (sys.platform=="win32") else ""
|
||||||
status = False
|
status = False
|
||||||
retcode = self.safe_call("jpegoptim --version")
|
retcode = self.safe_call("jpegoptim"+exe+" --version")
|
||||||
if retcode != 0:
|
if retcode != 0:
|
||||||
status = True
|
status = True
|
||||||
sys.stderr.write("[error] please install jpegoptim")
|
sys.stderr.write("[error] please install jpegoptim")
|
||||||
|
|
||||||
retcode = self.safe_call("optipng -v")
|
retcode = self.safe_call("optipng"+exe+" -v")
|
||||||
if retcode != 0:
|
if retcode != 0:
|
||||||
status = True
|
status = True
|
||||||
sys.stderr.write("[error] please install optipng")
|
sys.stderr.write("[error] please install optipng")
|
||||||
|
|
||||||
retcode = self.safe_call("advpng --version")
|
retcode = self.safe_call("advpng"+exe+" --version")
|
||||||
if retcode != 0:
|
if retcode != 0:
|
||||||
status = True
|
status = True
|
||||||
sys.stderr.write("[error] please install advancecomp")
|
sys.stderr.write("[error] please install advancecomp")
|
||||||
|
|
@ -343,9 +344,10 @@ class Image:
|
||||||
raise "Tried to compress invalid image (unsupported format or not file)"
|
raise "Tried to compress invalid image (unsupported format or not file)"
|
||||||
self.reset()
|
self.reset()
|
||||||
self.compressing=True
|
self.compressing=True
|
||||||
|
exe=".exe" if (sys.platform=="win32") else ""
|
||||||
runString = {
|
runString = {
|
||||||
"jpeg": u"jpegoptim -f --strip-all '%(file)s'",
|
"jpeg": u"jpegoptim"+exe+" -f --strip-all '%(file)s'",
|
||||||
"png" : u"optipng -force -o7 '%(file)s'&&advpng -z4 '%(file)s'"}
|
"png" : u"optipng"+exe+" -force -o7 '%(file)s'&&advpng"+exe+" -z4 '%(file)s'"}
|
||||||
try:
|
try:
|
||||||
retcode = call(runString[self.filetype] % {"file": self.fullpath},
|
retcode = call(runString[self.filetype] % {"file": self.fullpath},
|
||||||
shell = True, stdout=PIPE)
|
shell = True, stdout=PIPE)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue