Имя: Пароль:
1C
 
Установка значения для сжатия размеров файлов jpg и png
,
0 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 "+""""+НовоеИмяФайла+"""",,истина);
1 falselight
 
07.07.20
06:30
Есть информация по этому вопросу https://habr.com/ru/post/351014/ .
Но буду рад если кт ото поделится идеей и подскажет по вопросу.
2 falselight
 
07.07.20
06:57
Можно ли это делать в одной строке ЗапуститьПриложение(" ?

Или нужно как в (1) использовать какие то бат файлы ?
3 faramund
 
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(ИмяТемпФайлаПолностьюУменьшенный);
Иначе
    ДвоичныеДанные.Записать(ИмяТемпФайлаПолностьюУменьшенный);
КонецЕсли;
4 falselight
 
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 "+
                            """"+НовоеИмяФайла+"""",,истина);
5 falselight
 
07.07.20
08:03
(3) качество не терялось?
6 falselight
 
07.07.20
08:06
У меня вопрос, что задавать вот в этой строке, для уменьшения любого размера большего 5 мб, до 4,9 мб
и возможно ли такое вообще ?

    """"+" -filter Lanczos -define jpeg:dct-method=float -quality 75 -gaussian-blur 0.05 "+
7 falselight
 
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) Там по ссылке есть батник. Его и используй
9 falselight
 
07.07.20
08:16
(8) Не знаком с батниками (((( И как его использовать .

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

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

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

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

""""+" -filter Lanczos -define jpeg:dct-method=float -quality 75 -gaussian-blur 0.05 "+
13 falselight
 
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 "+""""+НовоеИмяФайла+"""",,истина);
14 falselight
 
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 "+""""+НовоеИмяФайла+"""",,истина);
15 falselight
 
07.07.20
08:36
Сработало но почему то не сразу (((

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

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

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

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

Пока сам буду экспериментировать.
16 falselight
 
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
19 falselight
 
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) дать в работу. СЗ МО. В личку :)
25 sitex
 
naïve
07.07.20
09:42
(20) Без других параметров просто так жать jpeg,  можешь на выходе получить неведому зверушку при большом размере.
26 Йохохо
 
07.07.20
09:44
(25) -filter Lanczos -define jpeg:extent=4900kb
так надежнее?
27 sitex
 
naïve
07.07.20
09:44
(26) прогрессивное сжатие jpeg надо добавить и в зависимости от размера играть настройками -gaussian-blur 0.05
28 sitex
 
naïve
07.07.20
09:46
(19) Зачем  повторяться в коде ЗапуститьПриложение(... вынеси в отдельную процедуру и передавай туда параметры в структуре.
29 Йохохо
 
07.07.20
09:47
(27) jpeg:extent=4900kb, имхо если уж это сфейлит то только глазьями и ручками
30 sitex
 
naïve
07.07.20
09:49
(15) Так ты что думаешь файл тебе моментально в 40мб  в 4мб сохраниться ? в cmd запусти удивишься.
31 sitex
 
naïve
07.07.20
09:58
я чего первоисточнику не обращаемся ?  https://imagemagick.org/script/command-line-options.php
32 falselight
 
07.07.20
09:58
Подскажите по такому вопросу, а как мне получить размер файла? Нового????

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

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


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

                //
                СпрОбъект            = Выборка.Ссылка.ПолучитьОбъект();
                СпрОбъект.ПутьКФайлу = ЛЕВ(Выборка.ПутьКФайлу, СтрДлина(СокрЛП(Выборка.ПутьКФайлу))-4) + "new." + ПРАВ(Выборка.ПутьКФайлу, 3);
                СпрОбъект.Записать();
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры
35 Йохохо
 
07.07.20
10:00
афк в тарелку)
36 falselight
 
07.07.20
10:00
(33) Это если делать как вы сказали. Я пока такого не пробовал. делаю как в (19) .
37 falselight
 
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мб)
40 falselight
 
07.07.20
10:16
Код выполняется, но почему то файл в каталоге не появляется !!!! Новый
Хотя по коду отрабатывает, даже появляется его новый размер !
41 Новый участник
 
07.07.20
11:24
Повторю предложение о работе шиномонтажником. Там всего 4 педали, 3 кнопки и регулятор.