将android资源位图批量转换为不同密度的工具

Mar*_*era 9 android resolution bitmap android-layout android-resources

我需要在Android上发布后支持不同的显示密度

在开发过程中,drawable-hdpi已经增长到160 png(就像其中的20个9补丁)资产

我现在需要将所有这些位图转换为mdpi,ldpi(布局和drawables XML已经很好了,以避免在LayoutInflater上引发OOM

有没有适合批量转换所有这些位图的工具?

Sab*_*ado 15

这是一个简单的脚本,可以从更高分辨率的Android绘图中创建更低分辨率的Android绘图.

例如,给定一批-xhdpi图像,它可以生成-hdpi和-mdpi图像.

使用此脚本,可以仅从创作工具导出最高分辨率的图稿,然后使用一些批处理命令创建较低分辨率的版本.

脚本用法:

drawable_convert.py -d res/drawable-mdpi -d res/drawable-hdpi res/drawable-xhdpi-v14/*.png
Run Code Online (Sandbox Code Playgroud)

这将从xhdpi获取每个png文件,并将低分辨率版本放入mdpi和hdpi文件夹.

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


脚本本身,以避免依赖github gist /原始blogpost.
名称为drawable_convert.py

#!/usr/bin/python

import 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.
'''

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:
            (srcpath, srcname) = os.path.split(src)
            dst = os.path.join(dstpath, srcname)
            self.convertOne(src, dst)

    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

'''
Run Code Online (Sandbox Code Playgroud)


Dav*_*oyd 7

Final-Android-Resizer为我完成了这项工作并且使用简单但具有我需要的所有选项:https://github.com/asystat/Final-Android-Resizer


use*_*430 5

Android Asset Studio可能会有所帮助,尽管它并不完全符合您的要求.