Вход | Регистрация
 

Установка значения для сжатия размеров файлов jpg и png

Установка значения для сжатия размеров файлов jpg и png
Я
   falselight
 
07.07.20 - 06:23
Задача в запуске сжатия файлов изображений с диска с расширениями jpg и png, с размерами больше или равные 5мб, 5000000 байт.
Для сжатия использую программу ImageMagic-7.0.10-Q16-HDRI с файлом convert.exe.
С трудом пока понимаю какие ей нужно задавать параметры.
И основной вопрос, как устанавливать размер преобразованных файлов в 4,9 Мб ? Как его вычислять из имеющегося, у них первоначально
учитывая то что для сжатия используется инструкция, -

    СтароеИмя     = "D:\2020_07_06\ИзменениеКартинки\1.jpg";
    НовоеИмяФайла = "D:\2020_07_06\ИзменениеКартинки\2.jpg";
    ЗапуститьПриложение("""C:\Program Files\ImageMagick-7.0.10-Q16-HDRI\convert.exe"" """+СтароеИмя+""""+" -filter Lanczos -define jpeg:dct-method=float -quality 75 -gaussian-blur 0.05 "+""""+НовоеИмяФайла+"""",,истина);
   falselight
 
1 - 07.07.20 - 06:30
Есть информация по этому вопросу https://habr.com/ru/post/351014/ .
Но буду рад если кт ото поделится идеей и подскажет по вопросу.
   falselight
 
2 - 07.07.20 - 06:57
Можно ли это делать в одной строке ЗапуститьПриложение(" ?

Или нужно как в (1) использовать какие то бат файлы ?
   faramund
 
3 - 07.07.20 - 08:02
Я использовал для сжатия WIA.ImageFile.
Сжимал картинку до требуемого размера по горизонтали/вертикали.
objImageFile = Новый COMОбъект("WIA.ImageFile");
objImageProcess = Новый COMОбъект("WIA.ImageProcess");

objImageFile.LoadFile(ИмяТемпФайлаПолностью);

Размер = ?(objImageFile.Width>objImageFile.Height, objImageFile.Width, objImageFile.Height);
ЦелевойРазмерУменьшеннойКартинкиНоменклатуры = Константы.ЦелевойРазмерУменьшеннойКартинкиНоменклатуры.Получить();

Если Размер > ЦелевойРазмерУменьшеннойКартинкиНоменклатуры Тогда
    КоэффиентУменьшения = Размер / ЦелевойРазмерУменьшеннойКартинкиНоменклатуры;
    
    objImageProcess.Filters.Add(objImageProcess.FilterInfos("Scale").FilterID);
    
    objImageProcess.Filters.Item(1).Properties.Item("MaximumWidth").Value = objImageFile.Width/КоэффиентУменьшения;
    objImageProcess.Filters.Item(1).Properties.Item("MaximumHeight").Value = objImageFile.Height/КоэффиентУменьшения;
    
    objImageFile = objImageProcess.Apply(objImageFile);
    objImageFile.SaveFile(ИмяТемпФайлаПолностьюУменьшенный);
Иначе
    ДвоичныеДанные.Записать(ИмяТемпФайлаПолностьюУменьшенный);
КонецЕсли;
   falselight
 
4 - 07.07.20 - 08:03
Под данную реализацию, учитывая что обработка не будет универсальной,
обработать нужно только файлы с расширением jpg

то есть есть файлы у которых размер больше 5 мб (5000000 б ) как в строке их приводить все к размеру 4,9 мб (4900000 б ) ?
                ЗапуститьПриложение("""C:\Program Files\ImageMagick-7.0.10-Q16-HDRI\convert.exe"" """ + 
                                    СтароеИмя +
                               """"+" -filter Lanczos -define jpeg:dct-method=float -quality 75 -gaussian-blur 0.05 "+
                            """"+НовоеИмяФайла+"""",,истина);
   falselight
 
5 - 07.07.20 - 08:03
(3) качество не терялось?
   falselight
 
6 - 07.07.20 - 08:06
У меня вопрос, что задавать вот в этой строке, для уменьшения любого размера большего 5 мб, до 4,9 мб
и возможно ли такое вообще ?

    """"+" -filter Lanczos -define jpeg:dct-method=float -quality 75 -gaussian-blur 0.05 "+
   falselight
 
7 - 07.07.20 - 08:10
(3) У меня есть только размер Выборка.Размер
если Выборка.Размер = 7 568 225

то

Выборка.Размер / 4.9 = 1 544 535,714285714285714285714285714

Как вывести формулу что бы получить 4,9 ?
Или что нужно задавать в строке  

""""+" -filter Lanczos -define jpeg:dct-method=float -quality 75 -gaussian-blur 0.05 "+
   МимохожийОднако
 
8 - 07.07.20 - 08:14
(1) Там по ссылке есть батник. Его и используй
   falselight
 
9 - 07.07.20 - 08:16
(8) Не знаком с батниками (((( И как его использовать .

Пока вот Файл 7,21 Мб сжался до 1,44 мб , этой строкой

""""+" -filter Lanczos -define jpeg:dct-method=float -quality 75 -gaussian-blur 0.05 "+
   faramund
 
10 - 07.07.20 - 08:16
(5) Качество естественно теряется, т.к картинка становится меньше по линейным размерам, меньше становится и размер файла. Без потерь качества тут никак. Сжатие есть сжатие. У WIA.ImageProcess наверняка есть параметры сжатия без изменения линейных размеров, которыми можно воспользоваться. На просторах интернета поищи информацию по этой компоненте, я в свое время находил хорошую статью по этому COM объекту при работе с ним в 1С.  

(7)
целевой размер делишь на исходный - получаешь коэффициент уменьшения
   falselight
 
11 - 07.07.20 - 08:16
(9+)  качество нормальное
   falselight
 
12 - 07.07.20 - 08:18
(10) да информации полно, голова только ее не усваивает ....

Я сейчас хочу доделать вот эту строку

""""+" -filter Lanczos -define jpeg:dct-method=float -quality 75 -gaussian-blur 0.05 "+
   falselight
 
13 - 07.07.20 - 08:31
почему то такой пример ничего не делает (((

    СтароеИмя     = "C:\Файлы1с\TEST\BENG04B_1.jpeg";
    НовоеИмяФайла = "C:\Файлы1с\TEST\BENG04B_1 new.jpeg";
    ЗапуститьПриложение("""C:\Program Files\ImageMagick-7.0.10-Q16-HDRI\convert.exe"" """+СтароеИмя+""""+" -filter Lanczos -define jpeg:dct-method=float -quality 75 -gaussian-blur 0.05 "+""""+НовоеИмяФайла+"""",,истина);
   falselight
 
14 - 07.07.20 - 08:32
должно так сработать

    СтароеИмя     = "C:\Файлы1с\TEST\BENG04B_1.jpg";
    НовоеИмяФайла = "C:\Файлы1с\TEST\BENG04B_1 new.jpg";
    ЗапуститьПриложение("""C:\Program Files\ImageMagick-7.0.10-Q16-HDRI\convert.exe"" """+СтароеИмя+""""+" -filter Lanczos -define jpeg:dct-method=float -quality 75 -gaussian-blur 0.05 "+""""+НовоеИмяФайла+"""",,истина);
   falselight
 
15 - 07.07.20 - 08:36
Сработало но почему то не сразу (((

но тут вот так получилось. размер с 41,00 Мб сжался до 5,42 мб

Подскажите пожалуйста, если фото 41,00 мб, как его ещё поджать?

что менять в этой строке?

""""+" -filter Lanczos -define jpeg:dct-method=float -quality 75 -gaussian-blur 0.05 "+

Пока сам буду экспериментировать.
   falselight
 
16 - 07.07.20 - 08:42
такая строка

""""+" -filter Lanczos -define jpeg:dct-method=float -quality 70 -gaussian-blur 0.05 "

сжала картинку с 41,00 мб до 4,85 ...

то есть менять нужно параметр -quality 70
   Новый участник
 
17 - 07.07.20 - 08:59
Тебя, конечно, мало толка учить. Но всё же - напиши ручкой на бумажке точную постановку задачи. Перечитай её. Пойми её. Сравни своё решение с задачей. Ответь для себя, сделал ли ты то, что нужно?
   Йохохо
 
18 - 07.07.20 - 09:05
convert original.jpeg -define jpeg:extent=4900kb output.jpg
   falselight
 
19 - 07.07.20 - 09:28
(18) Не знаю этой тематики, что там и как нужно писать в этой командной строке. По этому гадать не могу.
Или могу на сколько получается. Ну а вся эта информация, не усваивается в голове.

(17)

Пока пишу вот такой алгоритм. Первая версия решения. Она надеюсь все равно исходное версии фото не тронет.
А новые будут с постфиксом new .

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

Пока такой прототип решения.

&НаСервере
Процедура ИзменитьРазмерНаСервере()
    МестоПоложение = "C:\Файлы1с\";
    Запрос         = Новый Запрос;
    Запрос.Текст   = "
        |ВЫБРАТЬ
        |    НоменклатураПрисоединенныеФайлы.Ссылка                     КАК Ссылка,
        |    НоменклатураПрисоединенныеФайлы.Наименование               КАК НаименованиеИзображения,
        |    НоменклатураПрисоединенныеФайлы.ВладелецФайла.Ссылка       КАК ВладелецФайлаСсылка,
        |    НоменклатураПрисоединенныеФайлы.ВладелецФайла.Наименование КАК ВладелецФайлаНаименование,
        |    НоменклатураПрисоединенныеФайлы.Размер                     КАК Размер,
        |    НоменклатураПрисоединенныеФайлы.ПутьКФайлу                 КАК ПутьКФайлу,
        |    НоменклатураПрисоединенныеФайлы.ВладелецФайла.ФайлКартинки КАК ВладелецФайлаФайлКартинки,
        |    НоменклатураПрисоединенныеФайлы.Том.ПолныйПутьWindows      КАК ТомПолныйПутьWindows,
        |    НоменклатураПрисоединенныеФайлы.Расширение                 КАК Расширение
        |ИЗ
        |    Справочник.НоменклатураПрисоединенныеФайлы                 КАК НоменклатураПрисоединенныеФайлы
        |ГДЕ
        |    НоменклатураПрисоединенныеФайлы.Размер >= 5000000
        |
        |УПОРЯДОЧИТЬ ПО
        |    ВладелецФайлаНаименование";
    Рез = Запрос.Выполнить();
    Если Не Рез.Пустой() Тогда
        Выборка = Рез.Выбрать();
        н       = 1;
        Пока Выборка.Следующий() Цикл
            СтароеИмя      = МестоПоложение + СокрЛП(Выборка.ПутьКФайлу);
            //

            НовоеИмяФайла  = МестоПоложение + ЛЕВ(Выборка.ПутьКФайлу, СтрДлина(СокрЛП(Выборка.ПутьКФайлу))-4) + "new." + ПРАВ(Выборка.ПутьКФайлу, 3);
            //

            Если Выборка.Размер >= 5000000 Тогда
                Сообщить(СТРОКА(н) +"). "+ Выборка.ВладелецФайлаНаименование +", pic: "+ Выборка.НаименованиеИзображения + " size: " + Выборка.Размер + ", " + Выборка.ПутьКФайлу);
                Если Выборка.Размер < 35000000 Тогда 
                    ЗапуститьПриложение("""C:\Program Files\ImageMagick-7.0.10-Q16-HDRI\convert.exe"" """ + 
                                        СтароеИмя +
                                        """" + " -filter Lanczos -define jpeg:dct-method=float -quality 75 -gaussian-blur 0.05 " +
                                        """" + НовоеИмяФайла+"""", , Истина);    
                Иначе
                    ЗапуститьПриложение("""C:\Program Files\ImageMagick-7.0.10-Q16-HDRI\convert.exe"" """ + 
                                        СтароеИмя +
                                        """" + " -filter Lanczos -define jpeg:dct-method=float -quality 70 -gaussian-blur 0.05 " +
                                        """" + НовоеИмяФайла+"""" , , Истина);    
                КонецЕсли;                                                
                н = н + 1;
                //

                СпрОбъект            = Выборка.Ссылка.ПолучитьОбъект();
                СпрОбъект.ПутьКФайлу = ЛЕВ(Выборка.ПутьКФайлу, СтрДлина(СокрЛП(Выборка.ПутьКФайлу))-4) + "new." + ПРАВ(Выборка.ПутьКФайлу, 3);
                СпрОбъект.Записать();
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры
   Йохохо
 
20 - 07.07.20 - 09:33
"""" + " -define jpeg:extent=4900kb "
   Йохохо
 
21 - 07.07.20 - 09:33
вместо """" + " -filter Lanczos -define jpeg:dct-method=float -quality 70 -gaussian-blur 0.05 "
   Ёпрст
 
22 - 07.07.20 - 09:33
(19) храни свои картинки не в базе, а просто на диске, имя файла сделай гуидом и всё. Тогда пофиг будкт на размер картинки.
   Йохохо
 
23 - 07.07.20 - 09:33
и Если в топку
   Новый участник
 
24 - 07.07.20 - 09:37
Может всё же в монтажники кондиционеров, а? И почёт, и уважение, и на свежем воздухе, и никакого кода. Или вот шиномонтаж... Есличо, мы с ребёнком восстановили станок и можем его в комплекте (станок, компрессор, частотникк, домкрат или rocla) дать в работу. СЗ МО. В личку :)
   sitex
 
25 - 07.07.20 - 09:42
(20) Без других параметров просто так жать jpeg,  можешь на выходе получить неведому зверушку при большом размере.
   Йохохо
 
26 - 07.07.20 - 09:44
(25) -filter Lanczos -define jpeg:extent=4900kb
так надежнее?
   sitex
 
27 - 07.07.20 - 09:44
(26) прогрессивное сжатие jpeg надо добавить и в зависимости от размера играть настройками -gaussian-blur 0.05
   sitex
 
28 - 07.07.20 - 09:46
(19) Зачем  повторяться в коде ЗапуститьПриложение(... вынеси в отдельную процедуру и передавай туда параметры в структуре.
   Йохохо
 
29 - 07.07.20 - 09:47
(27) jpeg:extent=4900kb, имхо если уж это сфейлит то только глазьями и ручками
   sitex
 
30 - 07.07.20 - 09:49
(15) Так ты что думаешь файл тебе моментально в 40мб  в 4мб сохраниться ? в cmd запусти удивишься.
 
 Рекламное место пустует
   sitex
 
31 - 07.07.20 - 09:58
я чего первоисточнику не обращаемся ?  https://imagemagick.org/script/command-line-options.php
   falselight
 
32 - 07.07.20 - 09:58
Подскажите по такому вопросу, а как мне получить размер файла? Нового????

       СтароеИмя      = МестоПоложение + СокрЛП(Выборка.ПутьКФайлу);
            //


            НовоеИмяФайла  = МестоПоложение + ЛЕВ(Выборка.ПутьКФайлу, СтрДлина(СокрЛП(Выборка.ПутьКФайлу))-4) + "new." + ПРАВ(Выборка.ПутьКФайлу, 3);


Размер НовоеИмяФайла ?
   Йохохо
 
33 - 07.07.20 - 09:59
(32) -define jpeg:extent=4900kb
!!!!11
   falselight
 
34 - 07.07.20 - 10:00
(32+) А то его потом вот тут нужно обновить:

                //

                СпрОбъект            = Выборка.Ссылка.ПолучитьОбъект();
                СпрОбъект.ПутьКФайлу = ЛЕВ(Выборка.ПутьКФайлу, СтрДлина(СокрЛП(Выборка.ПутьКФайлу))-4) + "new." + ПРАВ(Выборка.ПутьКФайлу, 3);
                СпрОбъект.Записать();
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры
   Йохохо
 
35 - 07.07.20 - 10:00
афк в тарелку)
   falselight
 
36 - 07.07.20 - 10:00
(33) Это если делать как вы сказали. Я пока такого не пробовал. делаю как в (19) .
   falselight
 
37 - 07.07.20 - 10:13
тестировать буду так 

&НаСервере
Процедура ИзменитьРазмерНаСервере()
    МестоПоложение = "C:\Файлы1с\";
    Запрос         = Новый Запрос;
    Запрос.Текст   = "
        |ВЫБРАТЬ
        |    НоменклатураПрисоединенныеФайлы.Ссылка                     КАК Ссылка,
        |    НоменклатураПрисоединенныеФайлы.Наименование               КАК НаименованиеИзображения,
        |    НоменклатураПрисоединенныеФайлы.ВладелецФайла.Ссылка       КАК ВладелецФайлаСсылка,
        |    НоменклатураПрисоединенныеФайлы.ВладелецФайла.Наименование КАК ВладелецФайлаНаименование,
        |    НоменклатураПрисоединенныеФайлы.Размер                     КАК Размер,
        |    НоменклатураПрисоединенныеФайлы.ПутьКФайлу                 КАК ПутьКФайлу,
        |    НоменклатураПрисоединенныеФайлы.ВладелецФайла.ФайлКартинки КАК ВладелецФайлаФайлКартинки,
        |    НоменклатураПрисоединенныеФайлы.Том.ПолныйПутьWindows      КАК ТомПолныйПутьWindows,
        |    НоменклатураПрисоединенныеФайлы.Расширение                 КАК Расширение
        |ИЗ
        |    Справочник.НоменклатураПрисоединенныеФайлы                 КАК НоменклатураПрисоединенныеФайлы
        |ГДЕ
        |    НоменклатураПрисоединенныеФайлы.Размер >= 5000000
        |
        |УПОРЯДОЧИТЬ ПО
        |    ВладелецФайлаНаименование";
    Рез = Запрос.Выполнить();
    Если Не Рез.Пустой() Тогда
        Выборка = Рез.Выбрать();
        н       = 1;
        Пока Выборка.Следующий() Цикл
            СтароеИмя      = МестоПоложение + СокрЛП(Выборка.ПутьКФайлу);
            //

            НовоеИмяФайла  = МестоПоложение + ЛЕВ(Выборка.ПутьКФайлу, СтрДлина(СокрЛП(Выборка.ПутьКФайлу))-4) + "new." + ПРАВ(Выборка.ПутьКФайлу, 3);
            //

            Если Выборка.Размер >= 5000000 Тогда
                Сообщить(СТРОКА(н) +"). "+ Выборка.ВладелецФайлаНаименование +", pic: "+ Выборка.НаименованиеИзображения + " size: " + Выборка.Размер + ", " + Выборка.ПутьКФайлу);
                Если Выборка.Размер < 35000000 Тогда 
                    ЗапуститьПриложение("""C:\Program Files\ImageMagick-7.0.10-Q16-HDRI\convert.exe"" """ + 
                                        СтароеИмя +
                                        """" + " -filter Lanczos -define jpeg:dct-method=float -quality 75 -gaussian-blur 0.05 " +
                                        """" + НовоеИмяФайла+"""", , Истина);    
                Иначе
                    ЗапуститьПриложение("""C:\Program Files\ImageMagick-7.0.10-Q16-HDRI\convert.exe"" """ + 
                                        СтароеИмя +
                                        """" + " -filter Lanczos -define jpeg:dct-method=float -quality 70 -gaussian-blur 0.05 " +
                                        """" + НовоеИмяФайла+"""" , , Истина);    
                КонецЕсли;                                                
                н = н + 1;
                //

                НовыйСозданныйФайл =Новый Файл(МестоПоложение + ЛЕВ(Выборка.ПутьКФайлу, СтрДлина(СокрЛП(Выборка.ПутьКФайлу))-4) + "new." + ПРАВ(Выборка.ПутьКФайлу, 3));
                //

                СпрОбъект            = Выборка.Ссылка.ПолучитьОбъект();
                СпрОбъект.ПутьКФайлу = ЛЕВ(Выборка.ПутьКФайлу, СтрДлина(СокрЛП(Выборка.ПутьКФайлу))-4) + "new." + ПРАВ(Выборка.ПутьКФайлу, 3);
                СпрОбъект.Размер     = НовыйСозданныйФайл.Размер();
                СпрОбъект.Записать();
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры
   Сияющий в темноте
 
38 - 07.07.20 - 10:13
ну в чем проблема,пишем сценарий конвертации,в конце сценария созданм файл финиша,а в 1с подписываемся на мониторинг создания этого файла.
далее,ввгпужаем файлы для обработки в директорию,пинаем суенарий и ждем,когда он сыиниширует.
   Йохохо
 
39 - 07.07.20 - 10:14
(38) рекурсию еще, надо 4.9мб)
   falselight
 
40 - 07.07.20 - 10:16
Код выполняется, но почему то файл в каталоге не появляется !!!! Новый
Хотя по коду отрабатывает, даже появляется его новый размер !
   Новый участник
 
41 - 07.07.20 - 11:24
Повторю предложение о работе шиномонтажником. Там всего 4 педали, 3 кнопки и регулятор.


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.