我需要在Android上发布支持不同的显示密度
在开发过程中, drawable-hdpi 已经增长到160 png(就像其中的20个9补丁)资产
我现在需要将所有这些位图转换为 mdpi,ldpi (布局和drawables XML已经很好,以避免在LayoutInflater上提高OOM
是否有适合批量转换所有这些位图的工具?
答案 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
在您的情况下,您将源比例因子设置为2并检查&#34;跳过升级&#34;还将平台设置为Android。
答案 5 :(得分:1)
答案 6 :(得分:1)
我建议使用Respresso,它是一个在线工具,能够为Android(以及iOS)创建所有必需的尺寸(从xxxhdpi到mdpi)。
您必须批量上传图像,然后使用tool's gradle plugin将调整大小/转换后的图像直接同步到您的项目中。
请注意,这将要求您to create an account (for free) ,因为它将直接将任何更改同步到您的项目。 (因此,您可以添加/更改图像(svg,pdf,png,jpeg),并且它将在下一个版本中自动添加/更改项目中已转换的文件。)
当前它不支持9个补丁图像。
(我应该注意,我已经在使用该工具,并且我认为它真的很酷,我个人使用它。我没有任何分享。)