Skip to content Skip to sidebar Skip to footer

Tool To Batch Convert Android Resource Bitmaps To Different Densities

I need to post-release support different display densities on Android During development drawable-hdpi has grown to 160 png (like 20 of them 9 patch) assets I now need to convert a

Solution 1:

Here is a simple script to create lower-resolution Android drawables from higher-resolution ones.

For example, given a batch of -xhdpi images, it can generate -hdpi and -mdpi images.

With this script, it’s possible to export only highest-resolution artwork from authoring tools and then create the lower-resolution versions with a few batch commands.

Script usage:

drawable_convert.py -d res/drawable-mdpi -d res/drawable-hdpi res/drawable-xhdpi-v14/*.png

This will take every png file from xhdpi and place lower-resolution versions into mdpi and hdpi folders.

http://kmansoft.com/2012/05/23/scale-android-drawables-with-a-script/original script, https://gist.github.com/2771791


Script itself, to avoid dependency on github gist/original blogpost. name drawable_convert.py

#!/usr/bin/pythonimport sys
import argparse
import os
import re

'''
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.
'''classConverter:
    def__init__(self, dstList):
        printu'Dst list: {0}'.format(dstList)
        self.mDstList = dstList

    defconvert(self, src):
        for dstpath in self.mDstList:
            (srcpath, srcname) = os.path.split(src)
            dst = os.path.join(dstpath, srcname)
            self.convertOne(src, dst)

    defconvertOne(self, src, dst):
        printu'\n*****\n{0} to {1}\n*****\n'.format(src, dst)
        '''
        Determine relative density
        '''
        srcDpi = self.getDpi(src)
        dstDpi = self.getDpi(dst)

        if srcDpi < dstDpi:
            printu'NOT converting from {0}dpi to {1}dpi'.format(srcDpi, dstDpi)
        else:
            factor = dstDpi*100/srcDpi
            printu'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)

    defgetDpi(self, f):
        p = os.path.dirname(f)
        if re.match('.*drawable.*\\-mdpi.*', p):
            return160elif re.match('.*drawable.*\\-hdpi.*', p):
            return240elif re.match('.*drawable.*\\-xhdpi.*', p):
            return320else:
            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

'''

Solution 2:

Solution 3:

Android Asset Studio may be helpful, although it is not exactly what you asked for.

Solution 4:

Someone else made this really nice tool, which can automatically resize from either iOS assets, or whichever highest-resolution Android assets you have.

Solution 5:

I created a tool that can batch reisze images of different types (png, jpg, gif, svg, psd, 9-patch..). Uses hiqh quality scaling algorithms and supports certain lossless compression tools like pngcrush. There is a GUI and command line ui.

https://github.com/patrickfav/density-converter

Screenshot

In your case you would set the source scale factor to 2 and check "skip upscaling" also set the platform to Android.

Post a Comment for "Tool To Batch Convert Android Resource Bitmaps To Different Densities"