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

cherus09

Client
Регистрация
10.10.2016
Сообщения
171
Благодарностей
14
Баллы
18

jaka1

Client
Регистрация
10.03.2015
Сообщения
43
Благодарностей
14
Баллы
8
Как найти последнюю версию? С гитхаба пишет, что
Тип Время Сообщение
22:37:41 Подключение сборки к проекту C:\Users\lol\Desktop\Новая папка\Magick.NET-Q16-AnyCPU.dll не является .Net сборкой или не возможно получить доступ к сборке
 

Valeriii

Новичок
Регистрация
11.01.2022
Сообщения
1
Благодарностей
0
Баллы
1
Получил значение пикселе в виде массива,
C#:
MagickImage image = new MagickImage(fileName);
ushort[] pixelValues = image.GetPixels().GetValues();
проделал со значениями некоторые операции.
Есть такая возможность создать и сохранить новое изображение с этого массива?
 

Uralbox

Client
Регистрация
04.02.2019
Сообщения
39
Благодарностей
0
Баллы
6
Доминирующий цвет на изображении
На PNG картинках не определяет таким методом.

Подскажите как код подправить?
 
Последнее редактирование:

diman

Client
Регистрация
18.02.2018
Сообщения
85
Благодарностей
13
Баллы
8
Нужно нанести текст на пустое белое изображение, то есть просто черный текст на белом фоне.

На первый взгляд все элементарно просто.
Но на белом фоне это не работает, выходит ошибка:

"Невозможно создать объект графики из изображения, имеющего индексированный формат пикселей."

На любом цветном фоне текст наносится без проблем.
Так же, если вручную отредактировать файл в пайнте и залить все белым цветом - все работает
и текст наносится отлично.

Но если создать пустой файл с помощью библиотеки Magick.NET либо сделать заливку белым цветом
с помощью тех же примеров, которые предлагали в этой теме,
то текст на такие картинки не наносится и выходит ошибка.
Так же пробовал делать прозрачный фон, заменять его на белый, переделывать jpg -> png
и наоборот, да уже по моему все перепробовал, но в итоге
получаются изображения имеющие "индексированный формат пикселей"

Кто знает решение? Что не так с этими jpg и png?
 

jaka1

Client
Регистрация
10.03.2015
Сообщения
43
Благодарностей
14
Баллы
8
Покажите код

Вот рабочий пример:

C#:
var settings = new MagickReadSettings
{
    BackgroundColor = MagickColors.White,
    FillColor = new MagickColor("#000000"),
    Font = "Grown",
    Width = 1536,
    Height = 864,
    TextGravity = Gravity.Center, // -gravity center
};

var image = new MagickImage("caption:diman", settings);
image.Write("output.jpg");
 
Последнее редактирование:
  • Спасибо
Реакции: diman

diman

Client
Регистрация
18.02.2018
Сообщения
85
Благодарностей
13
Баллы
8
Покажите код

Вот рабочий пример:

C#:
var settings = new MagickReadSettings
{
    BackgroundColor = MagickColors.White,
    FillColor = new MagickColor("#000000"),
    Font = "Grown",
    Width = 1536,
    Height = 864,
    TextGravity = Gravity.Center, // -gravity center
};

var image = new MagickImage("caption:diman", settings);
image.Write("output.jpg");
Сначала я создаю пустой файл нужного мне размера этим кодом
C#:
int Width = Convert.ToInt32(project.Variables["Width"].Value);
int Height = Convert.ToInt32(project.Variables["Height_uv"].Value);
string SaveImagePath = project.Variables["temp"].Value;
using (MagickImage image = new MagickImage(MagickColors.White, (Width), (Height))){
    image.Format = MagickFormat.Png;
    image.Alpha(AlphaOption.Set);
    image.Write(SaveImagePath);
}
затем пытаюсь нанести туда текст
C#:
string InputImagePath = project.Variables["temp"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["temp2"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
string font = "Arial"; // Шрифт текста, по желанию можно подставить переменную project.Variables["font"].Value; вместо "Arial";
int fontSize = 28; // Размер шрифта, по желанию можно подставить переменную int.Parse(project.Variables["fontSize"].Value); вместо 28;
using(Image image = Image.FromFile(InputImagePath)){
    using(Graphics graphics = Graphics.FromImage(image)){
         graphics.DrawString(project.Variables["text"].Value, // В переменной text находится текст который нужно наложить на изображение
                  new Font(font, fontSize, FontStyle.Regular, GraphicsUnit.World),
                  new SolidBrush(Color.Black), // Цвет текста
                  new RectangleF(10, 10, image.Width, image.Height)); // текст сверху, 10, 10 это отступ слева и сверху
                  //new RectangleF(10, image.Height / 2 - fontSize, image.Width, image.Height)); //если нужен текст по центру, раскоментировать, а верхнюю закоментировать
    image.Save(SaveImagePath, System.Drawing.Imaging.ImageFormat.Jpeg);
   }
}
и получаю ошибку:
"Невозможно создать объект графики из изображения, имеющего индексированный формат пикселей."

Дело в том, что этот метод работает с любыми файлами созданными либо отредактированными вручную.
Но если я создаю или редактирую файл при помощи библиотеки Magick.NET то всегда получаю такую ошибку
 

jaka1

Client
Регистрация
10.03.2015
Сообщения
43
Благодарностей
14
Баллы
8
В первую часть надо добавить вот строку с форматом, и в записи в файл сделать изменение.
C#:
MagickFormat fmt = MagickFormat.Png24;
using (MagickImage image = new MagickImage(MagickColors.White, Width, Height)){
    image.Format = MagickFormat.Png;
    image.Alpha(AlphaOption.Set);
    image.Write(SaveImagePath,fmt);
}
 
  • Спасибо
Реакции: diman

jaka1

Client
Регистрация
10.03.2015
Сообщения
43
Благодарностей
14
Баллы
8
Но мой пример лаконичнее и понятнее, чем Ваш. Я бы переделал на Вашем месте.
 
  • Спасибо
Реакции: diman

diman

Client
Регистрация
18.02.2018
Сообщения
85
Благодарностей
13
Баллы
8

NazarBIT

Client
Регистрация
01.04.2022
Сообщения
63
Благодарностей
2
Баллы
8
Теория, обзор и примеры методов (фильтров) 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


Смотрите продолжение во второй части...
привер, как нужно указывать путь к изображению ? Оно должно быть на компютере? Типа путь а файлу на пк указывать или что?
 

diman

Client
Регистрация
18.02.2018
Сообщения
85
Благодарностей
13
Баллы
8
привер, как нужно указывать путь к изображению ? Оно должно быть на компютере? Типа путь а файлу на пк указывать или что?
Да, нужно указывать путь к файлу на ПК
C:\Users\Administrator\Desktop\file.jpg
 
  • Спасибо
Реакции: NazarBIT

NazarBIT

Client
Регистрация
01.04.2022
Сообщения
63
Благодарностей
2
Баллы
8

NazarBIT

Client
Регистрация
01.04.2022
Сообщения
63
Благодарностей
2
Баллы
8

NazarBIT

Client
Регистрация
01.04.2022
Сообщения
63
Благодарностей
2
Баллы
8

NazarBIT

Client
Регистрация
01.04.2022
Сообщения
63
Благодарностей
2
Баллы
8
Посмотреть вложение 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 с чем я вас и поздравляю)
привет, не подскажешь где можно скачать даную библеотеку?
 

samsonnn

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

webmasterdual

Client
Регистрация
22.07.2018
Сообщения
5
Благодарностей
2
Баллы
3
Подскажите пожалуйста а с помощью этой библиотеки можно удалить ватермарк с изображения?
 

искра

Client
Регистрация
07.06.2014
Сообщения
278
Благодарностей
23
Баллы
18
Регистрация
23.03.2015
Сообщения
1 113
Благодарностей
649
Баллы
113

искра

Client
Регистрация
07.06.2014
Сообщения
278
Благодарностей
23
Баллы
18
Регистрация
25.12.2021
Сообщения
20
Благодарностей
16
Баллы
3
Одна из самых крутых и крупных статей наверное на форуме! Респект автору!:-)
 
Регистрация
23.03.2015
Сообщения
1 113
Благодарностей
649
Баллы
113

искра

Client
Регистрация
07.06.2014
Сообщения
278
Благодарностей
23
Баллы
18

alex_mgn

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

prodox

Client
Регистрация
28.08.2018
Сообщения
280
Благодарностей
55
Баллы
28
Практика (полезняшки)

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

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 и отправить на кап монстр.
Это не это?

https://csharpdoc.hotexamples.com/ru/namespace/ImageMagick

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

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

prodox

Client
Регистрация
28.08.2018
Сообщения
280
Благодарностей
55
Баллы
28

prodox

Client
Регистрация
28.08.2018
Сообщения
280
Благодарностей
55
Баллы
28

prodox

Client
Регистрация
28.08.2018
Сообщения
280
Благодарностей
55
Баллы
28
Афтар,
Глянь, накопал референс на magik++ 7.1.0
Это что? для C++? или только версия другая?
DLL нужна другая? в примере из конкурса смотрел, там методы те же есть

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

mrgreyarbtr

Пользователь
Регистрация
01.10.2022
Сообщения
99
Благодарностей
30
Баллы
18
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);
}
}

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

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