GraphicsNET (GraphicsVK) — внешняя компонента для работы с графическими изображениями

1С: GraphicsЕжедневно приходится грузить большое количество картинок в базу данных. Чтобы автоматизировать процесс изменения размеров написал внешнюю компоненту для работы с изображениями. Хотя функционал не ограничивается одним только ресайзингом.

Переписал с нуля на другом языке (C#). Добавил полную поддержку emf и tif

Для работы компоненты потребуется установленный Microsoft .NET Framework 4, взять его можно отсюда.

Регистрация компоненты в Windows — запустить reg.bat
Удаление информации о компоненте — запустить unreg.bat

Общие сведения

GraphicsNET – внешняя компонента для работы с графическими изображениями. Может использоваться для конвертации из одного формата в другой, получения изображения из буфера обмена, изменения размера изображения, поворота (отражения), обрезки, получения размеров и добавления водяного знака.

Поддерживается работа со следующими форматами:
В режиме открытия:

  • bmp
  • jpg
  • png
  • gif
  • emf (wmf)
  • tif

В режиме сохранения:

  • bmp
  • jpg
  • png

Форматы «водяного знака»:

  • bmp
  • jpg
  • png
  • gif
  • emf (wmf)
  • tif

Описание свойств и методов

Свойства:

  • РазмерИзображения/ ImageSize – размер текущего изображения в формате «Ширина»x»Высота»(например, 300×550). Тип: Строка
  • Ширина/Width – ширина текущего изображения. Тип: Строка
  • Высота/Height – высота текущего изображения. Тип: Строка
  • ДвоичныеДанные/ BinaryData – файл в формате jpg без сжатия представленный в виде строки base64. Тип: Строка

Методы:

1) ПолучитьИзображение/GetImage – получает изображение для обработки (конвертации) из файла или буфера обмена.

Параметры:

  • ИмяФайла — имя открываемого для редактирования файла. Если имя файла пустое, то изображение берется из буфера обмена. Тип: Строка

2) ОбрезатьИзображение/CropImage – обрезает изображение на указанную величину.
Параметры:

  • Лево — количество пикселей (процентов), обрезаемых слева. Тип: Число
  • Право — количество пикселей (процентов), обрезаемых справа. Тип: Число
  • Верх — количество пикселей (процентов), обрезаемых сверху. Тип: Число
  • Низ — количество пикселей (процентов), обрезаемых снизу. Тип: Число
  • ВПроцентах – признак того, что все величины указаны в процентах. Тип: Булево

3) ПовернутьИзображение/RotateImage – поворачивает (отражает) текущее изображение.

Параметры:

  • ОтразитьПоГоризонтали – признак того, что изображение необходимо отразить по горизонтали. Тип: Булево
  • ОтразитьПоВертикали — признак того, что изображение необходимо отразить по вертикали. Тип: Булево
  • Поворот – поворот изображения (-1 – на 90 градусов против часовой, 1 – на 90 градусов по часовой). Тип: Число

4) ИзменитьРазмерИзображения/ResizeImage – изменяет размер изображения.

Параметры:

  • Ширина – новая ширина для изображения. Тип: Число
  • Высота – новая высота для изображения. Тип: Число
  • Процент – процент на который изменяется размер (если число отрицательное – уменьшение изображения, если положительное — увеличение). Тип: Число
  • СохранятьПропорции – признак того, что при изменении размера необходимо сохранить пропорции ихображения Если указано, что необходимо сохранить пропорции, то методу передается только один из параметров (либо шинира, либо высота), а второй параметр принимает нулевое значение. Тип: Булево.

5) ДобавитьВодянойЗнак/ AddWatermark – добавляет на текущее изображение «водяной знак».
Параметры:

  • ИмяФайла – файл, который будет использоваться в качестве водяного знака. Тип: Строка
  • Позиция – позиция на текущем изображении, где необходимо разместить водяной знак. Тип: Число

Принимает следующие значения:

0 – сверху слева
1 – сверху центр
2 – сверху справа
3 – по центру
4 – снизу слева
5 – снизу центр
6 – снизу справа

  • Прозрачность – процент прозрачности накладываемого изображения. Изменяется от 0 до 100. При 100 – изображение непрозрачно. Тип: Число

6) СохранитьИзображения/SaveImage – сохраняет изображение в файл на диске.

Параметры:

  • ИмяФайла – имя файла для сохранения на диске. Тип: Строка
  • ТипФайла – формат сохраняемого файла. Тип: Число

Принимает следующие значения:

0 – bmp

1 – jpg

2 – png

  • Сжатие – степень сжатия для файлов формата jpg. Тип: Число
  • УдалятьОригинал – признак того, что необходимо удалить оригинальный файл. Требуется, например, при конвертации из одного формата в другой. Тип: Булево.

7) Закрыть/Close – высвобождает память занятую текущим изображением.

Недостатки

1) Не поддерживается работа с очень большими изображениями (> ~5000×5000)

Прилагается небольшой пример работы с GraphicsNET.dll (8.2)

 

Скриншоты

 

 

 

67 комментариев к записи «GraphicsNET (GraphicsVK) — внешняя компонента для работы с графическими изображениями»

  1. Не пойму что не работает
    выгружаю номенклатуру в магазин на движке PrestoShop, в цикле необходимо насоздавать несколько картинок с разными именами и разными размерами и выгрузить их на ФТП

    Для Каждого СтрРазмер из ТабРазмеровИзображений Цикл
    НовоеИмяКартинки = ИмяКартинки+»-«+СтрРазмер.name;

    Попытка
    GraphicsVK.ПолучитьИзображение(КаталогМодуля+»foto_upload»+ИмяКартинки+».»+РасширениеКартинки);
    GraphicsVK.ИзменитьРазмерИзображения(Число(СтрРазмер.width), 0, 0, Истина);
    GraphicsVK.СохранитьИзображение(КаталогМодуля+»foto_upload»+НовоеИмяКартинки+».jpg», 1, 80, Истина);

    Соединение.Записать(КаталогМодуля+»foto_upload»+НовоеИмяКартинки+».jpg», FTPПуть+НовоеИмяКартинки+».jpg»);

    Исключение
    КонецПопытки;

    КонецЦикла;

    Но Ваша компонента возвращает ошибку о том, что неизвестный формат файла (пробовал на GIF, PNG и JPEG)

      • gif, png, jpeg

        Это картинки из демки
        «Управление торговлей», редакция 10.3 (10.3.12.3)
        Copyright (С) ЗАО «1C», 2003-2009. Все права защищены
        1С:Предприятие 8.1 (8.1.15.14)

        я на этой конфе тренируюсь с синхронизацией с PrestoShop

  2. Александр, есть предложение по сотрудничеству (разработка других компонент по работе с графикой под 1С 8). Если заинтересовало, отпишитесь, пожалуйста, на почту.

  3. На сервере2003х64 обрабатываю картинку и сохраняю в трех разных форматах, после трех сотен катастрофически падает скорость. Пишу на 7.7 Объект.Закрыть();; делаю, в чем может быть проблема?

      • Объект = СоздатьОбъект(«AddIn.GraphicsNet»);
        Объект.GetImage(КартинкаСтарая);//Загружаем нашу картинку типа «С:картинка.jpg»
        Объект.ResizeImage(464,0,0,1); // уменьшили ширину до 464 высота пропорционально уменьшилась
        СтрокаРазмеров= Объект.ImageSize;

        Если Число(Прав(СтрокаРазмеров,СтрДлина(СтрокаРазмеров)-Найти(СокрЛП(СтрокаРазмеров),»x»)))>294 Тогда //Проверим высоту

        Объект.ResizeImage(0,294,0,1); // уменьшили до 294
        КонецЕсли;
        Объект.SaveImage(ФормИмяКаталог+»LRG»+Картинка,1,80,0);
        Объект.Закрыть();; // высвобождает память занятую текущим изображением

        Объект.GetImage(КартинкаСтарая);//Загружаем нашу картинку типа «С:картинка.jpg»
        СтрокаРазмеров= Объект.ImageSize;

        Объект.ResizeImage(240,0,0,1); // уменьшили ширину до 240 высота пропорционально уменьшилась
        СтрокаРазмеров= Объект.ImageSize;
        Если Число(Прав(СтрокаРазмеров,СтрДлина(СтрокаРазмеров)-Найти(СокрЛП(СтрокаРазмеров),»x»)))>152 Тогда //Проверим высоту

        Объект.ResizeImage(0,152,0,1); // уменьшили до 152

        КонецЕсли;
        Объект.SaveImage(ФормИмяКаталог+»MED»+Картинка,1,80,0);
        Объект.Закрыть();; // высвобождает память занятую текущим изображением

        Объект.GetImage(КартинкаСтарая);//Загружаем нашу картинку типа «С:картинка.jpg»

        Объект.ResizeImage(120,0,0,1); // уменьшили ширину до 120 высота пропорционально уменьшилась
        СтрокаРазмеров= Объект.ImageSize;
        Если Число(Прав(СтрокаРазмеров,СтрДлина(СтрокаРазмеров)-Найти(СокрЛП(СтрокаРазмеров),»x»)))>76 Тогда //Проверим высоту

        Объект.ResizeImage(0,76,0,1); // уменьшили до 76

        КонецЕсли;
        Объект.SaveImage(ФормИмяКаталог+»FULL»+Картинка,1,80,0);
        Объект.Закрыть();; // высвобождает память занятую текущим изображением

  4. Александр, добрый день. Есть ли рекомендации по работе с компонентой?

    • Проверьте почту. Отправил письмо 16.05, сегодня еще раз продублировал

  5. Доброе время суток! по примеру ЗУП пробовал библиотеку dll сакинуть в макет обработки примера, но вызов происходит с ошибкой. Помогите разобраться, вот код обработки:

    Процедура ПриОткрытии()

    Попытка
    //ПодключитьВнешнююКомпоненту(«AddIn.GraphicsNET»);
    ПодключитьВнешнююКомпоненту(«Макет.БиблиотекаVK», «GraphicsNET», ТипВнешнейКомпоненты.Native);
    Исключение
    Предупреждение(ОписаниеОшибки());
    КонецПопытки;

    Попытка
    GraphicsVK = Новый(«AddIn.GraphicsNET»); //здесь ошибка тип не определен
    Исключение
    Предупреждение(ОписаниеОшибки());
    КонецПопытки;

    КонецПроцедуры

    • 1) Компонента не является нативной т.е. не может подключаться из макета.
      2) Компонента перед использованием должна быть зарегистрирована в системе при помощи reg.bat из архива
      3) Регистрация компоненты должна производится пользователем с административными правами
      4) Если пункт 2 и 3 выполнен, то в 1С подключение происходит так ПодключитьВнешнююКомпоненту("AddIn.GraphicsNET");

  6. Не получается подключить на сервере 1С, пишет Тип не определен. Хотя в режиме толстого клиента работает нормально. Сервер находится на этом же компьютере , где запускался толстый клиент. т.е. компонента на сервере зарегистрирована.

    • На сервере данная версия компоненты работать не будет. Работающий вариант есть, скоро постараюсь выложить его

  7. Прежде всего, спасибо вам за этот продукт.
    Столкнулся со следующим багом: при попытке конвертировать tif файл в jpg выдает ошибку «GraphicsComp: Parameter is not valid.» http://i.imgur.com/4IjLdyp.png. bmp же конвертирует без проблем. Исходный tif файл: http://yadi.sk/d/VizXz4yk3QbgG

  8. Здравствуйте

    «На сервере данная версия компоненты работать не будет. Работающий вариант есть, скоро постараюсь выложить его»
    Подскажите пожалуйста, на сегодня есть решение по выгрузке изображений в серверном варианте в фоновом режиме?

  9. Добрый день, Александр! Премного благодарен Вам за Ваш проект, который серьёзно помогает мне встать на ноги в роли программиста на предприятии. Отдельное спасибо за версию 2.4.9.0! И вообще позвольте от лица всех (а таких большинство, я думаю), кто двигает 1С, поблагодарить Вас за ваш колоссальный труд! Спасибо за терпение и желание не бросать развитие проекта и не делать его платным! Поделюсь своим пожеланием: мне лично не хватает теперь только возможности подставлять ключи на запуск 1C. Тогда Ваш стартер был бы воистину фантастическим и не имеющим себе равных! Спасибо.

    • Спасибо за теплый отзыв! Рад стараться и развивать проект, хоть времени на него практически и нет. Ключи запуска 1С, если вы имеете ввиду запуск базы, когда доступ к ней ограничен, давно есть. В самом низу настройки БД есть поле «Код доступа».

  10. Добрый день.
    Работает ли компонента по Вин 7 64?
    Компонента не регистрируется ни RegASM ни кодом 1С

    • Приветствую! Специально под x64 не проверял, но должна работать.
      Для регистрации используйте RegAsm.exe от соответствующей версии.
      Взять можно по по адресу c:\Windows\Microsoft.NET\Framework64\v2.x.xxx\ или c:\Windows\Microsoft.NET\Framework64\v4.x.xxx\

  11. Здравствуйте, на сервере исправлены ошибки?
    На файле все работало нормально. Недавно перешли на сервер — выскакивает ошибка
    AddIn.GraphicsNET тип не определен

    • Здравствуйте!
      Попробуйте создавать объект вот так
      ПодключитьВнешнююКомпоненту("AddIn.GraphicsNET");
      Новый("AddIn.GraphicsNET");

      вместо
      Новый COMОбъект("AddIn.GraphicsNET");

  12. Здравствуйте, пользуюсь Вашей компонентой GraphicsNET. Благодарю за такую полезную разработку =)

    А как убрать сообщение «В буфере изображение»? Я использую компоненту чтобы получать изображение из буфера, может у Вас есть какая-нибудь нативная компонента для этого?

    Заранее благодарю =)

    • У вас, вероятно, старая версия библиотеки. Скачайте еще раз её и все будет хорошо.

      • Благодарю, за быстрый ответ. Ещё раз прикрепила длл все равно пишет «В буфере изображение» а потом вставляет изображение.
        Параметры Windows server 2008 x64, разархивировала файлы, регила с помощью командного файлика reg.

          • Благодарю. Реестр почистила (руками вытащила все остатки). Попробовала тоже самое.
            Может я что-то не так в коде делаю?

            &НаКлиенте
            Процедура Команда1(Команда)
            Отказ = Ложь;
            Попытка
            ПодключитьВнешнююКомпоненту(«AddIn.GraphicsNET»);
            Исключение
            Отказ = Истина;
            Сообщить(ОписаниеОшибки());
            КонецПопытки;

            Если Не Отказ Тогда
            Попытка
            GraphicsVK = Новый(«AddIn.GraphicsNET»);
            Исключение
            Сообщить(ОписаниеОшибки());
            КонецПопытки;
            КонецЕсли;

            // Загружаем изображение в обект
            СодержимоеБуфера = GraphicsVK.ПолучитьИзображение(«»);
            СтрокаBase64 = GraphicsVK.ДвоичныеДанные;
            ДвоичныеДанные = Base64Значение(СтрокаBase64);
            Объект.ФотоТорта = ЗаписатьНаСервере(ДвоичныеДанные, «Картинка» + Объект.Ссылка, Объект.Ссылка);
            Картинка1 = НавигационнаяСсылкаКартинки(Объект.ФотоТорта, ЭтаФорма.УникальныйИдентификатор) ;
            // Высвобождаем память
            GraphicsVK.Закрыть();
            Модифицированность = Истина;
            КонецПроцедуры

            &НаСервере
            Функция НавигационнаяСсылкаКартинки(ФайлКартинки, ИдентификаторФормы)
            АдресКартинки = ПоместитьВоВременноеХранилище(ФайлКартинки.ФайлХранилище.Получить(), ИдентификаторФормы);
            Возврат АдресКартинки;

            КонецФункции

  13. Тут дело не в вашем коде, такое окно раньше выдавала сама библиотека, теперь этого не должно происходить, если используется новая версия. Возможно вы регистрировали компоненту, когда она лежала в другом месте на диске (и до сих пор так лежит). У меня была похожая ситуация. Можно сделать так:
    1) Запустите 1С и выполните какой-нибудь код, использующий библиотеку
    2) Найдите все GraphicsNET.dll на диске
    3) Не закрывая 1С удаляйте их.
    Удалить используемую dll вы не сможете. После этого положите рядом файлы unreg и regasm и выполните unreg . После этого уже регистрируйте новую компоненту.

  14. Премного благодарен! Очень помогло в области агентств по продаже недвижимости. Требовалось при добавлении фотографии объекта недвижимости, приводить к размеру и добавлять водяной знак компании.

    • Спасибо! Всегда приятно, когда разработка помогает кому-то еще в решении задач.

      • Александр, а можно ли картинку, у которой высота больше ширины, привести к пропорции, где ширина больше высоты без обрезания по вертикали — дополнить края нейтральным фоном. А потом пропорционально уменьшать до размера, например, 640*480 (это работает).

  15. Александр, добрый день.
    Очень полезная компонента, но пока нам никак не удается запустить ее на сервере. Windows Server 2012 Std, 32-х разрядная 1C 8.2.18.102 При выполнении кода:
    ПодключитьВнешнююКомпоненту(«AddIn.GraphicsNET»);
    Новый(«AddIn.GraphicsNET»);
    Получаем ошибку вида:
    Тип не определен (AddIn.GraphicsNET)
    Пробовали:
    1) Помещать dll в папку bin.
    2) Регистрировать RegAsm’ами разных версий — 64-х разрядной и 32-х разрядной от Framework второй и четвертой версий. Каждый раз с сообщением об успешном определении типов.
    3) Использовать старый код для создания COM-объекта. Для очистки совести.
    При этом, если запускать на клиенте, то все прекрасно работает. Не подскажете, в чем может быть проблема?
    Спасибо.

    • Здравствуйте, Сергей!
      У вас клиент-серверный вариант работы? Сервер 1С-Предприятия x86 или x64 (именно сервер 1С, а не операционная система)?

      • Да, клиент-серверный вариант работы, сервер 1С х86. Если запустить клиент на серверной машине, то в нем компонента тоже работает.

        • Сталкивался с такой проблемой на связке Windows Server 2008 x64 и сервер 1С x64. Решить её до сих пор возможности нет. Начал делать нативную компоненту, но на x64 сервере она просто выбивает процесс с ошибкой. В общем пока в тупике.
          На x86 у меня работало все без проблем и &НаСервере и &НаКлиенте. Могу только посоветовать попробовать настроить через DCOM. В интернете много примеров, один из последних тут

          • В приведенной инструкции описывается регистрация Excel. Не подскажете, для вашей обработки какие нужно указывать AppID и путь в реестре?

          • AppID: 8A603F7F-1DCB-4F2F-B929-27B9AD6E9BFA
            Путь: HKEY_CLASSES_ROOT\AddIn.GraphicsNET

          • Добавил запись в реестре, приложение появилось в списке «Настройка DCOM», однако настройки не сохраняются, и отсутствует какая-либо статистическая информация типа имени или кода приложения. Такое ощущение, что нужно где-то путь к dll вписать.

          • Я постараюсь воспроизвести ситуацию и отпишусь вам тогда.

          • Добрый день. Есть какие-нибудь новости?

          • Здравствуйте!
            К сожалению решения пока нет. Перепробывал все возможные варианты, результат всегда один.

  16. Добрый день обновлялись — обновлялись. Платформа 8.3.6.2299.
    Раньше работало все.
    Теперь при запуске обработки 1С тупо вылетает. Откатить назад платформу не можем. И графикс нет работать не хочет. Может встречали подобную ошибку. Cервер 1c (постгрес) — пробовал из файловой запустить — тоже самое. Операционка — семерка. Специально ввиду всяких различных проблем после обновлений — снятая давным давно с поддержки. Пробовал на ИКС ПИ запустить — тоже савмое…вылетает ошибка «Прекращена работа «1cv8″»

    • Здравствуйте, Михаил!
      Какой вариант базы используете, файловый или клиент-серверный? Если последний то какая версия сервера x86 или x64? Такую проблему я встречал только на x64 сервере, но решить в текущей версии ёё так и не смог. Сейчас у меня есть новая версия, правда она платная, но есть демо-версия. Писалась она для 8.3 и тонкого клиента, выполнена по технологии NativeAPI. Попробуйте её в работе, возможно поможет.

  17. Добрый день.

    Компонента отличная, работает на ура. Претензий нет) Молодцы.

    Единственное, что было замечено (работа с компонентой из 1с), компонента не работает, если в конфигурации отключен режим совместимости. 1с зависает напрочь в момент обращения к свойствам картинки (например, получить ширину картинки)

  18. Спасибо вам за компоненту, очень выручила при загрузки картинок.

  19. Здравствуйте. Подскажите пожалуйста, как в 1с 7.7 с помощью вашей библиотеки сохранить картинку из ячейки экселя на диск. Интересует только кусок кода, который собственно вытаскивает картинку из ячейки и сохраняет на диск.
    Пытался использовать метод GetImage(«»), который судя по описанию должен читать данные из буфера обмена, но не понятно, как в буфер попадёт картинка.

    • Здравствуйте! Смотрите в сторону метода excel Sheet.Shapes.Copy(). У меня есть пример, правда с самой первой версией обработки. Метод компоненты вы используете правильный.

  20. Доброго времени суток, к сожалению возникает какая-то беда с регистрацией, при открытии батника он моргает и пропадает ничего не говоря.
    Помогите разобраться, буду премного благодарна.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *