Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Проблема генерации .png тени в некоторых .svg при масштабировании картинки.  (Прочитано 583 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ase66

  • Автор темы
  • Участник
  • *
  • Сообщений: 196
    • Просмотр профиля
Использую этот скрипт rsvg-convert из Ubuntu 24.04
#!/bin/bash
size="$1"
which rsvg-convert > /dev/null 2>&1
if [[ ! $? -eq 0 ]]; then
    echo "rsvg-convert not installed."
    exit 1
elif [[ -z "$size" ]]; then
    echo "Please specify a size."
    exit 1
else
    rm -rf "$size"
    mkdir -p "$size"
    find . -maxdepth 1 -type f -name "*.svg" -print0 | while IFS= read -r -d '' file; do
        if [[ ! -h "$file" ]]; then
            comments=$(grep -o "<!--.*-->" "$file")
            rsvg-convert "$file" -w "$size" -h "$size" -f svg -o "$size/$file"
            sed -i -e "s/<[?]\?xml[^>]*>//g" -e "s/${size}pt/${size}px/g" -e "1s/^/${comments}/" "$size/$file"
        else
            cp -rdf "$file" "$size/"
        fi
    done
fi

(открыть папку с .svg в терминале, перетянуть в него скрипт, указать размер 48 нажать Enter)

После масштабирования в любой размер, в некоторых картинках тень преобразовывается в .png (внутри .svg картинки)
Возникает проблема размытия при масштабировании в верх.
Резко растёт размер файла. Часто встречаю в самых новых и Китайских .svg.

Пример

Картинка до rsvg-convert:
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><defs><filter id="0"><feGaussianBlur stdDeviation="1.0001"/></filter></defs><g transform="translate(0 -796.36)"><path d="m 59.778 1025.68 c 95.24 84.46 241.79 -48.767 182.53 -160.27 -59.906 -112.74 -258.16 -82.69 -241.3 55.767 c 5.02 41.2 27.695 76.954 58.764 104.51 z" fill="#3cb371" color="#000"/><g transform="matrix(2.32829 0 0 2.36112 11.644 811.59)" fill="#fff"><path d="m 8.446 0.003 c -0.091 0.009 -0.189 0.034 -0.257 0.102 c 0 0 -3.159 3.137 -3.159 3.137 -0.133 0.132 -0.149 0.334 -0.051 0.494 0 0 3.691 6.05 3.691 6.05 -0.655 1.094 -1.188 2.268 -1.562 3.512 0 0 -6.781 1.398 -6.781 1.398 c -0.189 0.039 -0.326 0.217 -0.326 0.409 c 0 0 0 4.433 0 4.433 0 0.188 0.144 0.348 0.326 0.392 0 0 6.575 1.586 6.575 1.586 0.352 1.441 0.895 2.819 1.614 4.075 0 0 -3.811 5.763 -3.811 5.763 -0.106 0.161 -0.086 0.376 0.051 0.512 0 0 3.159 3.137 3.159 3.137 0.133 0.132 0.337 0.148 0.498 0.051 0 0 5.974 -3.598 5.974 -3.598 1.172 0.672 2.44 1.21 3.777 1.569 0 0 1.391 6.65 1.391 6.65 0.039 0.188 0.201 0.324 0.395 0.324 0 0 4.463 0 4.463 0 0.188 0 0.35 -0.125 0.395 -0.307 0 0 1.648 -6.684 1.648 -6.684 1.378 -0.369 2.678 -0.917 3.88 -1.62 0 0 5.888 3.836 5.888 3.836 0.162 0.105 0.377 0.085 0.515 -0.051 0 0 3.142 -3.137 3.142 -3.137 0.133 -0.132 0.166 -0.335 0.069 -0.494 0 0 -2.146 -3.512 -2.146 -3.512 0 0 -0.918 0.207 -0.978 0.119 0 0 -1.355 -1.98 -3.124 -4.552 -2.115 4.111 -6.43 6.922 -11.399 6.922 -7.06 0 -12.789 -5.69 -12.789 -12.703 0 -5.159 3.106 -9.589 7.553 -11.577 0 0 0 -3.274 0 -3.274 -0.809 0.281 -1.591 0.621 -2.335 1.023 -0.002 -0.001 0.001 -0.016 0 -0.017 0 0 -6.03 -3.922 -6.03 -3.922 c -0.081 -0.053 -0.167 -0.06 -0.258 -0.051 z" transform="matrix(1.68117 0 0 1.68684 13.833 13.779)" filter="url(#0)" opacity="0.2"/><path transform="matrix(1.65278 0 0 1.64143 14.968 13.779)" d="m 8.446 0.003 c -0.091 0.009 -0.189 0.034 -0.257 0.102 c 0 0 -3.159 3.137 -3.159 3.137 -0.133 0.132 -0.149 0.334 -0.051 0.494 0 0 3.691 6.05 3.691 6.05 -0.655 1.094 -1.188 2.268 -1.562 3.512 0 0 -6.781 1.398 -6.781 1.398 c -0.189 0.039 -0.326 0.217 -0.326 0.409 c 0 0 0 4.433 0 4.433 0 0.188 0.144 0.348 0.326 0.392 0 0 6.575 1.586 6.575 1.586 0.352 1.441 0.895 2.819 1.614 4.075 0 0 -3.811 5.763 -3.811 5.763 -0.106 0.161 -0.086 0.376 0.051 0.512 0 0 3.159 3.137 3.159 3.137 0.133 0.132 0.337 0.148 0.498 0.051 0 0 5.974 -3.598 5.974 -3.598 1.172 0.672 2.44 1.21 3.777 1.569 0 0 1.391 6.65 1.391 6.65 0.039 0.188 0.201 0.324 0.395 0.324 0 0 4.463 0 4.463 0 0.188 0 0.35 -0.125 0.395 -0.307 0 0 1.648 -6.684 1.648 -6.684 1.378 -0.369 2.678 -0.917 3.88 -1.62 0 0 5.888 3.836 5.888 3.836 0.162 0.105 0.377 0.085 0.515 -0.051 0 0 3.142 -3.137 3.142 -3.137 0.133 -0.132 0.166 -0.335 0.069 -0.494 0 0 -2.146 -3.512 -2.146 -3.512 0 0 -0.918 0.207 -0.978 0.119 0 0 -1.355 -1.98 -3.124 -4.552 -2.115 4.111 -6.43 6.922 -11.399 6.922 -7.06 0 -12.789 -5.69 -12.789 -12.703 0 -5.159 3.106 -9.589 7.553 -11.577 0 0 0 -3.274 0 -3.274 -0.809 0.281 -1.591 0.621 -2.335 1.023 -0.002 -0.001 0.001 -0.016 0 -0.017 0 0 -6.03 -3.922 -6.03 -3.922 c -0.081 -0.053 -0.167 -0.06 -0.258 -0.051 z"/><path d="m 51.938 25.938 c -9.764 0 -17.656 7.574 -17.656 16.906 0 9.332 7.893 16.875 17.656 16.875 8.427 0 15.476 -5.617 17.25 -13.156 h -3.375 c -1.447 4.895 -5.95 8.469 -11.313 8.469 -6.532 0 -11.844 -5.311 -11.844 -11.844 0 -6.532 5.311 -11.813 11.844 -11.813 5.05 0 9.336 3.15 11.03 7.594 h 3.594 c -1.837 -7.463 -8.821 -13.03 -17.188 -13.03"/></g></g></svg>
Картинка после rsvg-convert:
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 256 256"><defs><image id="1" width="256" height="256" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAABmJLR0QA/wD/AP+gvaeTAAADIElEQVR4nO3UMQ0AIADAMCC8mMG/OGRwrFWwa/PsfQeQtH4HAP8YAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQZAIQ9lAYCR9zF4ScAAAAASUVORK5CYII="/><image id="3" width="48" height="48" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABmJLR0QA/wD/AP+gvaeTAAACN0lEQVRoge2YO2gVQRSG/4kmIIgvIvHRCkYFRWwiEtCIZSzEQlIIgp2VogiCVunV4hIsLQUhhWlsRBEUEh8EISCCBtEmEUQwigT9LBxx2NydfdydOwjzwRbLmZ3znX3MGVZKJBKJRKIGwKrYDrUBjgGfgPNAT2yfSgCjwA/+MQvsj+1VCmA9sMRKvgEXgSPA1dieXoA7bQpwedBNnzrv7yVJS574u5ou3QO43ObOLwLHY7uVAugD5hz598CO2F6VAFrOB7wvtk8lgM1WHOBabJ/K2AYG8AVYG9NlddEAYEDSkKQDzjFgw5PGmK/h9BoAeORZ88/E9ivTB3o9sehrfqcbseVGLDqgTAHzntiWhjxqU1iAMWZM0lZJpyRNSJpzwnsCeYUFuGE/4unYLrUADjkr0cEO59oUpZcAT20BT4DCfuKZ5xbQatKtTNJe4KXzFG7WnGcM+GWPo017+hJfadPUWoCvZ2TnOAssO9fPA9tDev9NvBP4ntOZnxV9E8AgMOnp7ier+JiK8j2SHkoa9g2T9FzSlKQ3khYkrZO0W9KIpMMFeT9I2hVkjwUM59y1n8BtYNpzZ13eAuPA55z4hcblnSKuZ5K9AIYyRd7PEXsFnAD67NhtwL3MmFmgP1gBNvE4sACcBla8DsBITgHncuYbBT4CM8CGoPI2oQHWeOIb+bM0Ztnruaa/K/JlAV5n5BfbPa1OCflfcyZz/tgYQ9NJam8BSjAladA5vxswVyKRSCQS/ye/AV9XAqHl42twAAAAAElFTkSuQmCC"/><g id="5" clip-path="url(#4)"><use xlink:href="#3" transform="scale(5.333)"/></g><clipPath id="4"><path d="M 0,0 H256 V256 H0 z"/></clipPath><filter id="0" filterUnits="objectBoundingBox" x="0" y="0" width="256" height="256"><feColorMatrix type="matrix" in="SourceGraphic" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"/></filter><mask id="2"><g filter="url(#0)"><use xlink:href="#1"/></g></mask></defs><path d="m 59.77 229.3 c 95.3 84.5 241.8 -48.75 182.6 -160.3 c -59.92 -112.7 -258.2 -82.7 -241.3 55.77 c 5 41.2 27.71 76.96 58.77 104.5" fill="#3cb270"/><use xlink:href="#5" mask="url(#2)"/><g fill="#fff"><path d="m 79 47.77 c -0.35 0.04 -0.73 0.14 -1 0.39 c 0 0 -12.14 12.17 -12.14 12.17 c -0.52 0.5 -0.58 1.29 -0.21 1.91 c 0 0 14.21 23.44 14.21 23.44 c -2.52 4.25 -4.56 8.79 -6 13.61 c 0 0 -26.1 5.44 -26.1 5.44 c -0.73 0.14 -1.25 0.83 -1.25 1.59 c 0 0 0 17.2 0 17.2 c 0 0.73 0.55 1.35 1.25 1.52 c 0 0 25.31 6.14 25.31 6.14 c 1.35 5.58 3.44 10.94 6.21 15.79 c 0 0 -14.67 22.34 -14.67 22.34 c -0.41 0.63 -0.34 1.46 0.19 2 c 0 0 12.16 12.14 12.16 12.14 c 0.5 0.52 1.29 0.58 1.92 0.21 c 0 0 22.98 -13.96 22.98 -13.96 c 4.52 2.61 9.39 4.71 14.54 6.09 c 0 0 5.33 25.77 5.33 25.77 c 0.14 0.73 0.77 1.27 1.52 1.27 c 0 0 17.2 0 17.2 0 c 0.73 0 1.36 -0.5 1.52 -1.19 c 0 0 6.34 -25.91 6.34 -25.91 c 5.31 -1.44 10.31 -3.54 14.94 -6.27 c 0 0 22.67 14.86 22.67 14.86 c 0.62 0.41 1.44 0.34 1.98 -0.19 c 0 0 12.1 -12.16 12.1 -12.16 c 0.52 -0.5 0.64 -1.29 0.27 -1.92 c 0 0 -8.25 -13.61 -8.25 -13.61 c 0 0 -3.54 0.81 -3.77 0.46 c 0 0 -5.21 -7.67 -12 -17.65 c -8.14 15.94 -24.75 26.83 -43.88 26.83 c -27.2 0 -49.2 -22 -49.2 -49.2 c 0 -20 11.96 -37.2 29.1 -44.88 c 0 0 0 -12.69 0 -12.69 c -3.11 1.11 -6.13 2.42 -8.98 3.98 c 0 -0.02 0 -0.06 0 -0.09 c 0 0 -23.2 -15.19 -23.2 -15.19 c -0.32 -0.21 -0.64 -0.23 -1 -0.21"/><path d="m 132.6 76.5 c -22.73 0 -41.1 17.88 -41.1 39.91 c 0 22 18.37 39.84 41.1 39.84 c 19.63 0 36 -13.25 40.2 -31.1 h -7.86 c -3.38 11.56 -13.86 20 -26.34 20 c -15.21 0 -27.59 -12.54 -27.59 -27.96 c 0 -15.44 12.38 -27.89 27.59 -27.89 c 11.75 0 21.73 7.44 25.67 17.94 h 8.37 c -4.27 -17.63 -20.54 -30.77 -40 -30.77"/></g></svg>
Есть ли корректный способ рекурсивного масштабирования .svg в папки вот таких размеров 64 48 32 24 22 16?


Откройте второй .svg в Inkscape - под шестерёнкой белая тень в .png
Я думаю, что rsvg-convert при изменении размера .svg (в пикселях), вместо эффекта тени, создаёт .png.

Мне нужно, пусть очень медленное, но надёжное масштабирование в пикселях, с 256рх до 48рх и ниже.
Пусть это будет даже inkscape --actions= или типа того, но автоматом.
Потому, что по одной штуке, и в ручную, это очень долго делать. Там нужно в 4 окошках размер задавать, и потом еще подгонять к рамочке...

Не смог найти в интернете рабочего варианта.

P.S. Нашёл этот скрипт, но он обрезает холст. Не масштабирует.

if [ $# -lt 3 ]; then
    >&2 echo "Usage: pad_svg.sh Sourcefolder Percentage_x Percentage_y"
    exit 1
fi


# Create a temp folder
temp_folder=$(mktemp -d -t)
echo $temp_folder

# Make an output folder if does not exist
mkdir -p ./out

# Pad by percentage
percentage_x=$2
percentage_y=$3
#----------------------------------------

# Get only files with an .svg extension in the given folder

for f in $1/*.svg; do

echo $f

# Test that the file is actually file / exists

test -f $f || continue

# Copy the file to the temp folder

cp $f $temp_folder

# Get just the filename ingoring the path

base_name=$(basename $f)

echo $base_name

# Remove the closing </svg> tag

sed -i '/<\/svg>/d' $temp_folder/$base_name

# Add a framing rectangle which we can resize canvas to

# Work out the values for x and y in the rectangle so we can centre frame horizontally and vertically

rect_x=$(bc <<< "-($percentage_x - 100)/2")
rect_y=$(bc <<< "scale=3;-($percentage_y - 100)/2")

rect_string=$(echo '<rect id="temp_frame_rect" x="'$rect_x'%" y="'$rect_y'%" width="'$percentage_x'%" height="'$percentage_y'%" stroke="green" stroke-width="0.001" fill="none"></rect>')


printf '%s\n' "$rect_string" >> $temp_folder/$base_name


# Replace the closing </svg> tag

echo '</svg>' >> $temp_folder/$base_name


output_name=$(printf '%s\n' "${base_name%.svg}_padded.svg")

echo $output_name

# Create an Inkscape action list with export to the out folder, then run Inkscape on the tempfile

actions_list="select-by-id:temp_frame_rect;object-to-path;fit-canvas-to-selection;delete;export-filename:out/${output_name};export-do"

inkscape --actions=$actions_list $temp_folder/$base_name

done

# Remove the temp_folder
trap 'rm -rf "$temp_folder"' EXIT

Поверить не могу, что в Inkscape нет команды для масштабирования картинки.

inkscape --action-list
inkscape --verb-list

1000 команд.
Или я их в упор не вижу?
« Последнее редактирование: 09 Августа 2025, 12:05:26 от ase66 »

 

Страница сгенерирована за 1.913 секунд. Запросов: 25.