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

标签 android android-layout bitmap resolution android-resources

<分区>

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

在开发过程中,drawable-hdpi 已增长到 160 png(例如 20 个,其中 9 个补丁)

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

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

最佳答案

这是一个简单的脚本,用于从高分辨率的 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/原始博客文章。
名称 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

'''

关于android - 将android资源位图批量转换为不同密度的工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12640701/

相关文章:

android - 在其他 Activity 之上设计透明 Activity

android - 如何从android中的位图对象获取mime类型?

android - 如何使用 Intent.ACTION_SEND 将图像发送到 Android 上的 Facebook Messenger?

android - 延迟循环并暂停它

android - 新 Activity 空指针异常

android - 显示 Activity 的无限进度周期

android - 如何在android中获取动画?

在 C 中创建位图

android - 模块依赖性在 Android 中是如何工作的?

android - 有没有办法改变 View android的海拔颜色?