Сжатие JPEG и наложение на него водяного знака

09.02.12

Разработка - Разработка внешних компонент

Искал чего-нибудь простое для решения вопроса "Как сжать JPEG и наложить водяной знак".
То ли плохо искал, то ли еще никому это не надо было (что вряд ли), посему наваял свое.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
JPGResize.exe
.exe 537,50Kb
206
206 Скачать (1 SM) Купить за 1 850 руб.
watermark.png
.png 3,85Kb
43
43 Скачать (1 SM) Купить за 1 850 руб.
ImgResize_Ishodniki
.zip 399,63Kb
64
64 Скачать (1 SM) Купить за 1 850 руб.
ImgResize.zip
.zip 300,57Kb
67
67 Скачать (1 SM) Купить за 1 850 руб.

Задача:

  1. Изменить размеры JPG фала до нужного размера
  2. Применить компрессию к файлу
  3. Наложить водяной знак

Во вложении exe файл, запускать с ключами:

JPGResize.exe ключ1 ключ2 ключ3 ключ4 ключ5

ключ1 - "имя исходного файла"

ключ2 - "имя файла назначения"

ключ3 - высота новой картинки

ключ4 - ширина новой картинки

ключ5 - "файл с водяным знаком" (png)

Все ключи обязательны!!!

Написано минут за 15.

Размещение водяного знака в нижней части изображения.

Баги могут возникать:

  1. Если передавать имена файлов с пробелами не в кавычках, в остальном должно работать
  2. Если передать дробные размеры высоты и ширины
  3. Если не указан один из ключей

Если будет кому-нибудь полезно, сделаю проверки :)

P.S. При чем здесь 1С? Наверно при том, что реализовать данную штуку пришлось потому, что файлы прикреплены к номенклатуре и сертификатам в 1С

P.S.2 По просьбам трудящихся, в файле JPGResize.zip выложил исходники на Delphi7, если кто-то сделает из нее dll, чтобы она в 1С цеплялась, минимум + гарантирую :)

P.S.3 функционал частично перенесен в //infostart.ru/public/59436/#postform (197 пост)

UPGRADE:

P.S.4 Сделал таки DLL. Пример использования:

ЗагрузитьВнешнююКомпоненту(КаталогИБ()+"ImgResize.dll")

ИМЖ = СоздатьОбъект("AddIn.ImgResize");

ИМЖ.ПережатьФайл("ИсходныйФайл", "КонечныйФайл", Высота, Ширина, "WaterMark.png");

ИМЖ.ConvertFile("ИсходныйФайл", "КонечныйФайл", Высота, Ширина, "WaterMark.png");

См. также

Разработка внешних компонент WEB-интеграция Программист Платформа 1С v7.7 Конфигурации 1cv7 Платные (руб)

Компонента HttpSrv7 позволяет создавать веб-сервисы в среде 1С 7.7 и даже, используя файлы HTML, несложные веб-сайты. С помощью нее можно обеспечить доступ к данным 1С 7.7 из браузера. Дополнительно используя компоненту HTTP_Async или синхронный клиент HTTP для 1С 7.7 (публикация № 1152364) можно наладить обмен данными между удаленными информационными базами. С помощью компоненты HTTP_Async можно сначала послать несколько запросов к сайтам, веб-сервисам (в т.ч. к HttpSrv7), а затем обрабатывать данные по мере их поступления. Компонента GISMT в дополнение к HTTP_Async имеет функцию цифровой подписи и, таким образом, имеет все возможности для работы с API ГИС МТ "Честный знак" непосредственно из среды 1С 7.7.

2000 руб.

27.05.2022    8580    23    17    

34

Разработка внешних компонент Системный администратор Программист Платформа 1С v7.7 Платформа 1С v8.3 Платформа 1C v8.2 Платформа 1С v8.1 Россия Платные (руб)

Аддон "Структура Обмена" (ExchangeStruc) - это компонента, которая обеспечивает доступ к разделяемым процессом структурам, аналогичным структурам 1С. Обеспечивает прозрачную передачу данных примитивных типов, в том числе Двоичных данных, в режиме Реального времени между разными контекстами (формами) или потоками одного процесса. В перспективе функционал будет расширен для обмена между процессами, даже разных версий платформ. Совместим с версиями Windows рабочих станций и серверов, с платформами 1С разных версий и релизов в режиме Native начиная с 8.2, и в режиме COM начиная с версий 7.7. По скорости чтения и записи лишь немногим уступает стандартной структуре 1С. НОВОЕ: Добавлен функционал регистрации компоненты COM в качестве OLE Auto (COMОбъект) для поддержки её работы в серверах старых версий 1С: 8.0 и 8.1, где работа с компонентами исключена. Теперь можно коммуникацию с Фоновыми заданиями на этих версиях проводить.

7200 руб.

19.04.2023    5160    1    0    

3

Работа с интерфейсом Логистика, склад и ТМЦ Системный администратор Программист Пользователь Платформа 1С v7.7 1С:Торговля и склад 7.7 Оптовая торговля, дистрибуция, логистика Управленческий учет Платные (руб)

Решение для разработчика и конечного пользователя для работы с фотографиями номенклатуры: систематизация, хранение, отображение, а также выгрузка на Яндекс-Диск и FTP (кроме версии лайт). Поддерживаются графические форматы: bmp, jpg, gif, tiff, а также png - не поддерживаемый штатными средствами 1С. Выполнено без использования внешних компонент (кроме функции выгрузки на FTP). Поставляется как в виде пустой конфигурации с набором объектов и модулей для работы с фото, так и в виде обновления к 1С:Торговля и склад 7.7. Выполнено в двух версиях: "полная" и "лайт".

5000 руб.

18.10.2022    5732    1    45    

4

Разработка внешних компонент Программист Платформа 1С v7.7 Платные (руб)

Компонента для выбора значения из больших списков значений.

1200 руб.

02.12.2021    6118    2    19    

4

Разработка внешних компонент WEB-интеграция Программист Платформа 1С v7.7 Абонемент ($m)

Компонента позволяет использовать различные веб-сервисы интернет-ресурсов, например работать с онлайн-кассой через API, предоставленное ее разработчиком. Тестировалась на платформе 1С релиза 7.70.027.

1 стартмани

14.11.2019    18962    96    mdbruyfn    103    

17

Разработка внешних компонент Программист Пользователь Платформа 1С v7.7 Платформа 1С v8.3 Транспорт, автопарки, такси Россия Платные (руб)

Программа "Компонента приёма веса для 1С, версия 3.0" позволяет принимать и заносить вес с весов непосредственно в программу "1С" - то есть, прием веса осуществляется целиком и полностью из программы "1С".

26400 руб.

09.04.2019    16389    2    8    

5

Разработка внешних компонент ККМ Кассовые операции Системный администратор Программист Оперативный учет 7.7 1С:Торговля и склад 7.7 Абонемент ($m)

Внешняя компонента - оболочка для работы в среде 1С 7.7 или 1С 8.1 с последними версиями драйверов ККМ от АТОЛ. Поддерживаются драйвера x32 начиная с версии 9.11. Присутствует внешняя обработка для полноценной работы с данными драйверами (поддержка ревизий 2.0, 2.1, 2.2, поддержка протокола ОФД 1.0, 1.0.5, 1.1).

1 стартмани

09.08.2017    54234    348    asdfghgghjdhg    141    

18
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. ЗАК 16.07.10 14:55 Сейчас в теме
А исходники публиковать не будешь ? :)
8. maxpiter 148 19.07.10 10:07 Сейчас в теме
(1) (5) исходники на Delphi7 в архиве. Если сделаете из исходников dll которая в 1С будет цепляться, цены вам не будет ;)
ЗАК; zuza; +2 Ответить
2. maxpiter 148 16.07.10 15:15 Сейчас в теме
Чтобы исходники выкладывать, надо их причесывать, чтобы не стыдно за них было :)
3. zuza 321 16.07.10 17:24 Сейчас в теме
(3) Спасибо, то что нужно.
4. Armando 1401 16.07.10 20:14 Сейчас в теме
5. DoctorRoza 18.07.10 10:59 Сейчас в теме
Старина! :) Давай исходники, хоть криво и косо написанные, зато до ума доведем! ;)
6. CheBurator 2696 18.07.10 17:26 Сейчас в теме
ну тогда заодно сделал бы ключяи дл яполучения размеров исходного изображения (хотя и штатно можно получить)
7. maxpiter 148 18.07.10 17:32 Сейчас в теме
to CheBurator
не понял че за ключи? чтобы передавать значение имеющегося изображения что ли?
размер исходного изображения получаю внутри программы и в зависимости от того какая сторона больше по той и уменьшаю до заданного размера в ключ3 или ключ4, а вторую сторону пропорционально.

Код в понедельник залью.
9. markers 277 21.07.10 10:55 Сейчас в теме
Всё это конечно замечательно, но к сожалению без танцев с бубном (Точней с COM`ом) запустить внешнее приложение под Сервер 1С низя :( а иногда это бывает очень нужно. + Что тоже тупо нельзя под сервер 1С использовать ВК. :( Тока COM`ы а сами понимаете что 1С не идеальна в плане возможностей... :(
10. maxpiter 148 21.07.10 11:00 Сейчас в теме
(9) а зачем запускать данное приложение под сервер 1С? (хотя оно и должно запуститься)
Подразумевается, что эта ... как ее назвать, "штука", обрабатывает картинку по ключам. Ее можно запустить из 1С или через батник, или еще как хочешь, главное ключи передать.
Тут я немного другую цель преследую, нежели запуски под сервер 1С :)
11. markers 277 21.07.10 11:39 Сейчас в теме
(10) Да я понимаю что другие цели, это просто наболело (крик души) что хотелось бы запускать приложения под сервером 1С, а низя (Ни там батник ни через что-то другое, только через вызов COM объекта VBScript и скармливая скрипт запускающий приложение, и то не нашёл как запустить с ожиданием выполнения) По этому тривиальную задачу запустить распаковку архива и подождать пока распакуется архив (Не обязательно ZIP) под сервером 1С пришлось реализовывать через одно место. Вам в любом случае +
ЗЫ: Под сервером 1С я понимаю регламентное задание выполняемое на сервере 1С
13. maxpiter 148 21.07.10 12:30 Сейчас в теме
(11) по работе с архивами, может поможет:
Работа с zip-архивами с помощью UtilZip.dll. http://infostart.ru/public/20800/

вообще, немного не понятно, что вы имеет ввиду под "сервер 1С" - это в вашем понимании выделенный сервер на котором крутится база 1С или это приложение "сервер 1С" для 8 ?
15. markers 277 21.07.10 13:08 Сейчас в теме
(13) Чистая поддержка Зип есть и внутри 8-ки (вроде и под сервером работает), но мне надо было реализовать автораспаковку заказов клиентов которые могут быть пожаты и в RAR и прочие... Речь о сервере идёт в том ключе что когда 1С 8 работает с БД например MS SQL Server она работает через Сервер 1С и регламентные задания выполняются именно на сервере 1С в котором реализованы не все процедуры и функции что реализованы в клиенте 1С. Что накладывает определённые проблемы.
17. Душелов 4018 21.07.10 14:06 Сейчас в теме
+(15) и внешние компоненты не работают в контексте сервера
20. markers 277 21.07.10 14:38 Сейчас в теме
(17) Да, я писал об этом выше, я вообще не понимаю 1С ну ладно вы в целях безопасности или ещё чего запретили вызов внешних приложений, но зачем использование ВК обламывать? :( Может в тех целях что будут юзать Вкашки и внешние приложения с интерфесом пользователя и ожиданием команды от него, но коли уже программист пишет для сервера 1С я думаю он должен догадыватся что если он будет использовать ВК требующее взаимодействие с пользователем оно просто "повиснет"... Вообщем не понимаю я 1С. Вещь (регламентные задания они придумали классную (Юзаю в доль и попирёк)), но как-то недоработали её... Ах, а чего только бы нельзя было сделать в регламентном!!!! *мечтательно*
18. maxpiter 148 21.07.10 14:13 Сейчас в теме
(15) а такой код там будет работать?
код под 7ку, на 8ке сходу не знаю как написать, но переделать наверно не проблемно.

exe = Создатьобъект("WScript.Shell");
exe.EXEC("calc.exe");
exe=0;

или WScript.Shell тоже относится к ВК?
19. markers 277 21.07.10 14:33 Сейчас в теме
(18) Почти такой код будет работать, но насколько я помню он без ожидания! Т.е. запустил и пошёл в 1С код дальше.... а хотелось бы уж если пользоватся комом с ожиданием выполнения.
21. maxpiter 148 21.07.10 14:38 Сейчас в теме
(19) да, без ожидания, но для конвертации картинки этого будет достаточно.
Можно повесить цикл до 1000 и проверять в нем, не появился ли новый файл.
Если не появится, то можно куда-нибудь послать уведомление, что где-то косяк.

Понимаю что с циклом не красиво, но при небольших количествах изображений, может и подойдет.
22. markers 277 21.07.10 14:43 Сейчас в теме
(21) в таких ситуациях считаю использование ком неоправданным, уж лучше тогда как у меня сделано (тоже криво) стоит программа nnCron которая следит за изменением определённой папки, 1с туда ложит архив и так-же в цикле ждёт, nnCron увидев архив тут же его распоковывает 7zипом (Он поддерживает тучу архивов включая RAR), 1С переодически с задержками смотрит появились ли файлы, если появились перестаёт циклить и начинает их обрабатывать дальше.
23. markers 277 21.07.10 14:45 Сейчас в теме
Продолжение (22), просто в моём случае nnCron используется и так постоянно, следовательно я не буду тратить лишних ресурсов и т.д. на открытие в 1С COM
25. maxpiter 148 21.07.10 14:50 Сейчас в теме
(23) вот с ожиданием завершения

Функция Ждемс()
exe = СоздатьОбъект("WScript.Shell");
exe.Run("calc.exe",1,1);
exe = 0;
Возврат 1;
КонецФункции

Процедура Сформировать()
Сообщить(Ждемс());
КонецПроцедуры
12. markers 277 21.07.10 12:13 Сейчас в теме
Как пример зачем мне эта прога под сервером 1С, у меня в номенклатуру загружаются фотки с сайта нашего, но они большиватые для 1С (много места занимают), делать скриптом автоизменение размеров картинки и складывание в отдельную папку не очень удобно и пр, а так-бы можно было сделать вызов автоизменения размера при загрузке в базу при помощи вашей проги или аналогов.
14. maxpiter 148 21.07.10 12:33 Сейчас в теме
(12) по хорошему, нужно из exe сделать dll и тогда с ней будет намного приятнее работать.
Постараюсь сделать из нее библиотеку и более правильный код.
16. markers 277 21.07.10 13:10 Сейчас в теме
К примеру ЗапуститьПриложение() КомандыСистемы() не реализованы под сервером 1С
24. пользователь 21.07.10 14:50
Сообщение было скрыто модератором.
...
26. maxpiter 148 21.07.10 15:10 Сейчас в теме
а еще лучше вот так, чтобы не завешивать сервер :)


Перем Процесс;

Процедура Сформировать()
exe = СоздатьОбъект("WScript.Shell");
Процесс = exe.Exec("calc.exe");
КонецПроцедуры

Процедура Проверка()
Если Процесс.Status =0 Тогда
Сообщить("Работает");
Иначе
Сообщить("Отработал");
КонецЕсли;
КонецПроцедуры
27. markers 277 26.07.10 10:51 Сейчас в теме
(25, 26) Спасибо за варианты, правда "Перем Процесс;" нельзя использовать в общем модуле, тока в обработках и т.д. Но всё-равно спасибо!
28. maxpiter 148 26.07.10 11:07 Сейчас в теме
(27) ну я же как примеры только, да и на 7ке :)
29. Abadonna 3967 11.08.10 05:48 Сейчас в теме
(0)
если кто-то сделает из нее dll, чтобы она в 1С цеплялась

Присобачил к http://infostart.ru/public/59436/#postform (пост 197)
Изменение размеров в соответствии с выбранным масштабом и изменение качества сжатия
(CompressionQuality)
Ты бы, кстати, у себя тоже приделал:
jpg.CompressionQuality := Q;// от 1 до 100
  jpg.DIBNeeded;
  jpg.Compress;
  jpg.SaveToFile(ВыходнойФайл);

P.S. И, имхо, лучше не задавать отдельно Ширину и Высоту (а то накосячат непропорциональных), а просто масштаб числом
30. maxpiter 148 11.08.10 09:53 Сейчас в теме
(29) здорово
>> P.S. И, имхо, лучше не задавать отдельно Ширину и Высоту (а то накосячат непропорциональных), а просто масштаб числом

при изменении размеров, проверяю, какая сторона больше, то значение и использую, так что, не накосячат :)
31. Abadonna 3967 11.08.10 09:55 Сейчас в теме
(30) Зато с масштабом один параметр убирается, что тоже неплохо ;)
32. maxpiter 148 19.08.10 13:26 Сейчас в теме
Сделал таки DLLку :)
Поручик; Abadonna; +2 Ответить
33. gerasan 23.09.10 12:11 Сейчас в теме
Почему-то DLL-ка в 8-ке выдает сообщение:ImgResize : Access violation at address 0A6333A2 in module 'ImgResize.dll'. Read of address 00000001.
34. maxpiter 148 23.09.10 12:26 Сейчас в теме
(33) Вы все флаги передаете?
Я не делал проверку на неверно переданные параметры.
Скорее всего проблема в этом.
35. gerasan 23.09.10 13:11 Сейчас в теме
Спасибо! Получилось!

Код в итоге такой:
ПутьКФайлам = "D:\111\111\333\";

Картинка = "big.JPG";
НоваяКартинка = "sm.jpg";

ВодянойЗнак = "watermark.png";

ВысотаК = 400;
ШиринаК = 275;

ЗагрузитьВнешнююКомпоненту(ПутьКФайлам + "\"+"ImgResize.dll");

ИМЖ = Новый ("AddIn.ImgResize");
ф1 = ПутьКФайлам + "\" + Картинка;
ф2 = ПутьКФайлам + "\" + НоваяКартинка;
ф3 = ПутьКФайлам + "\" + ВодянойЗнак;
ИМЖ.ПережатьФайл(ф1, ф2, ВысотаК, ШиринаК, ф3);

Проблема была в том, что имя файла водяного знака было с пробелом: ВодянойЗнак = "watermark.png ";
36. anc2002 20.01.12 06:26 Сейчас в теме
Программа взята за основу в обработке картинок на живой базе, помогает при загрузке изображений в базу данных, автору респект
37. maxpiter 148 20.01.12 09:23 Сейчас в теме
(36) и вам спасибо за отзыв :)
38. osavv 08.02.12 15:03 Сейчас в теме
(37) скажите пожалуйста, в какое место картинки вы ставите водный знак?
39. maxpiter 148 08.02.12 15:50 Сейчас в теме
40. osavv 09.02.12 06:17 Сейчас в теме
(39) а как сделать так, чтобы водный знак располагался в правом нижнем углу
41. maxpiter 148 09.02.12 09:31 Сейчас в теме
(40) в данной скомпилированной версии никак.
Исходники на Delphi 7 прилагаются. Там есть закоментированный кусок по установке координат, посмотрите, может получится.
42. osavv 09.02.12 10:12 Сейчас в теме
в каком файле исходники? может в файле JPGResize.zip?
просто при попытке скачать JPGResize.zip - скачивается почему-то ImgResize.zip, в котором лежит библиотека
43. maxpiter 148 09.02.12 11:15 Сейчас в теме
(42) перезалил исходники на dll, странно что они подменились на другой файл. 19.07.10 судя по комментам там все таки исходники были :)
44. pumbaE 09.02.12 11:30 Сейчас в теме
Извините, но правда дороже.
http://www.imagemagick.org/script/ImageMagickObject.php мощный функционал, делай с картинками что хочешь и как хочешь. Также спокойно подключается к 1C.

Труд, то хороший, но при выборе между вашим вариантом с исходниками, с определенным функционалом и imagemagick тоже с исходниками и с еще большим функционалом я бы выбрал imagemagick.

P.s.: не качал но осуждаю :). Извините если, что за резкий тон.
46. maxpiter 148 09.02.12 12:20 Сейчас в теме
(44) вот если бы, вы эту ссылку дали в июле 2010 года, то ничего бы этого не было, потому как никто до вашего коммента, ранее не давал эту ссылку.
также функционал этой публикации использован здесь http://infostart.ru/public/59436/
так что у каждого своя правда :)
осуждения здесь выражаются минусами :)

спасибо за ссылку.
45. osavv 09.02.12 11:54 Сейчас в теме
огромное спасибо!!!
скачалось, буду разбираться
47. pumbaE 09.02.12 13:28 Сейчас в теме
Не посмотрел "дата начала публикации", по правде сказать в 2010 году imagemagick для работы com требовал ручной сборки и только в 2011 они сделали инсталятор...
48. Dima_Mazhor 79 06.06.12 12:54 Сейчас в теме
Потратил последний рубль на скачку exe файла, а надо было ддлку блин)) Сейчас мучаюсь, подскажите пожалуйста допустим батник с таким содержанием JPGResize.exe "1.jpg" "2.jpg" 100 100 "ttt.png" ошибок не выскакивает файл запускается но ничего не делается.
53. maxpiter 148 14.01.13 10:35 Сейчас в теме
(48) попробуйте указать полные пути к файлам. Если конечно еще актуально :)
49. MartyNSK 1 12.01.13 17:56 Сейчас в теме
+, еще бы прозрачность водяного знака добавить)
50. maxpiter 148 12.01.13 18:22 Сейчас в теме
(49) Прозрачность регулируете с помощью файла png :)
51. MartyNSK 1 13.01.13 18:18 Сейчас в теме
(50)=) Это ясно, однако центровка странная, я прозрачность сделал у пнг файла, фона нет, исходное изображение 1024х768, водяной знак тоже 1024х768(нет фона, прозрачность 20), встала на центр левым верхним краем, во вложении тот же логотип, но размер 200х300.
Прикрепленные файлы:
52. maxpiter 148 14.01.13 10:33 Сейчас в теме
(51) файл png не нужно делать размером с исходную картинку.
Я как-то даже не предполагал что такое кто-то будет делать :)
Обычно файл watermark имеет минимально необходимый размер, так как его можно располагать не только по центру но и скажем по синусоиде :) или рандомно по области картинки.
54. 7OH 70 28.09.16 12:41 Сейчас в теме
А без файлов можно сделать ?
Чтобы на клиенте при выводе фоток из базы добавлять watermark.
55. maxpiter 148 04.10.16 21:32 Сейчас в теме
(54) 7OH, добрый день.
В каждом случае это очень индивидуально. В какое ПО вы подключаете dll, каким образом выдаются картинки...
Исходники во вложении. Доработкой этой dll заниматься не планирую.
56. rif-nrr 15 24.09.20 21:27 Сейчас в теме
(55) центровка реально невозможная, расположить в центре водяной знак не получилось... Очень похоже на некую зависимость размеров изображения, размеров знака и размеров выходного файла, но как это работает - непонятно
57. maxpiter 148 05.10.20 10:56 Сейчас в теме
(56) watermark должен быть минимально необходимого размера (скажем 200px*100px)
Картинка к примеру 1024px * 768px

тогда watermark будет расположен 1024/2 - 200/2 по горизонтали и 768/2 - 100/2 по вертикали.

//в центре
            2: begin
              xPNG:=StrToInt(FloatToStrF(newWidth/2-IMGn.Width/2,ffFixed,5,0));
              yPNG:=StrToInt(FloatToStrF(newHeight/2-IMGn.Height/2,ffFixed,5,0));
              bmp.Canvas.Draw(xPNG,yPNG,IMGn.Picture.Graphic);
            end;
Оставьте свое сообщение