LINUX.ORG.RU

svgcleaner 0.7.0

 ,


1

4

Вышла новая версия программы для очистки SVG-файлов от лишней информации.

svgcleaner позиционируется как оптимизатор без потерь, строго следующий спецификации SVG 1.1 Full.

Основные изменения:

  • ядро (консольная версия) переписано с C++ на Rust;
  • реализованы собственные библиотеки для разбора SVG и представления SVG в виде DOM;
  • программа стала работать приблизительно в 3 раза быстрее;
  • все функции очистки теперь работают в режиме lossless;
  • степень очистки упала примерно на 5% ради стабильности и корректности;
  • добавлена документация для каждой опции очистки;
  • графический интерфейс переписан с нуля и вынесен в отдельный репозиторий.

Программа распространяется под лицензией GNU GPL v2. Сопутствующие библиотеки — под MPL v2.

Готовые сборки

>>> Подробности

★★★★★

Проверено: Shaman007 ()

О, это хорошая вещь, а то я руками обычно пробегаю.
Было бы класcно еще увидеть фичу конвертации в base64 с:
1) полным удалением пробелов/табов/переносов
2) удаление первичного захголовка <?xml version="1.0" encoding="UTF-8">
3) удаление тайтлов/копирайтов/комментариев и пустующих секций типа <defs></defs>
4) сокращением кода цветов (#a5ea5e => #a5e, #999999 => #999)
5) умным округлением некоторых значений фильтров <feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.419231205 0" in="shadowInnerInner1" type="matrix" result="shadowMatrixInner1"></feColorMatrix> => <feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.42 0" in="shadowInnerInner1" type="matrix" result="shadowMatrixInner1"></feColorMatrix>

Хотя 3й и 4й может и так есть

uin ★★ ()
Ответ на: комментарий от uin

1) И так есть.

2) И так есть.

3) И так есть.

4) И так есть.

5) feColorMatrix еще не реализован. Как и большинство фильтров.

конвертации в base64

Конвертацию чего?

#a5ea5e => #a5e

Разе это валидный вариант?

RazrFalcon ★★★★★ ()
Последнее исправление: RazrFalcon (всего исправлений: 2)
Ответ на: комментарий от RazrFalcon

1-5) И так есть.

Для исходной картинки в svg это нафиг не нужно же (кроме 3-го и 4-го)
Это нужно при переводе в base64

Конвертацию чего?

Как «чего» исходного текста svg же

uin ★★ ()
Ответ на: комментарий от RazrFalcon

Разе это валидный вариант?

Конечно, при сокращении кода до двенадцати бит (#44e например) он остальные двенадцать просто заполняет теми же цифрами.

Помоему даже x264 при сжатии к таким приемам прибегает - превращает некоторые цвета в аналогичные со слегка другим оттенком но симметричные по значениям и укорачивает.

uin ★★ ()
Ответ на: комментарий от uin

это нафиг не нужно же

Кому как.

исходного текста svg же

Что мешает использовать одну из 100500 программ для перевода текста в base64?

превращает некоторые цвета в аналогичные

Это не lossless. Моя программа lossless.

RazrFalcon ★★★★★ ()
Ответ на: комментарий от uin

Конечно, при сокращении кода до двенадцати бит (#44e например) он остальные двенадцать просто заполняет теми же цифрами.

Да. Но #a5e превращается в #aa55ee, а не в #a5ea5e, потому что #RRGGBB, а не #RGBRGB

Psych218 ★★★★★ ()

Полезная штука, спасибо автору.

Psych218 ★★★★★ ()
Ответ на: комментарий от RazrFalcon

Кому как.

Нет, ну как сказать, в исходных текстах своих картинок то же иногда хотелось бы чем то оптимизующим пройти, но только что бы отступы, строка с кодировкой и тайтлами - всё сохранилось, что бы это исходный код был, понимаешь?

А так то ты вообще прав, svg ведь создавался не затем что бы его в блоб трансформировать и в css или куда то там толкать.б а что бы прямо так на страницу добавлять и точно так же иметь возможность динамически задавать стили через css и прочее.

Что мешает использовать одну из 100500 программ для перевода текста в base64?

Ну как зачем, что бы в программе было все максимально удобно для тех кто этим пользуется. Предоставить пользователю возможность выбрать в каком виде ему нежен выход - исходным текстом, base64 (сразу с заголовком data:image/svg+xml;base64,xxXXXxX++), или строкой с правильным экранированием.

А то ну вот я пользуюсь openssl (по тому что он из коробки есть)
А он в таком вот формате выдает:

AAAAAwAAAAlpbWFnZS9wbmcAAAAqU2V0IGZ
XRzb25nYmlyZC5jb20pAAAAAAAAAAAAAAAA
9eP8x6OP1o/WPs46InCk8qnqo/rf3V+Ndmq
b307KDXYM+ziGePhrhD/+V+a9PwwXPqc8rR
rRG6ketR8+M+YzderH0xfDLjJfT44W/Kf62
95XRq59+d/u9Z2LJxPBr0euZP0reqL45+tb
2bedk6OTTd2nvpqeK3qu+P/aB/aH7Y/THke
nsT/hPlZ+NP3d8CfzyeCZtZubf94Tz+zI6W
X4AAAHVaVRYdFhNTDpjb20uYWRvYmUueG1w

(то есть еще и столбиками)
Приходится постоянно еще и в нужный вид доприводить, а хочется как то чтоб все было удобно.

Это не lossless. Моя программа lossless.

Ну это просто например сказано было, твоей программы это конечно не касается. В общем #ABCABC до #abc сокращать можно точно так же как #000.

uin ★★ ()
Ответ на: комментарий от uin

Ну как зачем, что бы в программе было все максимально удобно для тех кто этим пользуется.

Программа выполняет ровно одну задачу - чистит svg файл. Ни больше, ни меньше. Всё остальное легко делается сторонними инструментами.

RazrFalcon ★★★★★ ()

А визуальное сравнение до/после зачем из гуя убрал?

AP ★★★★★ ()

Скачал готовую сборку под линупс.

The '7za' executable is not found.

It should be in the application folder.

А он есть в папке, между тем.

AP ★★★★★ ()

ядро (консольная версия) переписано с C++ на Rust;

программа стала в 3 раза быстрее;

совпадение?

reprimand ★★★★★ ()
Ответ на: комментарий от AP

А он есть в папке, между тем.

заюзай strace, будь мужиком!

reprimand ★★★★★ ()
Ответ на: комментарий от uin

В общем #ABCABC до #abc сокращать можно точно так же как #000.

А ведь 2 звезды набрал как-то.

anonymous ()
Ответ на: комментарий от AP

А он есть в папке, между тем.

Ну так вызов без нахождения в PATH то не прокатит :D

fornlr ★★★★★ ()

Ядро (консольная версия) переписано с C++ на Rust.

Неужели цепепе стал не таким привлекательным? :-)

anonymous ()

На Mint18 x64 (Cinnamon) выдаёт.

$ ./svgcleaner-gui
This application failed to start because it could not find or load the Qt platform plugin "xcb"
in "".

Available platform plugins are: xcb.

Reinstalling the application may fix this problem.


В чём косяк, я понимаю, конечно, но, хотелось бы, чтобы на вроде не старом дистрибутиве оно изначально работало.

SkyMaverick ()

Лучше бы htmlcleaner

vada ★★★★★ ()
Ответ на: комментарий от SkyMaverick

Странно. На убунте 14.04 и выше и стабильной генте должно работать. Видимо несовместимость версий либ иксов. Тут ничего не поделать: или сорцы или ждать пока соберут мейнтейнеры. Дистрибуция бинарей под линем - боль.

Покажите:

ldd ./lib/plugins/platforms/libqxcb.so

RazrFalcon ★★★★★ ()

Думаю изучить Rust. Пока почитал доки, даже хелловорлды не писал, решил глянуть код какого-нибудь готового проекта. И тут как раз этот попался. Больно не пинать, если вопрос глупый.

Вот эта функция:

pub fn parse_data(data: &[u8], opt: &ParseOptions) -> Result<Document, Error> {
    match Document::from_data_with_opt(data, opt) {
        Ok(d) => Ok(d),
        Err(e) => Err(e),
    }
}

Чем отличается от:

pub fn parse_data(data: &[u8], opt: &ParseOptions) -> Result<Document, Error> {
    Document::from_data_with_opt(data, opt)
}

Ведь мы что матчим, то и возвращаем. Или нет? Для чего здесь нужен match?

Psych218 ★★★★★ ()
Последнее исправление: Psych218 (всего исправлений: 1)

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

Deleted ()
Ответ на: комментарий от RazrFalcon

Я его никогда и не любил.

А Rust, как, полюбил? :-)

anonymous ()
Ответ на: комментарий от Psych218

Лучше дождаться автора, но похоже что это для вставки дополнительного кода в какую-то ветку. На будущее задел.

anonymous ()
Ответ на: комментарий от Psych218

Забавно. Походу там что-то еще было. Но в итоге осталось только это. Уберу. Спасибо.

RazrFalcon ★★★★★ ()
Ответ на: комментарий от RazrFalcon

Кстати, а конечному пользователю точно нужна статистика по скорости обработки?

AP ★★★★★ ()
Ответ на: комментарий от AP

Конечному - вряд ли. Но мне нравится =) По сравнению со старой версией я и так убрал большую часть инфы.

Это, своего рода, анитиреклама svgo, который чистит в 100 раз медленнее.

Я открыт к любым замечаниям.

RazrFalcon ★★★★★ ()
Ответ на: комментарий от RazrFalcon

Дистрибуция бинарей под линем - боль.

Это потому что кто-то уже пытается оторвать тебе руки. И правильно делает.

fenris ★★★★★ ()
Ответ на: комментарий от fenris

Это потому что кто-то уже пытается оторвать тебе руки. И правильно делает.

Все прямо очень хотят ручками компилять бэкенд на расте, а потом ещё собирать к нему «морду» на кьюте. Прямо бросили все дела — и давай компилятором размахивать.

AP ★★★★★ ()
Ответ на: комментарий от RazrFalcon

Ну и напрасно.

Давай теперь из gimp уберем экспорт в другие графические форматы. Есть же imagemagik со своим convert, вот и конвертите им.

Тем более, что программа, которая включает в себя некие знания, которые можно просто использовать, например, знание формата заголовка для base64, это гораздо лучше, чем две отдельные программы плюс требования к мозгу пользователя.

И кстати, было бы неплохо иметь возможность не только удалять, но и добавлять «лишние» поля. Например, автора и копирайт. Чтобы обработал графику для сайта и сразу везде все проставил...

AVL2 ★★★★★ ()
Ответ на: комментарий от AVL2

Давай теперь из gimp уберем экспорт в другие графические форматы. Есть же imagemagik со своим convert, вот и конвертите им.

Сравнение некорректно.

1. XCF — сугубо проектный формат. SVG — и проектный, и финальный одновременно.
2. SVGCleaner не создаёт файлы с нуля, он их только обрабатывает.

AP ★★★★★ ()
Последнее исправление: AP (всего исправлений: 1)
Ответ на: комментарий от AVL2

Увы. Но наши представления о данной программе расходятся. Это не программа для пакетной обработки SVG, это программа для пакетной очистки SVG. У неё ровно одна задача - очистка SVG. Она не занимается конвертацией форматов, тем более, она не добавляется новую информацию в файл. Зачем? Зачем программе, которая чистит SVG, добавлять в него новые данные?

Unix же.

RazrFalcon ★★★★★ ()

переписано с C++ на Rust

С языка на котором проблемы с памятью на язык в котором нет объектов? Годно!

anonymous ()

Почему гуи на qt а не на gtk?

anonymous ()
Ответ на: комментарий от RazrFalcon

Там пакета libxcb-xinerama0 в базовой поставке нет. Поставил - поехало, но тоже самое что и у AP.

The '7za' executable is not found.
It should be in the application folder.

Даже после chmod -R 0777 *

SkyMaverick ()

О круто, на вид вменяемая либа разбора-генерации svg. Нехватает только рендерера результа на канву для полного счастья. А да, вычищать тонны бреда, которые вставляет в файл тот же инскейп или конвертор какой-то иной проги просто так и на каждый графический чих оно умеет? И уменьшать точность действительных чисел, чтоб не спамили 6 разрядов после запятой?

q0tw4 ★★★ ()
Ответ на: комментарий от q0tw4

вычищать тонны бреда, которые вставляет в файл тот же инскейп

Можно выбрав при сохранении optimized вариант.

anonymous ()
Ответ на: комментарий от AP

Саш, обычный случай для гимпа, это взять, например, скан в тифе, подчистить грязь и сохранить в джепег, чтобы отправить по почте.

Или взять жирный пнг, перевести в индексные цвета и сохранить в гиф для выкладки в веб.

Естественно, можно все делать в один формат и конвейером гнать дальше на конвертацию в нужный, но создатели гимпа подумали и сделали удобный инструмент.

Ровно для того же в моем понимании и существует эта утилита. В svg много невидимого и ненужного, что важно удалить перед выкладкой в инет. Иначе эта чистка и не нужна вовсе. Можно подумать, эти килобайты на диске кого-то волнуют.

Почему не сделать удобно для стандартных случаев, раз уж пишете и развиваете, не знаю.

Но в любом случае, хозяин-барин...

AVL2 ★★★★★ ()
Ответ на: комментарий от SkyMaverick

Попробуйте:

./7za -h
Что пишет?

7za статически собран. С зависимостями проблем быть не должно.

Даже после chmod -R 0777 *

chmod +x 7za

Должно быть достаточно.

RazrFalcon ★★★★★ ()
Ответ на: комментарий от q0tw4

Нехватает только рендерера результа на канву для полного счастья.

Если вы про рендер svg, типа QtSvg, то это в планах есть. Но там месяцы, если не годы, работы.

А да, вычищать тонны бреда, которые вставляет в файл тот же инскейп или конвертор какой-то иной проги просто так и на каждый графический чих оно умеет?

Как бы это и есть его основная задача.

И уменьшать точность действительных чисел, чтоб не спамили 6 разрядов после запятой?

Нет, ибо lossless. Подробности тут.

RazrFalcon ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.