9

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

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

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

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

4

7 回答 7

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/
原脚本,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

'''
于 2012-09-28T13:15:51.123 回答
8

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

于 2015-02-08T23:39:09.130 回答
5

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

于 2012-09-28T13:13:57.473 回答
2

其他人制作了这个非常好的工具,它可以从 iOS 资源或您拥有的任何最高分辨率的 Android 资源中自动调整大小。

于 2014-02-07T08:14:46.690 回答
2

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

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

截屏

在您的情况下,您将源比例因子设置为 2 并检查“跳过升级”也将平台设置为 Android。

于 2016-03-13T19:18:45.410 回答
1

看这个:

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

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

于 2015-08-26T08:50:43.073 回答
1

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

您必须(批量)上传图像,然后使用该工具的 gradle plugin将调整大小/转换后的图像直接同步到您的项目。

请注意,它需要您创建一个帐户(免费),因为它会直接将任何更改同步到您的项目。(因此您可以添加/更改图像(svg、pdf、png、jpeg),它会在下一次构建时自动添加/更改项目中转换后的文件。)

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

(我应该注意到我在这个工具上工作,我认为它真的很酷,我个人使用它。我没有分享它。)

于 2019-11-26T13:36:29.500 回答