Версия для печати темы (https://pro1c.org.ua/index.php?s=717284dbc80fbe27ece9af4047dd3b17&showtopic=21210)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование обычных форм 1С 8.2 и не интерфейсной логики _ Сжатие картинок

Автор: Bernet 16.12.14, 10:19

Добрый день. Есть база 1С (УПП) и мобильное приложение Агент+, необходимо выгружать картинки из базы 1С на Агент+, выгрузку сделал, но файл с выгрузкой получается примерно 30 Мб, что есть не очень удобно, учитывая что 29 Мб из них весят картинки. Возник вопрос: можно ли как-то при выгрузке картинок изменять их размер. Большинство картинок весят немного (примерно 30 Кб) но есть и побольше (до 1 Мб) - вот их и хочу уменьшить при выгрузке. Готовые обработки по ресайзу картинок приветствуются smile.gif

Автор: Vofka 16.12.14, 11:03

Конкретно по теме не подскажу (как сжать картинку средствами 1С). Но может имеет смысл подумать над тем, чтобы уменьшить размер исходной картинки: сжать какой-то программой, конвертировать в какой-то другой формат и т.п.

Автор: Bernet 16.12.14, 11:22

Да, такой вариант тоже рассматриваю, просто хотелось бы 1 раз сделать и забыть, ведь пользователь не будет заморачиваться такой ерундой - он загрузит картинку и все. А я как существо ленивое не хочу постоянно следить за размером выгружаемого архива wink.gif Думал может можно при выгрузке определять размер файла и если он, например, больше 100 Кб - пропорционально уменьшать размеры картинки.

Автор: python 16.12.14, 11:49

Это каждый раз при выгрузке проверять размер картинки и пережимать ее? И делать это, скорее всего, сторонней прогой.
Может, имеет смысл хранить копию картинки для мобильного приложения?

Автор: Bernet 16.12.14, 12:20

Картинки добавляют обычные пользователи - как я писал выше, они проверять размер не будут, поэтому хранить копии не вижу смысла поскольку пользователь все равно добавит здоровенную картинку, которую нужно уменьшить, что возвращает меня к изначальному вопросу - "Как можно уменьшить картинку программно?". Ну и плюс база так разрастется (номенклатуры много - примерно 5000) - все таки граф. информация жрет конкретно.

Автор: Vofka 16.12.14, 12:23

Ещё один "не прямой" путь: ограничить размер картинки на уровне 1С, т.е. в момент загрузки в картинки в 1С проверять, чтоб картинка не превышала определенный размер.

Автор: python 16.12.14, 14:09

Bernet, я и не предлагал пользователей заставлять сохранять две копии (хотя тоже имеет право на жизнь такой подход).
При добавлении картинки добавить дополнительный обработчик с проверкой размера фото, и сохранением миниатюры для мобильного приложения.
Думаю есть консольные утилиты, которые помогут это сделать программно.

Самый простой способ: http://pro1c.org.ua/redirect.php?http://www.forum.mista.ru/topic.php?id=662933
И еще консольный метод: http://pro1c.org.ua/redirect.php?http://www.interface.ru/home.asp?artId=32789

Автор: Bernet 16.12.14, 14:13

спасибо, попробую

Автор: RedCat77 16.12.14, 17:57

Из личного опыта (фрагмент кода):

    Маска = "*.jpg";
    МассивФайлов = Новый Массив;
    МассивФайлов = НайтиФайлы(ПапкаИсточник, Маска);
    
    // Создаем объект
    ФайлКартинка = Новый COMОбъект("WIA.ImageFile");

    Для Каждого Картинка Из МассивФайлов Цикл
        ФайлКартинка.LoadFile(Картинка.ПолноеИмя);
        
        Состояние("Картинка: " + Картинка.Имя);
        
        //Сообщить("Картинка: " + Картинка.Имя);
        //Сообщить("    Расширение файла: " + ФайлКартинка.FileExtension);
        //Сообщить("    Ширина: " + ФайлКартинка.Width);
        //Сообщить("    Высота: " + ФайлКартинка.Height);
        //Сообщить("    Размер: " + Окр(ФайлКартинка.FileData.Count / 1024, 2) + " Кб");
        
        ФайлПрогресс = Новый COMОбъект("WIA.ImageProcess");
        ФайлПрогресс.Filters.Add(ФайлПрогресс.FilterInfos("Scale").FilterID);
        
        Если ФайлКартинка.Width > ФайлКартинка.Height Тогда
            Если ШиринаРис > ВысотаРис Тогда
                ФайлПрогресс.Filters(1).Properties("MaximumWidth").Value = ШиринаРис;
                ФайлПрогресс.Filters(1).Properties("MaximumHeight").Value = ВысотаРис;
            Иначе
                ФайлПрогресс.Filters(1).Properties("MaximumWidth").Value = ВысотаРис;
                ФайлПрогресс.Filters(1).Properties("MaximumHeight").Value = ШиринаРис;
            КонецЕсли;
        ИначеЕсли ФайлКартинка.Width < ФайлКартинка.Height Тогда
            Если ШиринаРис > ВысотаРис Тогда
                ФайлПрогресс.Filters(1).Properties("MaximumWidth").Value = ВысотаРис;
                ФайлПрогресс.Filters(1).Properties("MaximumHeight").Value = ШиринаРис;
            Иначе
                ФайлПрогресс.Filters(1).Properties("MaximumWidth").Value = ШиринаРис;
                ФайлПрогресс.Filters(1).Properties("MaximumHeight").Value = ВысотаРис;
            КонецЕсли;
        Иначе
            ФайлПрогресс.Filters(1).Properties("MaximumWidth").Value  = ШиринаРис;
            ФайлПрогресс.Filters(1).Properties("MaximumHeight").Value = ШиринаРис;
        КонецЕсли;
        
        //ФайлПрогресс.Filters(1).Properties("MaximumWidth").Value = ШиринаРис;
        //ФайлПрогресс.Filters(1).Properties("MaximumHeight").Value = ВысотаРис;
        ФайлПрогресс.Filters(1).Properties("PreserveAspectRatio").Value = Ложь;

        ФайлКартинка = ФайлПрогресс.Apply(ФайлКартинка);

        ВыбКартинка = Новый Файл(ПапкаПриемник + "\" + Картинка.Имя);
        Если ВыбКартинка.Существует() Тогда
            УдалитьФайлы(ПапкаПриемник + "\" + Картинка.Имя);
        КонецЕсли;
        ФайлКартинка.SaveFile(ПапкаПриемник + "\" + Картинка.Имя);
        
    КонецЦикла;


Дальше нужна фантазия для обвязки кода.
У COM объекта куча методов, можно поэксперементировать


 i 

Выделяем код
 

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua