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

时间:2012-09-28 13:11:11

标签: android android-layout bitmap resolution android-resources

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

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

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

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

7 个答案:

答案 0 :(得分:14)

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

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

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

脚本用法:

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

这将从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 / original 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

'''

答案 1 :(得分:7)

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

答案 2 :(得分:5)

Android Asset Studio可能会有所帮助,但并不完全符合您的要求。

答案 3 :(得分:2)

其他人制作了this really nice tool,可以自动调整iOS资源或任何具有最高分辨率的Android资产。

答案 4 :(得分:2)

我创建了一个工具,可以批量重新分配不同类型的图像(png,jpg,gif,svg,psd,9-patch ..)。使用hiqh质量缩放算法并支持某些无损压缩工具,如pngcrush。有一个GUI和命令行ui。

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

Screenshot

在您的情况下,您将源比例因子设置为2并检查&#34;跳过升级&#34;还将平台设置为Android。

答案 5 :(得分:1)

看看这个:

只需上传并返回所有像素。

http://romannurik.github.io/AndroidAssetStudio/nine-patches.html

答案 6 :(得分:1)

我建议使用Respresso,它是一个在线工具,能够为Android(以及iOS)创建所有必需的尺寸(从xxxhdpi到mdpi)。

您必须批量上传图像,然后使用tool's gradle plugin将调整大小/转换后的图像直接同步到您的项目中。

请注意,这将要求您to create an account (for free) ,因为它将直接将任何更改同步到您的项目。 (因此,您可以添加/更改图像(svg,pdf,png,jpeg),并且它将在下一个版本中自动添加/更改项目中已转换的文件。)

当前它不支持9个补丁图像。

(我应该注意,我已经在使用该工具,并且我认为它真的很酷,我个人使用它。我没有任何分享。)