1 место Библиотека Magick.NET C# (Image Magick), работа с изображениями, и другие полезняшки.

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 768
Благодарностей
1 437
Баллы
113
45658


Общая информация

ImageMagick - это мощная библиотека для работы с изображениями, которая поддерживает более 100 основных форматов файлов (не включая подформаты). С Magick.NET вы можете использовать ImageMagick в своем приложении C # / VB.NET / .NET Core, не устанавливая ImageMagick на свой сервер или компьютер.

Библиотека Magick.NET имеет отличие в x86 или x64 разрядности.

45661


Какую скачать Q8, Q16 или Q16-HDRI?

Версия Q8 является рекомендуемой версией. Версии с Q8 в названии имеют компонент 8 бит на пиксель (например, 8-битный красный, 8-битный зеленый и т. д.). Тогда как Q16 - компонент 16 бит на пиксель. Версия Q16 позволяет вам читать или записывать 16-битные изображения без потери точности, но требует вдвое больше ресурсов, чем версия Q8. Версия Q16-HDRI использует вдвое больше памяти, чем Q16. Он более точен, потому что использует плавающую точку (32-битный компонент) и допускает пиксели вне границ (меньше 0 и больше 65535). Если вам нужно читать / записывать изображения лучшего качества, используйте вместо этого версию Q16.

AnyCPU

Версия Magick.NET для AnyCPU позволяет использовать ваше приложение в 32-разрядной или 64-разрядной среде. Когда используется один из классов в библиотеке, он обнаружит, является ли пул приложений 32- или 64-разрядным. Затем он будет читать версию dll для x86 или x64 из встроенного ресурса. Этот ресурс записывается во временный каталог для улучшения времени запуска при следующем его использовании.

Для себя я выбрал Magick.NET-Q8-AnyCPU.dll так же пробовал Magick.NET-Q16-AnyCPU.dll все отлично работает. :ay:
Заметил единственный недостаток, при первом запуске, код обрабатывается пару секунд, потом все выполняется мгновенно за доли секунды, думаю это связано с тем, что в начале идет определение x86 или x64 системы. Вы же можете попробовать другие варианты, на ваш выбор.

Подключение библиотеки Magick.NET

Тут не чего сложного, все как всегда, а для тех кто не в курсе, как подключить, читаем ниже:

1. Скопируйте скаченную библиотеку в папку ExternalAssemblies которая находится:

Код:
C:\Program Files\ZennoLab\RU\ZennoPoster Pro\5.39.0.0\Progs\ExternalAssemblies
2. В своем проекте, внизу где списки, таблицы, жмем + и выбираем добавить ссылки из GAC

45773


В появившемся окошке жмем добавить:

45774


Далее жмем обзор:

45775


Переходим в папку ExternalAssemblies и выбираем библиотеку в данном случае Magick.NET-Q8-AnyCPU.dll и жмем открыть.

45776



После добавления, в окне ссылки из GAC появится библиотека

45777



3. Теперь осталось подключить директивы using.

В своем проекте, внизу где списки, таблицы, жмем + и выбираем добавить директивы using и общий код

45778


В открывшимся окне переходим во вкладку Директивы Using и в поле ниже вставляем, и закрываем это окно.

C#:
using ImageMagick;
using ImageMagick.Configuration;
using ImageMagick.Defines;
using ImageMagick.ImageOptimizers;
45780



Если вы все делали по шагово, так как тут описано, значит вы правильно подключили библиотеку Magick.NET с чем я вас и поздравляю)
 
Тема статьи
Нестандартные хаки
Номер конкурса статей
Двенадцатый конкурс статей

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

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

Последнее редактирование:

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 768
Благодарностей
1 437
Баллы
113
Теория, обзор и примеры методов (фильтров) I
В библиотеке Magick.NET я насчитал более 50 методов для работы с изображениями, давайте более подробно рассмотрим некоторые из их:

1. AutoGamma - Авто Гамма

Данный метод принимает следующие параметры:

45787


45789


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.AutoGamma();
       image.Write(SaveImagePath);
}

45790
45791




2. BitDepth - Бит глубина

Данный метод принимает следующие параметры:

45792


45793


45794


45795


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.BitDepth(2);
       image.Write(SaveImagePath);
}

45796
45797




3. BlueShift - Синее смещение

Данный метод принимает следующие параметры:

45798


45799


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
    image.BlueShift(1);
    image.Write(SaveImagePath);
}

45800
45801




4. Blur - Расплывшиеся очертания

Данный метод принимает следующие параметры:

45781


45782


45783


45784


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.Blur(3, 5);
       image.Write(SaveImagePath);
}

45785
45786



5. CannyEdge - Осторожный край

Данный метод принимает следующие параметры:

45802


45803


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.CannyEdge(1.0, 3.0, new Percentage(4), new Percentage(4));
       image.Write(SaveImagePath);
}

45804
45805




6. Charcoal - Древесный уголь

Данный метод принимает следующие параметры:

45806


45807


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.Charcoal(1, 3);
       image.Write(SaveImagePath);
}

45808
45809




7. ContrastStretch - Контраст Стретч

Данный метод принимает следующие параметры:

45810


45811


45812


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
    image.ContrastStretch(new Percentage(10));
    image.Write(SaveImagePath);
}

45813
45814




8. CycleColormap - Цикл Цветовая карта

Данный метод принимает следующие параметры:

45815


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.CycleColormap(5);
       image.Write(SaveImagePath);
}

45816
45817




9. Edge - Край

Данный метод принимает следующие параметры:

45819


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
    image.Edge(2);
    image.Write(SaveImagePath);
}

45820
45821




10. Emboss - Выбивать

Данный метод принимает следующие параметры:

45822


45823


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.Emboss(1, 2);
       image.Write(SaveImagePath);
}

45824
45825




11. Equalize - Выровнять

Данный метод не принимает параметров:

45826


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.Equalize();
       image.Write(SaveImagePath);
}

45827
45828




12. FloodFill - Заливка

Данный метод принимает следующие параметры:

45829


45830


45831


45832


45833


45834


45835


45836


45837


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
    image.FloodFill(MagickColors.Green, 50, 70);
    image.Write(SaveImagePath);
}

45839
45840




13. Flop - Провал (Зеркальное отображение)

Данный метод не принимает параметров:

45841


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.Flop();
       image.Write(SaveImagePath);
}

45842
45843




14. GammaCorrect - Гамма Коррект

Данный метод принимает следующие параметры:

45844


45845


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.GammaCorrect(3);
       image.Write(SaveImagePath);
}

45846
45847




15. GaussianBlur - Гауссово размытие

Данный метод принимает следующие параметры:

45848


45849


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.GaussianBlur(3, 6);
       image.Write(SaveImagePath);
}

45850
45851




16. Grayscale - Оттенки серого

Данный метод принимает следующие параметры:

45852


45853


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.Grayscale();
       image.Write(SaveImagePath);
}

45854
45855




17. LocalContrast - Местный контраст

Данный метод принимает следующие параметры:

45857


45858


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.LocalContrast(3, new Percentage(15));
       image.Write(SaveImagePath);
}

45859
45860




18. MedianFilter - Медианный фильтр

Данный метод принимает следующие параметры:

45861


45862


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.MedianFilter(5);
       image.Write(SaveImagePath);
}

45863
45864




19. Modulate - Модуляция

Данный метод принимает следующие параметры:

45865


45866


45867


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.Modulate(new Percentage(25));
       image.Write(SaveImagePath);
}

45868
45869




20. MotionBlur - Размытость

Данный метод принимает следующие параметры:

45870


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.MotionBlur(2.2, 3.5, 2.4);
       image.Write(SaveImagePath);
}

45871
45872




21. Negate - Отрицание (инвертирование)

Данный метод принимает следующие параметры:

45873


45874


45875


45876


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.Negate();
       image.Write(SaveImagePath);
}

45877
45878




22. Normalize - Нормализовать

Данный метод не принимает параметров:

45879


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.Normalize();
       image.Write(SaveImagePath);
}

45880
45881



Смотрите продолжение во второй части...
 
Последнее редактирование:

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 768
Благодарностей
1 437
Баллы
113
Теория, обзор и примеры методов (фильтров) II
23. OilPaint - Масляная краска

Данный метод принимает следующие параметры:

45887


45888


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.OilPaint(1.5, 2.2);
       image.Write(SaveImagePath);
}

45889
45890



24. Opaque - Непрозрачный (замена цвета RGB)

Данный метод принимает следующие параметры:

45891


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.Opaque(MagickColor.FromRgb(255, 255, 255), MagickColor.FromRgb(0, 255, 0));
       image.Write(SaveImagePath);
}

45892
45893



25. Posterize - Постеризовать

Данный метод принимает следующие параметры:

45894


45895


45896


45897


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.Posterize(3);
       image.Write(SaveImagePath);
}

45898
45899




26. ReduceNoise - Снизить уровень шума

Данный метод принимает следующие параметры:

45900


45901


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.ReduceNoise(5);
       image.Write(SaveImagePath);
}

45902
45903




27. Resample - Повторно образец

Данный метод принимает следующие параметры:

45904


45905


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.Resample(22, 22);
       image.Write(SaveImagePath);
}

45907
45908




28. Resize - Изменение размера

Данный метод принимает следующие параметры:

45910


45911


45912


45913


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.Resize(225, 150);
       image.Write(SaveImagePath);
}

45916
45917



А еще можно задать прямой размер изображению, используя код:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
MagickGeometry size = new MagickGeometry(290, 204); // желаемый размер изображения
                             size.IgnoreAspectRatio = true;
                             image.Resize(size);
                             image.Write(SaveImagePath);
}
или так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.Resize(new ImageMagick.MagickGeometry("200x75!")); // задать прямой размер картинке
       image.Write(SaveImagePath);
}


29. Rotate - Поворот

Данный метод принимает следующие параметры:

45919


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.Rotate(90);
       image.Write(SaveImagePath);
}

45921
45922




30. Sample - Образец

Данный метод принимает следующие параметры:

45923


45924


45925


45927


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.Sample(100, 40);
       image.Write(SaveImagePath);
}
45934
45935


Так же можно увеличить изображение в n - раз, используя код ниже:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
      image.Sample(new ImageMagick.Percentage(200)); // увеличить размер картинки в процентах, 200 это в 2 раза, 1000 это в 10 раз
       image.Write(SaveImagePath);
}


31. Scale - Масштаб

Данный метод принимает следующие параметры:

45936


45937


45938


45939


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.Scale(500, 325);
       image.Write(SaveImagePath);
}

45941
45942




32. SelectiveBlur - Выборочное размытие

Данный метод принимает следующие параметры:

45943


45944


45945


45947


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.SelectiveBlur(3, 7, new Percentage(75));
       image.Write(SaveImagePath);
}

45951
45952




33. SepiaTone - Сепия тон

Данный метод принимает следующие параметры:

45956


45957


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.SepiaTone(new Percentage(80));
       image.Write(SaveImagePath);
}

45959
45960




34. Shade - Тень

Данный метод принимает следующие параметры:

45961


45962


45963


45964


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.Shade(25, 25);
       image.Write(SaveImagePath);
}

45965
45966




35. Sharpen - Резкость

Данный метод принимает следующие параметры:

45967


45968


45969


45970


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.Sharpen(5, 5);
       image.Write(SaveImagePath);
}

45973
45974




36. Shave - Бритье

Данный метод принимает следующие параметры:

45975


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.Shave(3, 15);
       image.Write(SaveImagePath);
}

45976
45977




37. Shear - Cдвиг

Данный метод принимает следующие параметры:

45978


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.Shear(3, 15);
       image.Write(SaveImagePath);
}

45980
45981




38. SigmoidalContrast - Сигмоидальный контраст

Данный метод принимает следующие параметры:

45983


45984


45985


45986


45987


45988


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.SigmoidalContrast(10);
       image.Write(SaveImagePath);
}

45989
45990




39. Sketch - Эскиз

Данный метод принимает следующие параметры:

45991


45992


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.Sketch(5, 7, 15);
       image.Write(SaveImagePath);
}

45994
45995




40. Solarize - Передержка

Данный метод принимает следующие параметры:

45996


45997


45998


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.Solarize(new Percentage(50));
       image.Write(SaveImagePath);
}

45999
46000



Смотрите продолжение в третьей части...
 
Последнее редактирование:

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 768
Благодарностей
1 437
Баллы
113
Теория, обзор и примеры методов (фильтров) III
41. Spread - Размазывать

Данный метод принимает следующие параметры:

46003


46004


46005


Пользоваться так:


C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.Spread(3);
       image.Write(SaveImagePath);
}

46006
46007




42. Statistic - Cтатистика

Данный метод принимает следующие параметры:

46008


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.Statistic(StatisticType.Minimum, 2, 5);
       image.Write(SaveImagePath);
}

46010
46011




43. Swirl - Водоворот

Данный метод принимает следующие параметры:

46012


46013


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.Swirl(80);
       image.Write(SaveImagePath);
}

46015
46016




44. Threshold - Порог

Данный метод принимает следующие параметры:

46018


46019


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.Threshold(new Percentage(70));
       image.Write(SaveImagePath);
}

46020
46021




45. Thumbnail - Что-либо размером с ноготь

Данный метод принимает следующие параметры:

46022


46023


46024


46025


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.Thumbnail(new Percentage(10), new Percentage(10));
       image.Write(SaveImagePath);
}

46026
46027




46. Transpose - Транспонирование

Данный метод не принимает параметров:

46028


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.Transpose();
       image.Write(SaveImagePath);
}

46029
46030




47. Transverse - Поперечный

Данный метод не принимает параметров:

46032


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.Transverse();
       image.Write(SaveImagePath);
}

46033
46034




48. Trim + ColorFuzz / Подравнивание + Цветной пух

Данный метод принимает следующие параметры:

46035


46036


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.ColorFuzz = new Percentage(10);
       image.Trim();
       image.Write(SaveImagePath);
}

46039
46040




49. UnsharpMask - Нерезкая маска

Данный метод принимает следующие параметры:

46041


46042


46043


46044


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.UnsharpMask(1, 3);
       image.Write(SaveImagePath);
}

46045
46046




50. WaveletDenoise - Вейвлет Денуаз

Данный метод принимает следующие параметры:

46049


46050


46051


46053


Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.WaveletDenoise(new Percentage(95), 15);
       image.Write(SaveImagePath);
}

46060
46061




51. Monochrome - монохром

Пользоваться так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
    image.Format = MagickFormat.Png;
    image.ColorType = ColorType.Bilevel;
    image.Write(SaveImagePath);
}

46067
46068
 
Последнее редактирование:

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 768
Благодарностей
1 437
Баллы
113
Практика (полезняшки)

Изображение в виде кнопки

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
    using (MagickImage copyImg = new MagickImage(image.Clone())){
          copyImg.Colorize(MagickColors.Gray, new Percentage(100));
          copyImg.Raise(5);
          copyImg.Normalize();
          copyImg.Blur(0, 5);
       image.Compose = CompositeOperator.HardLight;
       image.Composite(copyImg, CompositeOperator.Modulate);
       image.Write(SaveImagePath);
    }
}

46120
46121


46122
46123


46124
46125




Круглое изображение

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
image.Format = MagickFormat.Png;
image.Alpha(AlphaOption.Set);
    using (MagickImage copy = new MagickImage(image.Clone())){
       copy.Distort(DistortMethod.DePolar, 0);
       copy.VirtualPixelMethod = VirtualPixelMethod.HorizontalTile;
       copy.BackgroundColor = MagickColors.None;
       copy.Distort(DistortMethod.Polar, 0);
            image.Compose = CompositeOperator.DstIn;
            image.Composite(copy, CompositeOperator.CopyAlpha);
            image.Write(SaveImagePath);
    }
}

46114
46115


46116
46117


46118
46119




Мягкие края, круглого, овального изображения

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
image.Format = MagickFormat.Png;
image.Alpha(AlphaOption.Set);
    using (MagickImage copy = new MagickImage(image.Clone())){
       copy.BackgroundColor = MagickColors.None;
       copy.Vignette(0,4,0,0);
            image.Composite(copy, CompositeOperator.CopyAlpha);
            image.Write(SaveImagePath);
    }
}

46126
46127


46128
46129


46136
46137




Заменить белый фон на прозрачный

C#:
string InputImagePath = project.Variables["InputImagePath"].Value;  // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
    image.Format = MagickFormat.Png;
    image.Alpha(AlphaOption.Set);
    image.ColorFuzz = new Percentage(10);
    image.Opaque(MagickColors.White, MagickColor.FromRgba(0, 0, 0, 0));
    image.Write(SaveImagePath);
}

46479
46480




Наложение водяного знака на изображение

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string WatermarkImagePath =  project.Variables["WatermarkImagePath"].Value; // В переменной WatermarkImagePath указать путь к изображению которое нужно наложить
string SaveImagePath =  project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
    using (MagickImage watermark = new MagickImage(WatermarkImagePath)){
        image.Composite(watermark, Gravity.Southeast, CompositeOperator.Over);
        watermark.Evaluate(Channels.Alpha, EvaluateOperator.Divide, 5);
        image.Composite(watermark, 50, 50, CompositeOperator.Over);
        image.Write(SaveImagePath);
    }
}
В переменной InputImagePath указать путь к изображению

46173


В переменной WatermarkImagePath указать путь к изображению которое нужно наложить

46175


В переменной SaveImagePath указать путь куда сохраняем обработанное изображение

46176


в коде можно выбрать место расположение водяного знака на изображении, ставим точку, всплывет окошечко, выбираем.

46177


Так же в 7-й строке, показано на скриншоте выше, можно регулировать прозрачность, на данный момент она 5. Еще можно в 8 - й строке менять параметры 50, 50, тем самым регулируем расположение прозрачного знака на изображении.



Свой текст на изображении

C#:
string InputImagePath = project.Variables["InputImagePath"].Value;
string SaveImagePath = project.Variables["SaveImagePath"].Value;
using (MagickImage image = new MagickImage(InputImagePath)){
     MagickReadSettings readSettings = new MagickReadSettings{
        FillColor = MagickColors.Blue, // цвет текста
        BackgroundColor = MagickColors.Transparent, // фон текста
        Font = "Arial", // Шрифт текста (только те, что установлены в Windows)
        Width = 350, // Ширина текста
        Height = 48 }; // Высота текста
    image.Alpha(AlphaOption.Opaque);
    using (MagickImage label = new MagickImage("label:Тут какой то текст", readSettings)){
        image.Composite(label, 200, 100, CompositeOperator.Over); // расположение текста на картинке 200 слева, 100 сверху
        image.Write(SaveImagePath);
    }
}

46527




Сравниваем два изображения и получаем разницу

C#:
string FirstImagePath = project.Variables["FirstImagePath"].Value; // В переменной FirstImagePath указать путь к первому изображению
string SecondImagePath = project.Variables["SecondImagePath"].Value; // В переменной SecondImagePath указать путь ко второму изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage firstImage = new MagickImage(FirstImagePath)){
    using (MagickImage secondImage = new MagickImage(SecondImagePath)){
        using (MagickImage resultImage = new MagickImage()){
            CompareSettings compareSettings = new CompareSettings(){
                HighlightColor = MagickColors.Red,
                LowlightColor = MagickColors.White,
                Metric = ErrorMetric.Absolute };
          firstImage.ColorFuzz = new Percentage(5);
          firstImage.Compare(secondImage, compareSettings, resultImage);
          resultImage.Write(SaveImagePath);
        }
    }
}
В переменной FirstImagePath указать путь к первому изображению

46180



В переменной SecondImagePath указать путь ко второму изображению

46181



В переменной SaveImagePath указать путь куда сохраняем обработанное изображение. В результате нам показывает то, чего нету на втором изображении, то есть разницу)

46182




Картинку в Base64

Это может быть полезно при работе с капчами, чтоб изображение не сохранять на диск после обработки фильтрами, а сразу конвертировать в base64, и отправить на кап монстр :-)

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
using (MagickImage image = new MagickImage(InputImagePath)){
    string Base64 = image.ToBase64();
    project.Variables["Base64"].Value =  Base64;
}
В переменной InputImagePath указать путь к изображению

46199



46202




Информация о картинке (формат, размер, битность, цветность)

Кодом ниже, можно получить краткую информацию о изображении

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
using (MagickImage image = new MagickImage(InputImagePath)){
    project.Variables["InfoImage"].Value = image.ToString();
}
В переменной InputImagePath указать путь к изображению

46206


46208




Получить файл с координатами и цветом пикселей

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveFilePath = project.Variables["SaveFilePath"].Value; // В переменной SaveFilePath указать путь к файлу, с его названием  и он будет создан сам
using (MagickImage image = new MagickImage(InputImagePath)){
       image.Write(SaveFilePath);
}

46211


В файлике мы увидим следующее: общее количество пикселей, которое на изображении, и информацию про каждый пиксель, его координаты расположения на изображении и цвет

46212




Формат .jpg в формат .png

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению с форматом .jpg
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение с форматом .png
using (MagickImage image = new MagickImage(InputImagePath)){
       image.Scale(new Percentage(100)); // качество изображения в процентах
       image.Write(SaveImagePath);
}


Получить размер изображения

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
using (MagickImage image = new MagickImage(InputImagePath)){
    int Width = image.Width;
    int Height = image.Height;
    project.Variables["Size"].Value = Width.ToString() + "x" + Height.ToString();
}
В переменной Size появится размер изображения.




Доминирующий цвет на изображении

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
using (MagickImage image = new MagickImage(InputImagePath)){
   Dictionary<MagickColor, int> dict = image.Histogram();
             var keyOfMaxValue = dict.Aggregate((x, y) => x.Value > y.Value ? x : y).Key;
                 Color c = keyOfMaxValue.ToColor();
             string hex = "#" + c.R.ToString("X2") + c.G.ToString("X2") + c.B.ToString("X2");
             string rgb =  c.R.ToString() + ", " + c.G.ToString() + ", " + c.B.ToString();
    project.Variables["HexColor"].Value = hex;
    project.Variables["ColorRGB"].Value = rgb;
    project.SendInfoToLog("", "ColorRGB: " + rgb + " -  HexColor: " + hex, true);
}
Получим доминирующий цвет этого изображения

46218


В переменной HexColor появится значение цвета в hex, а в переменной ColorRGB появится значение цвета в rgb

46219


посмотрим в гугле:

46221


Действительно, на фоне (задний с лева и нижний план изображения) больше темного чем светлого.


Практика (работа с капчей)

Делаем капчу черно-белой

Есть два способа сделать изображение капчи черно-белым:

Первый способ
Monochrome, специально капчи выискивать не буду, покажу на примере тех что у меня есть, решил совсем немного затронуть эту тему, чтоб было понимание того, как сделать капчу черно-белой)

46222
46223
46224


Если просто применить монохром, то они будут такие:

46225
46226
46227


Но как мы с вами помним, у нас есть инвертирующий фильтр, метод Negate(), давайте им и воспользуемся

46228
46229
46230


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

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
    image.Format = MagickFormat.Png;
    image.ColorType = ColorType.Bilevel;
    image.Negate();
    image.Write(SaveImagePath);
}
Второй способ
С помощью фильтра Threshold / Порог

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
    image.Format = MagickFormat.Png;
    image.Threshold(new Percentage(70));
    image.Negate();
    image.Write(SaveImagePath); // сохраняем в .png
}
Но тут уже для первой капчи image.Threshold(new Percentage(45));
а для остальных двух image.Threshold(new Percentage(70));



Капча клавиши

46233
46234
46235


Задача избавится от самых клавиш, чтоб остались только числа, приступим
1. Воспользуемся фильтром Threshold(new Percentage(95));

46236
46237
46238


2. Воспользуемся фильтром заливки FloodFill(MagickColors.Black, 0, 0); зальем черным цветом

46239
46240
46241


3. Тот же самый фильтр FloodFill(MagickColors.White, 0, 0); только зальем белым цветом

46242
46244
46245


Действительно произошла магия, не даром название библиотеки Magick, мы добились желаемого результата, теперь капмонстру куда легче стало распознавать капчу)

C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (ImageMagick.MagickImage image = new ImageMagick.MagickImage(InputImagePath)){
    image.Threshold(new ImageMagick.Percentage(95));
    image.FloodFill(MagickColors.Black, 0, 0);
    image.FloodFill(MagickColors.White, 0, 0);
    image.Write(SaveImagePath);
}
Если процент разгадывания не устраивает, хотелось бы еще повысить? Как вариант можно увеличить изображение в 2 а то и в 3 раза с помощью метода Sample(new Percentage(200)); 200 - в 2 раза, 300 - в 3 раза. Так же еще можно воспользоваться методом сглаживания Blur(1, 3); и с помощью метода Trim(); обрезать до черных пикселей. Давайте ради любопытства сделаем это)

46248


46249


46250


C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (ImageMagick.MagickImage image = new ImageMagick.MagickImage(InputImagePath)){
    image.Threshold(new ImageMagick.Percentage(95));
    image.FloodFill(MagickColors.Black, 0, 0);
    image.FloodFill(MagickColors.White, 0, 0);
    image.Trim();
    image.Blur(1, 3);
    image.Write(SaveImagePath);
}
Как видите, добавляя метод за методом, происходит магия) Не обязательно сохранять изображение после каждого применения фильтра. Можно сразу применить все и потом сохранить, либо конвертировать в base64 и отправить на кап монстр.

Официальный форум(на английском языке) Magick.NET - тык
Официальный сайт(на английском языке) - тык
Github - тык

P.S Документации по Magik.NET C# в интернете нету, я облазил все вдоль и поперек, не нашел, все делал своими силами :(
 

Вложения

Последнее редактирование:

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 983
Благодарностей
4 432
Баллы
113
Тут только за усидчивость можно приз давать!
 

DenisK

Client
Регистрация
28.06.2016
Сообщения
591
Благодарностей
289
Баллы
63

letr

Новичок
Регистрация
29.10.2017
Сообщения
15
Благодарностей
4
Баллы
3
Вот молодчина то какой просто + от души . Мега полезная вещ даже например ватермарки по имиджам выставить и то хорошо - а можно и по уникализации картинок пошерстить... Правда посидеть покурить экзамплы конечно придется...
 
  • Спасибо
Реакции: Sergodjan и samsonnn

guloc

Client
Регистрация
12.09.2016
Сообщения
153
Благодарностей
150
Баллы
43
Отличная статья. Нравятся статьи где больше практики и меньше теории, делай так получишь вот так и тд.
 
  • Спасибо
Реакции: Sergodjan и samsonnn

russya

Client
Регистрация
08.07.2014
Сообщения
743
Благодарностей
78
Баллы
28
круто! спасибо за статью
 

Valandersi

Client
Регистрация
19.01.2015
Сообщения
1 919
Благодарностей
1 123
Баллы
113
Одна из лучших статей пока лично для меня
 
  • Спасибо
Реакции: Sergodjan и samsonnn
Регистрация
13.04.2016
Сообщения
650
Благодарностей
53
Баллы
28
Очень крутая статья!!! + за труд...

2 вопроса назрели перед практикой:


1) пропорциональный размер изображения (не обрезая)
2) .jpg в формат .png (в другом направлении можно сделать?)
 
  • Спасибо
Реакции: Sergodjan и samsonnn

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 768
Благодарностей
1 437
Баллы
113
Очень крутая статья!!! + за труд...

2 вопроса назрели перед практикой:


1) пропорциональный размер изображения (не обрезая)
2) .jpg в формат .png (в другом направлении можно сделать?)
Думаю да можно, а почему нет? Попробуйте, мне тоже интересно стало, теоретически должно все получится)
 

Gefest

Client
Регистрация
30.04.2016
Сообщения
73
Благодарностей
14
Баллы
8
Какие отличия от ImageProcessor будут ?

А можно например как то короче сделать, без
C#:
using (MagickImage image = new MagickImage(InputImagePath)){
       image.Swirl(80);
       image.Write(SaveImagePath);
Объект создать и уже с ним работать, и применять несколько фильтров
 
  • Спасибо
Реакции: samsonnn

juk88

Client
Регистрация
30.05.2018
Сообщения
90
Благодарностей
12
Баллы
8
О! Это то, что доктор прописал!!! Уже кучу своих проблем решил с помощью этой статьи!!!
 
  • Спасибо
Реакции: Sergodjan и samsonnn

Nike59

Client
Регистрация
05.08.2011
Сообщения
122
Благодарностей
122
Баллы
43
Разложены по полкам инструменты для работы с изображениями в виде готового кода. Разложены на понятные ингредиенты инструкции к каждому инструменту. Получился такой оборудованный всем необходимым для работы с изображениями верстак мастера-zenno-вода.
 
  • Спасибо
Реакции: Sergodjan и samsonnn

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 768
Благодарностей
1 437
Баллы
113
Какие отличия от ImageProcessor будут ?
С помощью Magick.Net можно работать с разными форматами, изображений, резать, склеивать, конвертировать pdf файлы, создавать gif анимации, извлекать таблицы с документов и многое другое, этого в моей статье нету, я физически не успел все изучить и попробовать. Без документации, без примеров очень тяжело самостоятельно сотворить чтоб в статье показать как это работает. Тут одна морфология тянет на полноценную статью - смотрите тут, можете перейти на официальный сайт и почитать самостоятельно, если у вас есть желание и время, можете для себя что то новое там изучить, то чего нету в моей статье)


А можно например как то короче сделать, без
C#:
using (MagickImage image = new MagickImage(InputImagePath)){
       image.Swirl(80);
       image.Write(SaveImagePath);
Объект создать и уже с ним работать, и применять несколько фильтров
Конечно можно, даже нужно) В примере про капча клавиши как раз рассматривается и показывается то что вам нужно)
 
Последнее редактирование:
  • Спасибо
Реакции: juk88

indigo666

Client
Регистрация
10.05.2014
Сообщения
1 154
Благодарностей
373
Баллы
83
Спасибо за годноту ) С меня голос
 
  • Спасибо
Реакции: samsonnn

vrska

Client
Регистрация
07.02.2010
Сообщения
589
Благодарностей
408
Баллы
63

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 768
Благодарностей
1 437
Баллы
113
Вот же она
Нет это не документация, документация это где описываются классы, методы, и так далее, как в зенке, а там такого нету.
Вот такого плана должна быть документация - тык
 

doriandor

Client
Регистрация
26.12.2014
Сообщения
5
Благодарностей
1
Баллы
3
Здравствуйте! А есть метод для того что бы белый фон в png "превращать" в прозрачный?
 

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 768
Благодарностей
1 437
Баллы
113
Здравствуйте! А есть метод для того что бы белый фон в png "превращать" в прозрачный?
C#:
string InputImagePath = project.Variables["InputImagePath"].Value;
string SaveImagePath = project.Variables["SaveImagePath"].Value;
using (MagickImage image = new MagickImage(InputImagePath)){
    image.Format = MagickFormat.Png;
    image.Alpha(AlphaOption.Set);
    image.ColorFuzz = new Percentage(10);
    image.Opaque(MagickColors.White, MagickColor.FromRgba(0, 0, 0, 0));
    image.Write(SaveImagePath);
}
P.S добавил в полезняшки :-)
 
Последнее редактирование:
  • Спасибо
Реакции: Маломальский

radv

Client
Регистрация
11.05.2015
Сообщения
3 785
Благодарностей
1 950
Баллы
113
Кстати, как идея можно все эти блоки вынести в свои кубики/плагины и использовать уже их, если в коде вы плохо разбираетесь
 

Master Woo

Client
Регистрация
06.12.2014
Сообщения
122
Благодарностей
129
Баллы
43
можно ли с помощью данной библиотеки добавлять текст на картинку? желательно красиво...
 

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 768
Благодарностей
1 437
Баллы
113
можно ли с помощью данной библиотеки добавлять текст на картинку? желательно красиво...
Можно как то так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value;
string SaveImagePath = project.Variables["SaveImagePath"].Value;
using (MagickImage image = new MagickImage(InputImagePath)){
     MagickReadSettings readSettings = new MagickReadSettings{
        FillColor = MagickColors.Blue, // цвет текста
        BackgroundColor = MagickColors.Transparent, // фон текста
        Font = "Arial", // Шрифт текста (только те, что установлены в Windows)
        Width = 350, // Ширина текста
        Height = 48 }; // Высота текста
    image.Alpha(AlphaOption.Opaque);
    using (MagickImage label = new MagickImage("label:Тут какой то текст", readSettings)){
        image.Composite(label, 200, 100, CompositeOperator.Over); // расположение текста на картинке 200 слева, 100 сверху
        image.Write(SaveImagePath);
    }
}
P.S добавил в полезняшки :-)
 
Последнее редактирование:

Master Woo

Client
Регистрация
06.12.2014
Сообщения
122
Благодарностей
129
Баллы
43
Можно как то так:

C#:
string InputImagePath = project.Variables["InputImagePath"].Value;
string SaveImagePath = project.Variables["SaveImagePath"].Value;
using (MagickImage image = new MagickImage(InputImagePath)){
     MagickReadSettings readSettings = new MagickReadSettings{
        FillColor = MagickColors.Blue, // цвет текста
        BackgroundColor = MagickColors.Transparent, // фон текста
        Font = "Arial", // Шрифт текста (только те, что установлены в Windows)
        Width = 350, // Ширина текста
        Height = 500 }; // Высота текста
    image.Alpha(AlphaOption.Opaque);
    using (MagickImage label = new MagickImage("label:Тут какой то текст", readSettings)){
        image.Composite(label, 200, 100, CompositeOperator.Over); // расположение текста на картинке 200 слева, 100 сверху
        image.Write(SaveImagePath);
    }
}
P.S добавил в полезняшки :-)
спс за пример. а можно как-то сделать, чтобы текст был по середине(как в ворде "выравнивание по центру") ?
 

Gefest

Client
Регистрация
30.04.2016
Сообщения
73
Благодарностей
14
Баллы
8
Может глупость спрошу, но в чем отличие между этими вариантами ?
C#:
using (MagickImage image = new MagickImage(InputImagePath))
{
       image.Blur(6, 6);
       image.Write(SaveImagePath);
}
C#:
MagickImage image = new MagickImage(InputImagePath);
image.Blur(6,6);
image.Write(SaveImagePath);
Первый для общего кода ?

Но статья вообще уисшая просто! 12 конкурс крутой очень
 

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 768
Благодарностей
1 437
Баллы
113
Может глупость спрошу, но в чем отличие между этими вариантами ?
C#:
using (MagickImage image = new MagickImage(InputImagePath))
{
       image.Blur(6, 6);
       image.Write(SaveImagePath);
}
C#:
MagickImage image = new MagickImage(InputImagePath);
image.Blur(6,6);
image.Write(SaveImagePath);
Первый для общего кода ?

Первый вариант обернут в using, а во втором варианте нужно дергать метод .Dispose() для того чтоб освободить ресурсы.
В первом варианте ресурсы освобождается сами, после того как выполнится код который обернут в using.
Другими словами если не освобождать ресурсы, то будет конфликтовать, что то типа: такой то процесс занят другим процессом, и будет валится по ошибке.
 
  • Спасибо
Реакции: sydoow и Gefest

Gefest

Client
Регистрация
30.04.2016
Сообщения
73
Благодарностей
14
Баллы
8
Первый вариант обернут в using, а во втором варианте нужно дергать метод .Dispose() для того чтоб освободить ресурсы.
В первом варианте ресурсы освобождается сами, после того как выполнится код который обернут в using.
Другими словами если не освобождать ресурсы, то будет конфликтовать, что то типа: такой то процесс занят другим процессом, и будет валится по ошибке.
Вспомнил что такое же в ImageProcessor было, там просто код тупил и не выполнялся если например запустить несколько фильтров без Dispose
 

pogosara

Client
Регистрация
01.08.2019
Сообщения
8
Благодарностей
7
Баллы
3
Спасибо! Хорошая библиотека, а автору за труд отдельный - рахмат!
 
  • Спасибо
Реакции: samsonnn

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