gifts2017

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

Опубликовал Максим Шуйский (maxpiter) в раздел Программирование - Внешние компоненты

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

Задача:

  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 функционал частично перенесен в http://infostart.ru/public/59436/#postform (197 пост)

UPGRADE:

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

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

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

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

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

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

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

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Евгений Ильяшенков (ЗАК) 16.07.10 14:55
А исходники публиковать не будешь ? :)
2. Максим Шуйский (maxpiter) 16.07.10 15:15
Чтобы исходники выкладывать, надо их причесывать, чтобы не стыдно за них было :)
3. zuza (zuza) 16.07.10 17:24
4. Armando Armando (Armando) 16.07.10 20:14
5. Алексей Роза (DoctorRoza) 18.07.10 10:59
Старина! :) Давай исходники, хоть криво и косо написанные, зато до ума доведем! ;)
6. Сергей (Che) Коцюра (CheBurator) 18.07.10 17:26
ну тогда заодно сделал бы ключяи дл яполучения размеров исходного изображения (хотя и штатно можно получить)
7. Максим Шуйский (maxpiter) 18.07.10 17:32
to CheBurator
не понял че за ключи? чтобы передавать значение имеющегося изображения что ли?
размер исходного изображения получаю внутри программы и в зависимости от того какая сторона больше по той и уменьшаю до заданного размера в ключ3 или ключ4, а вторую сторону пропорционально.

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

вообще, немного не понятно, что вы имеет ввиду под "сервер 1С" - это в вашем понимании выделенный сервер на котором крутится база 1С или это приложение "сервер 1С" для 8 ?
14. Максим Шуйский (maxpiter) 21.07.10 12:33
(12) по хорошему, нужно из exe сделать dll и тогда с ней будет намного приятнее работать.
Постараюсь сделать из нее библиотеку и более правильный код.
15. Александр Цегельников (markers) 21.07.10 13:08
(13) Чистая поддержка Зип есть и внутри 8-ки (вроде и под сервером работает), но мне надо было реализовать автораспаковку заказов клиентов которые могут быть пожаты и в RAR и прочие... Речь о сервере идёт в том ключе что когда 1С 8 работает с БД например MS SQL Server она работает через Сервер 1С и регламентные задания выполняются именно на сервере 1С в котором реализованы не все процедуры и функции что реализованы в клиенте 1С. Что накладывает определённые проблемы.
16. Александр Цегельников (markers) 21.07.10 13:10
К примеру ЗапуститьПриложение() КомандыСистемы() не реализованы под сервером 1С
17. dushelov (Душелов) 21.07.10 14:06
+(15) и внешние компоненты не работают в контексте сервера
18. Максим Шуйский (maxpiter) 21.07.10 14:13
(15) а такой код там будет работать?
код под 7ку, на 8ке сходу не знаю как написать, но переделать наверно не проблемно.

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

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

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

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

Процедура Сформировать()
Сообщить(Ждемс());
КонецПроцедуры
26. Максим Шуйский (maxpiter) 21.07.10 15:10
а еще лучше вот так, чтобы не завешивать сервер :)


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

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

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

при изменении размеров, проверяю, какая сторона больше, то значение и использую, так что, не накосячат :)
31. Аркадий Кучер (Abadonna) 11.08.10 09:55
(30) Зато с масштабом один параметр убирается, что тоже неплохо ;)
32. Максим Шуйский (maxpiter) 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) 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) 20.01.12 09:23
(36) и вам спасибо за отзыв :)
38. Оля Савватеева (osavv) 08.02.12 15:03
(37) maxpiter, скажите пожалуйста, в какое место картинки вы ставите водный знак?
39. Максим Шуйский (maxpiter) 08.02.12 15:50
40. Оля Савватеева (osavv) 09.02.12 06:17
(39) maxpiter, а как сделать так, чтобы водный знак располагался в правом нижнем углу
41. Максим Шуйский (maxpiter) 09.02.12 09:31
(40) в данной скомпилированной версии никак.
Исходники на Delphi 7 прилагаются. Там есть закоментированный кусок по установке координат, посмотрите, может получится.
42. Оля Савватеева (osavv) 09.02.12 10:12
в каком файле исходники? может в файле JPGResize.zip?
просто при попытке скачать JPGResize.zip - скачивается почему-то ImgResize.zip, в котором лежит библиотека
43. Максим Шуйский (maxpiter) 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.: не качал но осуждаю :). Извините если, что за резкий тон.
45. Оля Савватеева (osavv) 09.02.12 11:54
огромное спасибо!!!
скачалось, буду разбираться
46. Максим Шуйский (maxpiter) 09.02.12 12:20
(44) вот если бы, вы эту ссылку дали в июле 2010 года, то ничего бы этого не было, потому как никто до вашего коммента, ранее не давал эту ссылку.
также функционал этой публикации использован здесь http://infostart.ru/public/59436/
так что у каждого своя правда :)
осуждения здесь выражаются минусами :)

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