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

09.02.12

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

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

Скачать файлы

Наименование Файл Версия Размер
JPGResize.exe
.exe 537,50Kb
206
.exe 537,50Kb 206 Скачать
watermark.png
.png 3,85Kb
43
.png 3,85Kb 43 Скачать
ImgResize_Ishodniki
.zip 399,63Kb
64
.zip 399,63Kb 64 Скачать
ImgResize.zip
.zip 300,57Kb
67
.zip 300,57Kb 67 Скачать

Задача:

  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");

См. также

HTTP сервер 1С 7.7 + HTTP асинхронный клиент: внешние компоненты для 1С 7.7

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

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

2000 руб.

27.05.2022    7811    20    13    

31

1С:Фото номенклатуры 7.7 - решение для работы с фотографиями номенклатуры в 1С:7.7 (включая формат PNG)

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

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

5000 руб.

18.10.2022    5160    1    45    

3

Компонента ExchangeStruc (Структура Обмена). Прямой обмен данными между потоками, сессиями и окнами.

Разработка внешних компонент Платформа 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    4799    1    0    

3

Выбор из большого списка (для 1С 7.7)

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

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

1200 руб.

02.12.2021    5777    2    19    

4

Клиент HTTP(S): внешняя компонента для 1С 7.7

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

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

1 стартмани

14.11.2019    18139    88    mdbruyfn    82    

15

Компонента для 1С, принимающая вес с железнодорожных, автомобильных, крановых весов

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

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

26400 руб.

09.04.2019    16062    2    8    

5

Оболочка для работы с последними драйверами ККМ АТОЛ для 1С 7.7, 8.1

Разработка внешних компонент ККМ Кассовые операции Оперативный учет 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    53675    348    asdfghgghjdhg    141    

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

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

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

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

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

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

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

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


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

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

Процедура Проверка()
Если Процесс.Status =0 Тогда
Сообщить("Работает");
Иначе
Сообщить("Отработал");
КонецЕсли;
КонецПроцедуры
27. markers 274 26.07.10 10:51 Сейчас в теме
(25, 26) Спасибо за варианты, правда "Перем Процесс;" нельзя использовать в общем модуле, тока в обработках и т.д. Но всё-равно спасибо!
28. maxpiter 147 26.07.10 11:07 Сейчас в теме
(27) ну я же как примеры только, да и на 7ке :)
29. Abadonna 3958 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 147 11.08.10 09:53 Сейчас в теме
(29) здорово
>> P.S. И, имхо, лучше не задавать отдельно Ширину и Высоту (а то накосячат непропорциональных), а просто масштаб числом

при изменении размеров, проверяю, какая сторона больше, то значение и использую, так что, не накосячат :)
31. Abadonna 3958 11.08.10 09:55 Сейчас в теме
(30) Зато с масштабом один параметр убирается, что тоже неплохо ;)
32. maxpiter 147 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 147 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 147 20.01.12 09:23 Сейчас в теме
(36) и вам спасибо за отзыв :)
38. osavv 08.02.12 15:03 Сейчас в теме
(37) скажите пожалуйста, в какое место картинки вы ставите водный знак?
39. maxpiter 147 08.02.12 15:50 Сейчас в теме
40. osavv 09.02.12 06:17 Сейчас в теме
(39) а как сделать так, чтобы водный знак располагался в правом нижнем углу
41. maxpiter 147 09.02.12 09:31 Сейчас в теме
(40) в данной скомпилированной версии никак.
Исходники на Delphi 7 прилагаются. Там есть закоментированный кусок по установке координат, посмотрите, может получится.
42. osavv 09.02.12 10:12 Сейчас в теме
в каком файле исходники? может в файле JPGResize.zip?
просто при попытке скачать JPGResize.zip - скачивается почему-то ImgResize.zip, в котором лежит библиотека
43. maxpiter 147 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 147 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 71 06.06.12 12:54 Сейчас в теме
Потратил последний рубль на скачку exe файла, а надо было ддлку блин)) Сейчас мучаюсь, подскажите пожалуйста допустим батник с таким содержанием JPGResize.exe "1.jpg" "2.jpg" 100 100 "ttt.png" ошибок не выскакивает файл запускается но ничего не делается.
53. maxpiter 147 14.01.13 10:35 Сейчас в теме
(48) попробуйте указать полные пути к файлам. Если конечно еще актуально :)
49. MartyNSK 1 12.01.13 17:56 Сейчас в теме
+, еще бы прозрачность водяного знака добавить)
50. maxpiter 147 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 147 14.01.13 10:33 Сейчас в теме
(51) файл png не нужно делать размером с исходную картинку.
Я как-то даже не предполагал что такое кто-то будет делать :)
Обычно файл watermark имеет минимально необходимый размер, так как его можно располагать не только по центру но и скажем по синусоиде :) или рандомно по области картинки.
54. 7OH 69 28.09.16 12:41 Сейчас в теме
А без файлов можно сделать ?
Чтобы на клиенте при выводе фоток из базы добавлять watermark.
55. maxpiter 147 04.10.16 21:32 Сейчас в теме
(54) 7OH, добрый день.
В каждом случае это очень индивидуально. В какое ПО вы подключаете dll, каким образом выдаются картинки...
Исходники во вложении. Доработкой этой dll заниматься не планирую.
56. rif-nrr 14 24.09.20 21:27 Сейчас в теме
(55) центровка реально невозможная, расположить в центре водяной знак не получилось... Очень похоже на некую зависимость размеров изображения, размеров знака и размеров выходного файла, но как это работает - непонятно
57. maxpiter 147 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;
Оставьте свое сообщение