Ежедневно приходится грузить большое количество картинок в базу данных. Чтобы автоматизировать процесс изменения размеров написал внешнюю компоненту для работы с изображениями. Хотя функционал не ограничивается одним только ресайзингом.
Переписал с нуля на другом языке (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)
[stextbox id=»download» caption=»Файлы»]
Старая версия компоненты (GraphicsVK)
[/stextbox]
[stextbox id=»grey» caption=»Скриншоты»]
[/stextbox]
Не смог bmp сохранить как jpg — все равно остается bmp.
Код в студию
Разобрался, спасибо за компоненту!
Пожалуйста!
Не пойму что не работает
выгружаю номенклатуру в магазин на движке 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
Попробуйте установить новую версию компоненты
да, работает, большое спасибо
Александр, есть предложение по сотрудничеству (разработка других компонент по работе с графикой под 1С 8). Если заинтересовало, отпишитесь, пожалуйста, на почту.
В реживе веб-клиента похоже не работает?
Нет, в веб-клиенте не работает
На сервере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);
Объект.Закрыть();; // высвобождает память занятую текущим изображением
Александр, добрый день. Есть ли рекомендации по работе с компонентой?
Проверьте почту. Отправил письмо 16.05, сегодня еще раз продублировал
Спасибо!
Заработало как надо?
Доброе время суток! по примеру ЗУП пробовал библиотеку dll сакинуть в макет обработки примера, но вызов происходит с ошибкой. Помогите разобраться, вот код обработки:
Процедура ПриОткрытии()
Попытка
//ПодключитьВнешнююКомпоненту(«AddIn.GraphicsNET»);
ПодключитьВнешнююКомпоненту(«Макет.БиблиотекаVK», «GraphicsNET», ТипВнешнейКомпоненты.Native);
Исключение
Предупреждение(ОписаниеОшибки());
КонецПопытки;
Попытка
GraphicsVK = Новый(«AddIn.GraphicsNET»); //здесь ошибка тип не определен
Исключение
Предупреждение(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
1) Компонента не является нативной т.е. не может подключаться из макета.
2) Компонента перед использованием должна быть зарегистрирована в системе при помощи reg.bat из архива
3) Регистрация компоненты должна производится пользователем с административными правами
4) Если пункт 2 и 3 выполнен, то в 1С подключение происходит так
ПодключитьВнешнююКомпоненту("AddIn.GraphicsNET");
Не получается подключить на сервере 1С, пишет Тип не определен. Хотя в режиме толстого клиента работает нормально. Сервер находится на этом же компьютере , где запускался толстый клиент. т.е. компонента на сервере зарегистрирована.
На сервере данная версия компоненты работать не будет. Работающий вариант есть, скоро постараюсь выложить его
Прежде всего, спасибо вам за этот продукт.
Столкнулся со следующим багом: при попытке конвертировать tif файл в jpg выдает ошибку «GraphicsComp: Parameter is not valid.» http://i.imgur.com/4IjLdyp.png. bmp же конвертирует без проблем. Исходный tif файл: http://yadi.sk/d/VizXz4yk3QbgG
Здравствуйте
«На сервере данная версия компоненты работать не будет. Работающий вариант есть, скоро постараюсь выложить его»
Подскажите пожалуйста, на сегодня есть решение по выгрузке изображений в серверном варианте в фоновом режиме?
Добрый день, Александр! Премного благодарен Вам за Ваш проект, который серьёзно помогает мне встать на ноги в роли программиста на предприятии. Отдельное спасибо за версию 2.4.9.0! И вообще позвольте от лица всех (а таких большинство, я думаю), кто двигает 1С, поблагодарить Вас за ваш колоссальный труд! Спасибо за терпение и желание не бросать развитие проекта и не делать его платным! Поделюсь своим пожеланием: мне лично не хватает теперь только возможности подставлять ключи на запуск 1C. Тогда Ваш стартер был бы воистину фантастическим и не имеющим себе равных! Спасибо.
Спасибо за теплый отзыв! Рад стараться и развивать проект, хоть времени на него практически и нет. Ключи запуска 1С, если вы имеете ввиду запуск базы, когда доступ к ней ограничен, давно есть. В самом низу настройки БД есть поле «Код доступа».
Добрый день.
Работает ли компонента по Вин 7 64?
Компонента не регистрируется ни RegASM ни кодом 1С
Приветствую! Специально под x64 не проверял, но должна работать.
Для регистрации используйте RegAsm.exe от соответствующей версии.
Взять можно по по адресу c:\Windows\Microsoft.NET\Framework64\v2.x.xxx\ или c:\Windows\Microsoft.NET\Framework64\v4.x.xxx\
Здравствуйте, на сервере исправлены ошибки?
На файле все работало нормально. Недавно перешли на сервер — выскакивает ошибка
AddIn.GraphicsNET тип не определен
Здравствуйте!
Попробуйте создавать объект вот так
ПодключитьВнешнююКомпоненту("AddIn.GraphicsNET");
Новый("AddIn.GraphicsNET");
вместо
Новый COMОбъект("AddIn.GraphicsNET");
Спасибо огромное все заработало
Здравствуйте, пользуюсь Вашей компонентой GraphicsNET. Благодарю за такую полезную разработку =)
А как убрать сообщение «В буфере изображение»? Я использую компоненту чтобы получать изображение из буфера, может у Вас есть какая-нибудь нативная компонента для этого?
Заранее благодарю =)
У вас, вероятно, старая версия библиотеки. Скачайте еще раз её и все будет хорошо.
Благодарю, за быстрый ответ. Ещё раз прикрепила длл все равно пишет «В буфере изображение» а потом вставляет изображение.
Параметры Windows server 2008 x64, разархивировала файлы, регила с помощью командного файлика reg.
Понял. Постараюсь сегодня проверить и завтра отвечу.
1С предприятие 8.3.5.1186
Сборку на сайте обновил. Скачивайте
Благодарю. Реестр почистила (руками вытащила все остатки). Попробовала тоже самое.
Может я что-то не так в коде делаю?
&НаКлиенте
Процедура Команда1(Команда)
Отказ = Ложь;
Попытка
ПодключитьВнешнююКомпоненту(«AddIn.GraphicsNET»);
Исключение
Отказ = Истина;
Сообщить(ОписаниеОшибки());
КонецПопытки;
Если Не Отказ Тогда
Попытка
GraphicsVK = Новый(«AddIn.GraphicsNET»);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
// Загружаем изображение в обект
СодержимоеБуфера = GraphicsVK.ПолучитьИзображение(«»);
СтрокаBase64 = GraphicsVK.ДвоичныеДанные;
ДвоичныеДанные = Base64Значение(СтрокаBase64);
Объект.ФотоТорта = ЗаписатьНаСервере(ДвоичныеДанные, «Картинка» + Объект.Ссылка, Объект.Ссылка);
Картинка1 = НавигационнаяСсылкаКартинки(Объект.ФотоТорта, ЭтаФорма.УникальныйИдентификатор) ;
// Высвобождаем память
GraphicsVK.Закрыть();
Модифицированность = Истина;
КонецПроцедуры
&НаСервере
Функция НавигационнаяСсылкаКартинки(ФайлКартинки, ИдентификаторФормы)
АдресКартинки = ПоместитьВоВременноеХранилище(ФайлКартинки.ФайлХранилище.Получить(), ИдентификаторФормы);
Возврат АдресКартинки;
КонецФункции
Тут дело не в вашем коде, такое окно раньше выдавала сама библиотека, теперь этого не должно происходить, если используется новая версия. Возможно вы регистрировали компоненту, когда она лежала в другом месте на диске (и до сих пор так лежит). У меня была похожая ситуация. Можно сделать так:
1) Запустите 1С и выполните какой-нибудь код, использующий библиотеку
2) Найдите все GraphicsNET.dll на диске
3) Не закрывая 1С удаляйте их.
Удалить используемую dll вы не сможете. После этого положите рядом файлы unreg и regasm и выполните unreg . После этого уже регистрируйте новую компоненту.
Спасибо! Очень пригодилось!
Премного благодарен! Очень помогло в области агентств по продаже недвижимости. Требовалось при добавлении фотографии объекта недвижимости, приводить к размеру и добавлять водяной знак компании.
Спасибо! Всегда приятно, когда разработка помогает кому-то еще в решении задач.
Александр, а можно ли картинку, у которой высота больше ширины, привести к пропорции, где ширина больше высоты без обрезания по вертикали — дополнить края нейтральным фоном. А потом пропорционально уменьшать до размера, например, 640*480 (это работает).
Нет, размер холста увеличить нельзя.
Александр, добрый день.
Очень полезная компонента, но пока нам никак не удается запустить ее на сервере. 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 вписать.
Я постараюсь воспроизвести ситуацию и отпишусь вам тогда.
Добрый день. Есть какие-нибудь новости?
Здравствуйте!
К сожалению решения пока нет. Перепробывал все возможные варианты, результат всегда один.
То есть, проблема не воспроизводится?
Воспроизводится, но на сервере компонента не создается.
Добрый день обновлялись — обновлялись. Платформа 8.3.6.2299.
Раньше работало все.
Теперь при запуске обработки 1С тупо вылетает. Откатить назад платформу не можем. И графикс нет работать не хочет. Может встречали подобную ошибку. Cервер 1c (постгрес) — пробовал из файловой запустить — тоже самое. Операционка — семерка. Специально ввиду всяких различных проблем после обновлений — снятая давным давно с поддержки. Пробовал на ИКС ПИ запустить — тоже савмое…вылетает ошибка «Прекращена работа «1cv8″»
Здравствуйте, Михаил!
Какой вариант базы используете, файловый или клиент-серверный? Если последний то какая версия сервера x86 или x64? Такую проблему я встречал только на x64 сервере, но решить в текущей версии ёё так и не смог. Сейчас у меня есть новая версия, правда она платная, но есть демо-версия. Писалась она для 8.3 и тонкого клиента, выполнена по технологии NativeAPI. Попробуйте её в работе, возможно поможет.
Добрый день.
Компонента отличная, работает на ура. Претензий нет) Молодцы.
Единственное, что было замечено (работа с компонентой из 1с), компонента не работает, если в конфигурации отключен режим совместимости. 1с зависает напрочь в момент обращения к свойствам картинки (например, получить ширину картинки)
Добрый день.
По режиму совместимости что-то решилось? Или может есть какой платный вариант?
Здравствуйте, Алексей! Посмотрите тут
Очень интересно!
Спасибо вам за компоненту, очень выручила при загрузки картинок.
Здравствуйте. Подскажите пожалуйста, как в 1с 7.7 с помощью вашей библиотеки сохранить картинку из ячейки экселя на диск. Интересует только кусок кода, который собственно вытаскивает картинку из ячейки и сохраняет на диск.
Пытался использовать метод GetImage(«»), который судя по описанию должен читать данные из буфера обмена, но не понятно, как в буфер попадёт картинка.
Здравствуйте! Смотрите в сторону метода excel Sheet.Shapes.Copy(). У меня есть пример, правда с самой первой версией обработки. Метод компоненты вы используете правильный.
Доброго времени суток, к сожалению возникает какая-то беда с регистрацией, при открытии батника он моргает и пропадает ничего не говоря.
Помогите разобраться, буду премного благодарна.
Есть печатная форма в которым используются ваша разработка. На удаленным сервере работаем.
Пользователи с админскими правами из 1с печатную форму печатают и картинки видны. а вот если у удаленного пользователя проста права user и remote desktop тогда не формируются.
получаем такую ошибку
{ОбщийМодуль.Печать.Модуль(92)}: Значение не является значением объектного типа (ПолучитьИзображение)
GraphicsVK.ПолучитьИзображение(tempImageFileName);
Никогда с таким не сталкивался. Попробуйте выполнить reg.bat под удаленным пользователем. Интерфейс у вас тонкий или толстый?
Толстый. у удаленных пользователей нет прав для запуска reg.bat
Добрый день. Для меня конечно очень странно, но я не могу зарегистрировать dll.
Запускаю reg.bat под админскими правами и получаю ошибку: «This application could not be started».
Windows 10
И да, пришёл к этому от ошибки: » AddIn.GraphicsNET тип не определен».
Запускал ПодключитьВнешнююКомпоненту(«AddIn.GraphicsNET»);
Новый(«AddIn.GraphicsNET»);
Здравствуйте! Microsoft .NET Framework 4 установлен? Вероятно, ошибка от того, что нет regasm.exe
При регистрации в win10 действительно есть проблемы, Microsoft .NET Framework установлен 4.5. все шаманский действия не помогают, при этом в win 7 х64 устанавливаю спокойно.
Похоже разработка заглохла, ответов на животрепещущие вопросы по регистрации в win10 нет.