Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Сжатие картинок
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование обычных форм 1С 8.2 и не интерфейсной логики
Bernet
Добрый день. Есть база 1С (УПП) и мобильное приложение Агент+, необходимо выгружать картинки из базы 1С на Агент+, выгрузку сделал, но файл с выгрузкой получается примерно 30 Мб, что есть не очень удобно, учитывая что 29 Мб из них весят картинки. Возник вопрос: можно ли как-то при выгрузке картинок изменять их размер. Большинство картинок весят немного (примерно 30 Кб) но есть и побольше (до 1 Мб) - вот их и хочу уменьшить при выгрузке. Готовые обработки по ресайзу картинок приветствуются smile.gif
Vofka
Конкретно по теме не подскажу (как сжать картинку средствами 1С). Но может имеет смысл подумать над тем, чтобы уменьшить размер исходной картинки: сжать какой-то программой, конвертировать в какой-то другой формат и т.п.
Bernet
Да, такой вариант тоже рассматриваю, просто хотелось бы 1 раз сделать и забыть, ведь пользователь не будет заморачиваться такой ерундой - он загрузит картинку и все. А я как существо ленивое не хочу постоянно следить за размером выгружаемого архива wink.gif Думал может можно при выгрузке определять размер файла и если он, например, больше 100 Кб - пропорционально уменьшать размеры картинки.
python
Это каждый раз при выгрузке проверять размер картинки и пережимать ее? И делать это, скорее всего, сторонней прогой.
Может, имеет смысл хранить копию картинки для мобильного приложения?
Bernet
Картинки добавляют обычные пользователи - как я писал выше, они проверять размер не будут, поэтому хранить копии не вижу смысла поскольку пользователь все равно добавит здоровенную картинку, которую нужно уменьшить, что возвращает меня к изначальному вопросу - "Как можно уменьшить картинку программно?". Ну и плюс база так разрастется (номенклатуры много - примерно 5000) - все таки граф. информация жрет конкретно.
Vofka
Ещё один "не прямой" путь: ограничить размер картинки на уровне 1С, т.е. в момент загрузки в картинки в 1С проверять, чтоб картинка не превышала определенный размер.
python
Bernet, я и не предлагал пользователей заставлять сохранять две копии (хотя тоже имеет право на жизнь такой подход).
При добавлении картинки добавить дополнительный обработчик с проверкой размера фото, и сохранением миниатюры для мобильного приложения.
Думаю есть консольные утилиты, которые помогут это сделать программно.

Самый простой способ: необходимо зарегистрироваться для просмотра ссылки
И еще консольный метод: необходимо зарегистрироваться для просмотра ссылки
Bernet
спасибо, попробую
RedCat77
Из личного опыта (фрагмент кода):

    Маска = "*.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 

Выделяем код
 
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.