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

  • Автор темы Автор темы Radzhab
  • Дата начала Дата начала

Radzhab

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

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


krDpqjNHK848rp.jpg

C#:
Развернуть Свернуть Копировать
using ImageProcessor;
using ImageProcessor.Imaging;
using ImageProcessor.Imaging.Formats;
using System.IO;
using System.Drawing;
1A5bZX4HDgzKrE.jpg

Надеюсь вы дошли до этого пункта) Итак. Что дальше? А дальше нужно написать код. Думаю начать с примера добавления водяного знака.
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();
               }
            }
a2XVWKptwRQVrg.jpg

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

Если эта картинка не говорит ни о чем, тогда идем на 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);
Как всегда буду рад выслушать вопросы, пожелания и адекватную критику)
 
Категория
  1. Полезно
Очень круто, побольше бы народу делилось своими знаниями, еще и безвозмездно. Подскажи, а в сниппете в imageFactory.Load(inStream) , в скобке нужно что то указывать и в остальных скобках? И если да то что, и, если .Resize(350,100) получится картинка 350х100, или не так параметры вставляются?
 
Очень круто, побольше бы народу делилось своими знаниями, еще и безвозмездно. Подскажи, а в сниппете в imageFactory.Load(inStream) , в скобке нужно что то указывать и в остальных скобках? И если да то что, и, если .Resize(350,100) получится картинка 350х100, или не так параметры вставляются?
В коде нужно трогать только параметры изменения, т.е. то что идет после ImageFactory.Load(inStream). По поводу изменения размера и какие параметры принимает метод нужно смотреть или на офиц. сайте, или спросить тут. http://imageprocessor.org/imageprocessor/imagefactory/resize.html вот тут показано про метод Resize
 
  • Спасибо
Реакции: Dmitrybyapple
эх... ей еще рости и рости... до настоящего имаджмеджика... вобще не понятно кто будет ее развивать... уж год точно прошел а новых дополнений как небыло так и нет.
 
  • Спасибо
Реакции: ssXXXss
Спасибо большое за пост. Подскажите пожалуйста как можно залить фон полупрозрачным белым цветом?
 
  • Спасибо
Реакции: Dmitrybyapple
C#:
Развернуть Свернуть Копировать
 ....
    imageFactory.Load(inStream)
                                    .Resize(size)
                                    .Watermark(text)
                                    .Tint(Color.White) // Осветляет фон. 
                                    .Format(format)
                                    .Save(outStream);
...
 
  • Спасибо
Реакции: Dmitrybyapple и smarchenko
Из-за чего может быть?
ZU9niC0Regz2RuX350r8gRvCvzwablpU8swlHO91YpNyHUTHLfF2fAnlD7M23dIwSbnEAotl7LVqY3_YBgWp6Q==
 
Да, конечно. Пути верные
 
Все разобрался походу. У тебя на скрине папка ExternalAssemblies, а написано ExternallAssemblies, я скопировал не глядя )
 
  • Спасибо
Реакции: Radzhab
А может кто нибудь подсказать как рамку делать на картинке (определенного цвета и ширины)
 
данная библиотека не может рисовать рамки. Единственный вариант это через c# сделать эту операцию отдельно на картинке
 
  • Спасибо
Реакции: Dmitrybyapple
Привет, хотел спросить как правильно написать код для overlay http://imageprocessor.org/imageprocessor/imagefactory/overlay/

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

image.Image =
image.Size =
image.Opacity =
image.Position =
 
Последнее редактирование:
Может есть какие нибудь другие способы добавления картинки. Не разбираюсь я что то в этих кодах.
 
Хорошо тогда другой вопрос, а как можно сделать чтоб в разных местах картинки было несколько надписей , и возможно вместо текста вставить другую маленькую картинку.
 
Может есть какие нибудь другие способы добавления картинки. Не разбираюсь я что то в этих кодах.
в следующем билде будет работа с картинками внутри шаблона
 
  • Спасибо
Реакции: speaker
А когда планируется модная обнова?
 
Ждем, ну а сейчас как быть то?
 

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