Skip to content

Instantly share code, notes, and snippets.

@rtorr
Created October 5, 2012 19:00
Show Gist options
  • Save rtorr/3841711 to your computer and use it in GitHub Desktop.
Save rtorr/3841711 to your computer and use it in GitHub Desktop.
Android drawables conversion
#EXAMPLE $ vert -d res/drawable-mdpi -d res/drawable-hdpi res/drawable-xhdpi-v14/*.png
alias vert='python ~/git/android_tools/drawable_convert.py'
#!/usr/bin/python
import sys
import argparse
import os
import re
from sets import Set
'''
A simple script to create lower-resolution Android drawables from higher-resolution ones.
For example, given a batch of -xhdpi images, you can generate -hdpi and -mdpi images.
This makes it possible to only export highest-resolution artwork from image authoring tools, and
automate the rest.
Usage:
drawable_convert.py -d res/drawable-mdpi -d res/drawable-hdpi res/drawable-xhdpi-v14/select*.png
... will take select*.png from xhdpi and place versions into mdpi and hdpi folders.
Correct resize ratios are computed based on resource directory names.
Actual scaling is done by ImageMagick's convert command.
'''
# We are not converting 9 patches!!!!!!! (will replace with regex later)
allowed_chars = Set('012345678abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-./')
class Converter:
def __init__(self, dstList):
print u'Dst list: {0}'.format(dstList)
self.mDstList = dstList
def convert(self, src):
for dstpath in self.mDstList:
if Set(src).issubset(allowed_chars):
(srcpath, srcname) = os.path.split(src)
dst = os.path.join(dstpath, srcname)
self.convertOne(src, dst)
else:
print src +"This does not convert 9 patch files"
def convertOne(self, src, dst):
print u'\n*****\n{0} to {1}\n*****\n'.format(src, dst)
'''
Determine relative density
'''
srcDpi = self.getDpi(src)
dstDpi = self.getDpi(dst)
if srcDpi < dstDpi:
print u'NOT converting from {0}dpi to {1}dpi'.format(srcDpi, dstDpi)
else:
factor = dstDpi*100/srcDpi
print u'Converting from {0}dpi to {1}dpi, {2}%'.format(srcDpi, dstDpi, factor)
cmd = u'convert -verbose "{0}" -resize "{2}%x{2}%" "{1}"'.format(src, dst, factor)
os.system(cmd)
def getDpi(self, f):
p = os.path.dirname(f)
if re.match('.*drawable.*\\-mdpi.*', p):
return 160
elif re.match('.*drawable.*\\-hdpi.*', p):
return 240
elif re.match('.*drawable.*\\-xhdpi.*', p):
return 320
else:
raise ValueError(u'Cannot determine densitiy for {0}'.format(p))
if __name__ == "__main__":
'''
Parse command line arguments
'''
parser = argparse.ArgumentParser(description='Converts drawable resources in Android applications')
parser.add_argument('-d', dest='DST', action='append', required=True, help='destination directory')
parser.add_argument('src', nargs='+', help='files to convert (one or more)')
args = parser.parse_args()
cv = Converter(args.DST)
for src in args.src:
cv.convert(src)
'''
if [ $# -lt 1 ] ; then
echo "Usage: $0 file_list"
exit 1
fi
for f in $*
do
echo "File: ${f}"
convert -verbose "${f}" -resize "75%x75%" "../drawable-hdpi/${f}"
convert -verbose "${f}" -resize "50%x50%" "../drawable-mdpi/${f}"
done
'''

###Android drawables conversion

This script currently supports mdpi and higher, and I will be looking to add ldpi later on.

The best case scenario would be xhdpi -> hdip -> mdpi

Some sample android targets

Some emulator examples

This script requires imagemagick

Original python script was forked from (kmansoft) https://gist.github.com/2771791

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment