Сжатие картинок (как пример, формата JPG) в 1С:8.3.14 (и более поздних версиях).
Проблема сжатия картинок все чаще стала возникать из-за развития цифровых камер. JPG картинки получаются размером от 2 до 8 Мб (и более). А базы, в которых картинки хранятся, остаются не резиновыми. Начиная с версии 1С:8.3.14 появился новый функционал, который позволяет решить данную проблему, не прибегая к использованию внешних компонент. Вашему вниманию предлагаю функцию, которая ужимает картинку до нужного размера в байтах (картинка будет размером не больше указанного).
Прикрепил: Исходную картинку и ужатую данной функцией (исходная картинка сжата в 15 раз).
Функция ПолучитьУжатуюКартинку(Крт,УжатьДо) Экспорт
Отступ = 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 раз).
Прикрепленные файлы:
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(9) У автора логика другая! Нельзя хранить большие картинки в файловой системе - потому что их надо сотнями передавать на сайт! А вот маленькие говнопревьюхи (по недоразумению называемые картинками) - надо хранить именно в базе, перед этим пройдясь по ней некоей функцией в которой 5 или шесть кусков одинакового кода со вложенной проверкой условий и вложенных циклов (что такое рекурсия автор явно не в курсе)...
(13) Традиционно, файловая система не считается базой данных. Традиционно, сжатие картинок подразумевает изменение степени сжатия (качества) картинок. Традиционно, действия из вашего когда именуются изменением размеров или созданием превью.
И, из-за вашего нетрадиционного применения слов, весь поток вашего текста воспринимается как предложение хранить картинки в базе данных, не важно какой - 1с или другая.
И, из-за вашего нетрадиционного применения слов, весь поток вашего текста воспринимается как предложение хранить картинки в базе данных, не важно какой - 1с или другая.
(14) У меня картинки хранятся в отдельной SQL базе с быстрым поиском по идентификатору. Эту тему я создал не для этого вопроса. Очень прошу создать отдельную тему "Хранение картинок при решении бизнес задач" и соответственно высказываться там (по возможным решениям). С удовольствием почитаю, предложенные решения.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот