ZennoPoster И работа с изображениями (watermark и прочие ништяки)

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 268
Баллы
113
Доброе время суток, форумчане. Давно не писал статьи. Сегодня, да и еще раньше постоянно встречаются на форуме вопросы типа - как добавить watermark (водяной знак), как добавить фильтр чтобы авито не палил и пр. И каждый раз их отправляют на ... imagemagick. Признаю что софт обладает большими возможностями, но простые пользователи как мы не пользуются 90 процентами возможностей этого софта. Еще один плюс данной темы что не придется долбиться с этой командной строкой, с подбором параметров и прочее. Будет c# код, который сможет каждый отредактировать под свои нужды.
Итак, начнем.

Перво-наперво качаем библиотеку по ссылке https://cloud.mail.ru/public/2b1e65807b86/ImageProcessor.dll . Сразу скомпилировал в dll-библиотеку дабы не возникало вопросов. Вот ссылка для продвинутых https://github.com/JimBobSquarePants/ImageProcessor
Копируем библиотеку в папку ExternallAssemblies. Если ее нет - то создаем.



C#:
using ImageProcessor;
using ImageProcessor.Imaging;
using ImageProcessor.Imaging.Formats;
using System.IO;
using System.Drawing;

Надеюсь вы дошли до этого пункта) Итак. Что дальше? А дальше нужно написать код. Думаю начать с примера добавления водяного знака.
C#:
var path = @"D:\123.jpeg"; // Наш исходный файл
var pathrez = @"D:\1232_new.jpeg"; // Файл куда будем сохранять
FileStream fs = File.OpenWrite(pathrez); //  для записи
byte[] photoBytes = File.ReadAllBytes(path); // для чтения

ISupportedImageFormat format = new JpegFormat { Quality = 100 }; // Устанавливаем качество фото на выходе

Size size = new Size(500, 500); // Это размер фото на выходе
         
TextLayer text = new TextLayer(); // Создаем экземпляр класса

text.FontColor = Color.Blue; // Цвет шрифта синий
text.FontColor = Color.FromArgb(100, 100, 100); // Это тоже цвет, только в RGB
          
text.FontFamily = new FontFamily("Arial"); // Тип шрифта
text.FontSize = 20; // Размер шрифта
text.DropShadow = true; // Тень
text.Opacity = 30; // Непрозрачность
text.Style = FontStyle.Bold; //Жирный шрифт
text.Text = "ZennoPoster"; // Ну и сам текст
text.Position = new Point(100,100); // Координаты вставки водяного знака
          
using (MemoryStream inStream = new MemoryStream(photoBytes))
            {
                using (MemoryStream outStream = new MemoryStream())
                {
                 
                    using (ImageFactory imageFactory = new ImageFactory(preserveExifData:true))
                    {
                        // Load, resize, set the format and quality and save an image.
                        imageFactory.Load(inStream)  // грузим картинку
                                    .Resize(size)    // меняем размер (500 на 500 см. выше)
                                    .Watermark(text) // добавляем водяной знак
                                    .Format(format)  // выбираем формат картинки, т.е jpeg(jpg)
                                    .Save(outStream); // сохраняем в поток
                        //outStream.CopyTo(inStream);
                        outStream.WriteTo(fs); // записываем в файл
                        outStream.Close();     // не забываем закрывать потоки ввода-вывода
                    }
                    inStream.Close(); // не забываем закрывать потоки ввода-вывода
                    fs.Close();
               }
            }

Вуаля) Размер изменили, водяной знак добавили. Все гут. Возникает вопрос - почему у нас черные рамки. Да потому что картинка изначально 1024*768, а мы ей придаем размера 500*500. Т.е. картинка становится квадратной за счет черных рамок) Надеюсь ясно выразил мысль. Еще один момент. Как вообще узнать координаты вставки картинки. Как они берутся вообще?

Если эта картинка не говорит ни о чем, тогда идем на msdn и читаем) https://msdn.microsoft.com/ru-ru/library/aa1hw2kk(v=vs.110).aspx

Также чтобы узнать все возможности библиотеки идем по ссылке http://imageprocessor.org/imageprocessor/imagefactory/index.html и смотрим пункт Methods. Там показаны все ништяки которые может делать либа.
Друзья! Не бойтесь того кода который расположен выше. Для того чтобы добавить туда например фильтр какой-нить или параметр нужно просто добавить его через точку

C#:
....
imageFactory.Load(inStream)
                    .Resize(size)
                    .Watermark(text)
                    .Rotate(50)     // Поворачивает на 50 градусов
                    .Contrast(100)  // Контрасность
                    .Brightness(50) // Яркость
                    .Saturation(10) // Насыщенность
                    .Format(format)
                    .Save(outStream);
Как всегда буду рад выслушать вопросы, пожелания и адекватную критику)
 
Категория
Полезно

Для запуска проектов требуется программа ZennoPoster.
Это основное приложение, предназначенное для выполнения автоматизированных шаблонов действий (ботов).
Подробнее...

Для того чтобы запустить шаблон, откройте программу ZennoPoster. Нажмите кнопку «Добавить», и выберите файл проекта, который хотите запустить.
Подробнее о том, где и как выполняется проект.

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 268
Баллы
113
ЗАбыл название темы написать) Думаю админы поправят мою оплошность
 
  • Спасибо
Реакции: Dmitrybyapple и Roman*

Roman*

Client
Регистрация
25.09.2013
Сообщения
1 657
Благодарностей
656
Баллы
113
Очень круто, побольше бы народу делилось своими знаниями, еще и безвозмездно. Подскажи, а в сниппете в imageFactory.Load(inStream) , в скобке нужно что то указывать и в остальных скобках? И если да то что, и, если .Resize(350,100) получится картинка 350х100, или не так параметры вставляются?
 

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 268
Баллы
113
Очень круто, побольше бы народу делилось своими знаниями, еще и безвозмездно. Подскажи, а в сниппете в imageFactory.Load(inStream) , в скобке нужно что то указывать и в остальных скобках? И если да то что, и, если .Resize(350,100) получится картинка 350х100, или не так параметры вставляются?
В коде нужно трогать только параметры изменения, т.е. то что идет после ImageFactory.Load(inStream). По поводу изменения размера и какие параметры принимает метод нужно смотреть или на офиц. сайте, или спросить тут. http://imageprocessor.org/imageprocessor/imagefactory/resize.html вот тут показано про метод Resize
 
  • Спасибо
Реакции: Dmitrybyapple

LexxWork

Client
Регистрация
31.10.2013
Сообщения
1 190
Благодарностей
791
Баллы
113
эх... ей еще рости и рости... до настоящего имаджмеджика... вобще не понятно кто будет ее развивать... уж год точно прошел а новых дополнений как небыло так и нет.
 
  • Спасибо
Реакции: ssXXXss

smarchenko

Client
Регистрация
18.01.2014
Сообщения
141
Благодарностей
8
Баллы
18
Спасибо большое за пост. Подскажите пожалуйста как можно залить фон полупрозрачным белым цветом?
 

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 268
Баллы
113
  • Спасибо
Реакции: Dmitrybyapple

smarchenko

Client
Регистрация
18.01.2014
Сообщения
141
Благодарностей
8
Баллы
18

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 268
Баллы
113
C#:
 ....
    imageFactory.Load(inStream)
                                    .Resize(size)
                                    .Watermark(text)
                                    .Tint(Color.White) // Осветляет фон. 
                                    .Format(format)
                                    .Save(outStream);
...
 
  • Спасибо
Реакции: Dmitrybyapple и smarchenko

Jerard

Client
Регистрация
11.04.2013
Сообщения
506
Благодарностей
225
Баллы
43
Из-за чего может быть?
 

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 268
Баллы
113
хм. Директорию создал? Библиотеку подключил?
 
  • Спасибо
Реакции: Dmitrybyapple

Jerard

Client
Регистрация
11.04.2013
Сообщения
506
Благодарностей
225
Баллы
43
Да, конечно. Пути верные
 

Jerard

Client
Регистрация
11.04.2013
Сообщения
506
Благодарностей
225
Баллы
43
Все разобрался походу. У тебя на скрине папка ExternalAssemblies, а написано ExternallAssemblies, я скопировал не глядя )
 
  • Спасибо
Реакции: Radzhab

smarchenko

Client
Регистрация
18.01.2014
Сообщения
141
Благодарностей
8
Баллы
18

Jerard

Client
Регистрация
11.04.2013
Сообщения
506
Благодарностей
225
Баллы
43

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 268
Баллы
113
 
  • Спасибо
Реакции: Dmitrybyapple

opaopa

Client
Регистрация
27.09.2014
Сообщения
41
Благодарностей
7
Баллы
18

PostCard

Client
Регистрация
22.02.2015
Сообщения
22
Благодарностей
4
Баллы
3
А может кто нибудь подсказать как рамку делать на картинке (определенного цвета и ширины)
 

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 268
Баллы
113
данная библиотека не может рисовать рамки. Единственный вариант это через c# сделать эту операцию отдельно на картинке
 
  • Спасибо
Реакции: Dmitrybyapple

daymos

Client
Регистрация
11.11.2009
Сообщения
806
Благодарностей
240
Баллы
43
а как сделать ресайз на 5% по ширине, например?
 

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 268
Баллы
113
Задать размеры Size size =new Size(высота, ширина);
Надеюсь не стоит объяснять как посчитать 5 процентов от ширины)))
 
  • Спасибо
Реакции: Dmitrybyapple

daymos

Client
Регистрация
11.11.2009
Сообщения
806
Благодарностей
240
Баллы
43
думал может просто вписать проценты можно)
 

speaker

Client
Регистрация
13.10.2012
Сообщения
287
Благодарностей
45
Баллы
28
Привет, хотел спросить как правильно написать код для overlay http://imageprocessor.org/imageprocessor/imagefactory/overlay/

Что то типа того, правда не понятно что с этим делать
imageLayer image = new imageLayer(); // Создаем экземпляр класса

image.Image =
image.Size =
image.Opacity =
image.Position =
 
Последнее редактирование:

speaker

Client
Регистрация
13.10.2012
Сообщения
287
Благодарностей
45
Баллы
28
Может есть какие нибудь другие способы добавления картинки. Не разбираюсь я что то в этих кодах.
 

speaker

Client
Регистрация
13.10.2012
Сообщения
287
Благодарностей
45
Баллы
28
Хорошо тогда другой вопрос, а как можно сделать чтоб в разных местах картинки было несколько надписей , и возможно вместо текста вставить другую маленькую картинку.
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 715
Баллы
113
Может есть какие нибудь другие способы добавления картинки. Не разбираюсь я что то в этих кодах.
в следующем билде будет работа с картинками внутри шаблона
 
  • Спасибо
Реакции: speaker

speaker

Client
Регистрация
13.10.2012
Сообщения
287
Благодарностей
45
Баллы
28
А когда планируется модная обнова?
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 715
Баллы
113

speaker

Client
Регистрация
13.10.2012
Сообщения
287
Благодарностей
45
Баллы
28
Ждем, ну а сейчас как быть то?
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 715
Баллы
113

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)