Поскольку ответ nacho-coloma помог мне, я взял его превосходный сценарий и немного облегчил его использование на ежедневной основе.
Первое:
- Создайте каталог
drawable-svg
рядом с вашим каталогом res
. - Поместите ваши SVG-файлы и этот скрипт в
drawable-svg
. - Сделайте скрипт исполняемым.
- Запустите его.В Ubuntu вы можете просто дважды щелкнуть по нему в Nautilus и запустить в терминале.
И позже, когда вы получите новые svg-файлы:
Поместите новые svg-файлы в
drawable-svg
и снова запустите скрипт.
По умолчанию он будет делать то, что вам нужно: масштабировать каждый svg-файл в png-файлы и помещать их в ../res/drawable-mdpi
,../res/drawable-hdpi
и т. Д.
Сценарий принимает два параметра:
- Шаблон файла SVG для масштабирования, по умолчанию:
*.svg
- Базовый каталог для пут,по умолчанию
../res/
(т. е. ваш каталог res
с вышеупомянутой настройкой).
Вы можете поэкспериментировать, масштабируя один svg в pngs в текущем каталоге следующим образом:
$ ./svg2png test.svg .
Или просто обработать все изображения:
$ ./svg2png
Полагаю, вы могли бы поместить drawable-svg
в директорию res, но я не изучал, что скрывается в окончательном APK.Кроме того, у моих файлов svg есть -
в именах, что не нравится Android, и мой скрипт заботится о переименовании файлов png во что-то допустимое на Android.
Я использую ImageMagick для преобразованиячто немного более стандартно, чем Inkscape (хотя мне понравился подход).Оба метода включены в скрипт для справки.
Вот скрипт:
#!/bin/bash
scalesvg ()
{
svgfile="$1"
pngdir="$2"
pngscale="$3"
qualifier="$4"
svgwidthxheight=$(identify "$svgfile" | cut -d ' ' -f 3)
svgwidth=${svgwidthxheight%x*}
svgheight=${svgwidthxheight#*x}
pngfile="$(basename $svgfile)" # Strip path.
pngfile="${pngfile/.svg/.png}" # Replace extension.
pngfile="${pngfile/[^A-Za-z0-9._]/_}" # Replace invalid characters.
pngfile="$pngdir/$qualifier/$pngfile" # Prepend output path.
if [ ! -d $(dirname "$pngfile") ]; then
echo "WARNING: Output directory does not exist: $(dirname "$pngfile")"
#echo "Exiting"
#exit 1
echo "Outputting here instead: $pngfile"
pngfile="$qualifier-${svgfile/.svg/.png}"
fi
pngwidth=$(echo "scale=0; $svgwidth*$pngscale" | bc -l)
pngheight=$(echo "scale=0; $svgheight*$pngscale" | bc -l)
pngdensity=$(echo "scale=0; 72*$pngscale" | bc -l) # 72 is default,
echo "$svgfile ${svgwidth}×${svgheight}px -> $pngfile ${pngwidth}×${pngheight}px @ $pngdensity dpi"
convert -background transparent -density $pngdensity "$svgfile" "$pngfile"
#inkscape -w${pngwidth} --export-background-opacity=0 --export-png="$pngfile" "$svgfile" > /dev/null
#convert "$svgfile" -background transparent -scale ${pngwidth}x${pngheight} "$pngfile"
}
svgfiles="$1"
svgfiles="${svgfiles:=*.svg}" # Default to input all *.svg in current dir.
pngdir="$2"
pngdir="${pngdir:=../res}" # Default to place output pngs to ../res, ie. ../res/drawable-hdpi etc.
for svgfile in $svgfiles; do
echo "Scaling $svgfile ..."
scalesvg "$svgfile" "$pngdir" 0.75 drawable-ldpi
scalesvg "$svgfile" "$pngdir" 1 drawable-mdpi
scalesvg "$svgfile" "$pngdir" 1.5 drawable-hdpi
scalesvg "$svgfile" "$pngdir" 2 drawable-xhdpi
scalesvg "$svgfile" "$pngdir" 3 drawable-xxhdpi
scalesvg "$svgfile" "$pngdir" 4 drawable-xxxhdpi
done
echo -n "Done."
read # I've made it wait for Enter -- convenient when run from Nautilus.