Сжатие картинок (как пример, формата JPG) в 1С:8.3.14 (и более поздних версиях).

1. MissionOnly 15.03.21 13:45 Сейчас в теме
Проблема сжатия картинок все чаще стала возникать из-за развития цифровых камер. JPG картинки получаются размером от 2 до 8 Мб (и более). А базы, в которых картинки хранятся, остаются не резиновыми. Начиная с версии 1С:8.3.14 появился новый функционал, который позволяет решить данную проблему, не прибегая к использованию внешних компонент. Вашему вниманию предлагаю функцию, которая ужимает картинку до нужного размера в байтах (картинка будет размером не больше указанного).

Функция ПолучитьУжатуюКартинку(Крт,УжатьДо) Экспорт
	Отступ = 0.9;
	Крт_ = Крт;
	Пока Крт_.РазмерФайла()>УжатьДо Цикл
	    УжатьДо90 = Окр(УжатьДо*Отступ,0);
	    КртШирина = Крт.Ширина();
	    КртВысота = Крт.Высота();
	    РзмКрт = Крт.РазмерФайла();
	    Кф = УжатьДо/РзмКрт;
	    Кф1 = Log(1.5+Кф*Кф*1.25);
	    Кф0 = Кф1/4;
	    Кф2 = 3*(1+Кф1)/4;
	    Кф = Кф1;
	    НоваяШирина = Окр(КртШирина*Кф,0);
	    НоваяВысота = Окр(КртВысота*Кф,0);
	    ОбрКрт = Новый ОбрабатываемаяКартинка(Крт, Истина);
	    ОбрКрт.УстановитьРазмер(НоваяШирина,НоваяВысота);
	    Крт_ = ОбрКрт.ПолучитьКартинку();
	    Пока ((Крт_.РазмерФайла()>УжатьДо) ИЛИ (Крт_.РазмерФайла()<=УжатьДо90)) И (Кф2-Кф0>0.025) Цикл
	        Если Крт_.РазмерФайла()>УжатьДо Тогда
	            Кф2 = Кф1;
	            Кф = (Кф1+Кф0)/2;
	            Кф1 = Кф;
	            ОбрКрт = Новый ОбрабатываемаяКартинка(Крт, Истина);
	            НоваяШирина = Окр(КртШирина*Кф,0);
	            НоваяВысота = Окр(КртВысота*Кф,0);
	            ОбрКрт.УстановитьРазмер(НоваяШирина,НоваяВысота);
	            Крт_ = ОбрКрт.ПолучитьКартинку();
	        Иначе
	            Кф0 = Кф1;
	            Кф = (Кф2+Кф1)/2;
	            Кф1 = Кф;
	            ОбрКрт = Новый ОбрабатываемаяКартинка(Крт, Истина);
	            НоваяШирина = Окр(КртШирина*Кф,0);
	            НоваяВысота = Окр(КртВысота*Кф,0);
	            ОбрКрт.УстановитьРазмер(НоваяШирина,НоваяВысота);
	            Крт_ = ОбрКрт.ПолучитьКартинку();
	        КонецЕсли;
		КонецЦикла;
		Отступ = Отступ-0.1;
		Если Отступ<0.6 Тогда
			Прервать;
		КонецЕсли;
	КонецЦикла;
    Возврат Крт_;
КонецФункции
Показать


Прикрепил: Исходную картинку и ужатую данной функцией (исходная картинка сжата в 15 раз).
Прикрепленные файлы:
cleaner_it; lenna1c; Sergeevich; matashin; RWS88; STELEICE; veselon; SergeyRomanov; XSATANA; vit00lya; DrAku1a; Maito; Поручик; +13 Ответить
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. пользователь 15.03.21 13:50
Сообщение было скрыто модератором.
...
3. VladimirB 16 15.03.21 16:49 Сейчас в теме
А еще, если картинок много, то вообще их в базе не хранить. А создать реквизит ссылку на нее. И создать отдельный каталог для картинок.
4. MissionOnly 15.03.21 16:58 Сейчас в теме
(3) На сайт для продажи загружать требуется регулярно (сотнями).
6. FatPanzer 15.03.21 17:09 Сейчас в теме
(4) И в каком месте предложение Владимира противоречит загрузке на сайт "сотен картинок"?
7. MissionOnly 15.03.21 17:24 Сейчас в теме
(6) Любое хранилище картинок можно считать базой картинок. Предложение VladimirB - в базе не хранить. Ваше, похоже, как продолжение. Отвечаю - можно вообще не хранить картинки (и совсем не создавать).
8. FatPanzer 15.03.21 17:27 Сейчас в теме
(7) Понял, ответа нет. Просто лишь бы че сказать.
9. vv2 16.03.21 07:21 Сейчас в теме
(7) Так они дело говорят. Хранить сами картинки надо в файловой системе, а в базе данных только ссылки на них.
10. FatPanzer 16.03.21 07:48 Сейчас в теме
(9) У автора логика другая! Нельзя хранить большие картинки в файловой системе - потому что их надо сотнями передавать на сайт! А вот маленькие говнопревьюхи (по недоразумению называемые картинками) - надо хранить именно в базе, перед этим пройдясь по ней некоей функцией в которой 5 или шесть кусков одинакового кода со вложенной проверкой условий и вложенных циклов (что такое рекурсия автор явно не в курсе)...
11. MissionOnly 16.03.21 10:14 Сейчас в теме
(9) Так где написано, что предлагается хранить картинки в 1С Базе? Может у вас текст не так отображается, чем у меня?
12. FatPanzer 16.03.21 10:17 Сейчас в теме
(11) Вот
А базы, в которых картинки хранятся, остаются не резиновыми.
13. MissionOnly 16.03.21 10:22 Сейчас в теме
(12) И что, где 1С. пожалуй вы тут додумаете за меня и докторскую по этому поводу защитите.
14. vv2 16.03.21 10:40 Сейчас в теме
(13) Традиционно, файловая система не считается базой данных. Традиционно, сжатие картинок подразумевает изменение степени сжатия (качества) картинок. Традиционно, действия из вашего когда именуются изменением размеров или созданием превью.

И, из-за вашего нетрадиционного применения слов, весь поток вашего текста воспринимается как предложение хранить картинки в базе данных, не важно какой - 1с или другая.
15. MissionOnly 16.03.21 11:02 Сейчас в теме
(14) У меня картинки хранятся в отдельной SQL базе с быстрым поиском по идентификатору. Эту тему я создал не для этого вопроса. Очень прошу создать отдельную тему "Хранение картинок при решении бизнес задач" и соответственно высказываться там (по возможным решениям). С удовольствием почитаю, предложенные решения.
17. vv2 16.03.21 11:57 Сейчас в теме
(15) А тогда эта, уже существующая, тема не получиться из разряда "как плохо решить проблему, исскуствено созданную плохим проектированием" ?
16. spacecraft 16.03.21 11:19 Сейчас в теме
(11) (13) скорее всего текст вы не читаете, только пишите.
(11)
Так где написано, что предлагается хранить картинки в 1С Базе?

(13)
И что, где 1С.

Задайте себе свои же вопросы:
Где в (9) или (10) упоминается 1С?
5. SlavaKron 15.03.21 17:00 Сейчас в теме
Только это не сжатие, а изменение размера изображения – качество JPEG (степень сжатия) у вас не меняется.
18. Vasilius_Infernius 21.07.21 15:59 Сейчас в теме
Можете прокомментировать строчку:
Кф1 = Log(1.5+Кф*Кф*1.25);
, а то, похоже, я эту лекцию в университете прогулял.
19. morskoj 22.06.22 13:20 Сейчас в теме
Спасибо Автору, но у меня ругается на "Новый ОбрабатываемаяКартинка" - Тип не определен... Это что за объект? (я сам не могу понять просто)
Аа, у меня 8.3.13..
20. matashin 03.08.23 07:49 Сейчас в теме
Эх, если бы эта функция еще умела степень сжатия менять.
21. matashin 04.08.23 14:59 Сейчас в теме
Попробовал ее применить у себя, вполне себе рабочий вариант, спасибо автору.
22. Stipank 29.03.24 05:39 Сейчас в теме
Поясните, какой тип данных надо передавать в функцию?
23. laperuz 46 29.03.24 05:49 Сейчас в теме
(22)
Картинка.

Если в синтакс-помощнике поискать метод РазмерФайла(), который у Крт вызывается в коде, выйдет только 1 использование - у типа Картинка.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот