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

cherus09

Client
Joined
Oct 10, 2016
Messages
172
Reaction score
14
Points
18

jaka1

Client
Joined
Mar 10, 2015
Messages
44
Reaction score
14
Points
8
Как найти последнюю версию? С гитхаба пишет, что
Тип Время Сообщение
22:37:41 Подключение сборки к проекту C:\Users\lol\Desktop\Новая папка\Magick.NET-Q16-AnyCPU.dll не является .Net сборкой или не возможно получить доступ к сборке
 

Valeriii

Новичок
Joined
Jan 11, 2022
Messages
1
Reaction score
0
Points
1
Получил значение пикселе в виде массива,
C#:
MagickImage image = new MagickImage(fileName);
ushort[] pixelValues = image.GetPixels().GetValues();
проделал со значениями некоторые операции.
Есть такая возможность создать и сохранить новое изображение с этого массива?
 

Uralbox

Client
Joined
Feb 4, 2019
Messages
40
Reaction score
0
Points
6
Доминирующий цвет на изображении
На PNG картинках не определяет таким методом.

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

diman

Client
Joined
Feb 18, 2018
Messages
100
Reaction score
15
Points
18
Нужно нанести текст на пустое белое изображение, то есть просто черный текст на белом фоне.

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

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

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

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

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

jaka1

Client
Joined
Mar 10, 2015
Messages
44
Reaction score
14
Points
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");
 
Last edited:
  • Thank you
Reactions: diman

diman

Client
Joined
Feb 18, 2018
Messages
100
Reaction score
15
Points
18
Покажите код

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

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
Joined
Mar 10, 2015
Messages
44
Reaction score
14
Points
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);
}
 
  • Thank you
Reactions: diman

jaka1

Client
Joined
Mar 10, 2015
Messages
44
Reaction score
14
Points
8
Но мой пример лаконичнее и понятнее, чем Ваш. Я бы переделал на Вашем месте.
 
  • Thank you
Reactions: diman

diman

Client
Joined
Feb 18, 2018
Messages
100
Reaction score
15
Points
18
Но мой пример лаконичнее и понятнее, чем Ваш. Я бы переделал на Вашем месте.
Большое спасибо. То что нужно.
 

NazarBIT

Client
Joined
Apr 1, 2022
Messages
63
Reaction score
2
Points
8
Теория, обзор и примеры методов (фильтров) I
В библиотеке Magick.NET я насчитал более 50 методов для работы с изображениями, давайте более подробно рассмотрим некоторые из их:

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

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

View attachment 45787

View attachment 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);
}

View attachment 45790 View attachment 45791



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

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

View attachment 45792

View attachment 45793

View attachment 45794

View attachment 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);
}

View attachment 45796 View attachment 45797



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

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

View attachment 45798

View attachment 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);
}

View attachment 45800 View attachment 45801



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

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

View attachment 45781

View attachment 45782

View attachment 45783

View attachment 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);
}

View attachment 45785 View attachment 45786


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

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

View attachment 45802

View attachment 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);
}

View attachment 45804 View attachment 45805



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

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

View attachment 45806

View attachment 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);
}

View attachment 45808 View attachment 45809



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

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

View attachment 45810

View attachment 45811

View attachment 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);
}

View attachment 45813 View attachment 45814



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

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

View attachment 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);
}

View attachment 45816 View attachment 45817



9. Edge - Край

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

View attachment 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);
}

View attachment 45820 View attachment 45821



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

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

View attachment 45822

View attachment 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);
}

View attachment 45824 View attachment 45825



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

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

View attachment 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);
}

View attachment 45827 View attachment 45828



12. FloodFill - Заливка

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

View attachment 45829

View attachment 45830

View attachment 45831

View attachment 45832

View attachment 45833

View attachment 45834

View attachment 45835

View attachment 45836

View attachment 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);
}

View attachment 45839 View attachment 45840



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

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

View attachment 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);
}

View attachment 45842 View attachment 45843



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

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

View attachment 45844

View attachment 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);
}

View attachment 45846 View attachment 45847



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

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

View attachment 45848

View attachment 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);
}

View attachment 45850 View attachment 45851



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

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

View attachment 45852

View attachment 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);
}

View attachment 45854 View attachment 45855



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

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

View attachment 45857

View attachment 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);
}

View attachment 45859 View attachment 45860



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

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

View attachment 45861

View attachment 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);
}

View attachment 45863 View attachment 45864



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

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

View attachment 45865

View attachment 45866

View attachment 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);
}

View attachment 45868 View attachment 45869



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

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

View attachment 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);
}

View attachment 45871 View attachment 45872



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

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

View attachment 45873

View attachment 45874

View attachment 45875

View attachment 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);
}

View attachment 45877 View attachment 45878



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

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

View attachment 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);
}

View attachment 45880 View attachment 45881


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

diman

Client
Joined
Feb 18, 2018
Messages
100
Reaction score
15
Points
18
привер, как нужно указывать путь к изображению ? Оно должно быть на компютере? Типа путь а файлу на пк указывать или что?
Да, нужно указывать путь к файлу на ПК
C:\Users\Administrator\Desktop\file.jpg
 
  • Thank you
Reactions: NazarBIT

NazarBIT

Client
Joined
Apr 1, 2022
Messages
63
Reaction score
2
Points
8
Да, нужно указывать путь к файлу на ПК
C:\Users\Administrator\Desktop\file.jpg
Понял, спасибо)
 

NazarBIT

Client
Joined
Apr 1, 2022
Messages
63
Reaction score
2
Points
8
Да, нужно указывать путь к файлу на ПК
C:\Users\Administrator\Desktop\file.jpg
не подскажешь, а как в зеннопостере допустим сохранять картинки с браузера на пк?
 

NazarBIT

Client
Joined
Apr 1, 2022
Messages
63
Reaction score
2
Points
8
не подскажешь, а как в зеннопостере допустим сохранять картинки с браузера на пк?
уже разобрался, спасибо
 

NazarBIT

Client
Joined
Apr 1, 2022
Messages
63
Reaction score
2
Points
8
View attachment 45658

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

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

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

View attachment 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 которая находится:

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

View attachment 45773

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

View attachment 45774

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

View attachment 45775

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

View attachment 45776


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

View attachment 45777


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

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

View attachment 45778

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

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


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

samsonnn

Client
Joined
Jun 2, 2015
Messages
1,858
Reaction score
1,580
Points
113

webmasterdual

Client
Joined
Jul 22, 2018
Messages
5
Reaction score
2
Points
3
Подскажите пожалуйста а с помощью этой библиотеки можно удалить ватермарк с изображения?
 

искра

Client
Joined
Jun 7, 2014
Messages
280
Reaction score
23
Points
18
конвертировать pdf файлы
а можно как то pdf конвертировать в картинку? в гугле искал решение, но при использовании кода оттуда выдает ошибку
 
Joined
Mar 23, 2015
Messages
1,231
Reaction score
774
Points
113

искра

Client
Joined
Jun 7, 2014
Messages
280
Reaction score
23
Points
18
поиск рулит
видел, еще я в той теме же этот вопрос и задавал, охота через ImageMagick а не стороннею программу
 
Joined
Dec 25, 2021
Messages
26
Reaction score
16
Points
3
Одна из самых крутых и крупных статей наверное на форуме! Респект автору!:-)
 
Joined
Mar 23, 2015
Messages
1,231
Reaction score
774
Points
113

искра

Client
Joined
Jun 7, 2014
Messages
280
Reaction score
23
Points
18
Пробовал?
пробовал, тоже не получается, возможно у меня руки не оттуда растут, наверно пора уже C# начать учить что бы при работе с кодом не зависать
 

alex_mgn

Client
Joined
Jan 30, 2021
Messages
48
Reaction score
18
Points
8
Подскажите, как получить средний цвет пикселей изображения?
 

prodox

Client
Joined
Aug 28, 2018
Messages
280
Reaction score
55
Points
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);
    }
}

View attachment 46120 View attachment 46121

View attachment 46122 View attachment 46123

View attachment 46124 View attachment 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);
    }
}

View attachment 46114 View attachment 46115

View attachment 46116 View attachment 46117

View attachment 46118 View attachment 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);
    }
}

View attachment 46126 View attachment 46127

View attachment 46128 View attachment 46129

View attachment 46136 View attachment 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);
}

View attachment 46479 View attachment 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 указать путь к изображению

View attachment 46173

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

View attachment 46175

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

View attachment 46176

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

View attachment 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);
    }
}

View attachment 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 указать путь к первому изображению

View attachment 46180


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

View attachment 46181


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

View attachment 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 указать путь к изображению

View attachment 46199


View attachment 46202



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

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

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

View attachment 46206

View attachment 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);
}

View attachment 46211

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

View attachment 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);
}
Получим доминирующий цвет этого изображения

View attachment 46218

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

View attachment 46219

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

View attachment 46221

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


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

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

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

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

View attachment 46222 View attachment 46223 View attachment 46224

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

View attachment 46225 View attachment 46226 View attachment 46227

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

View attachment 46228 View attachment 46229 View attachment 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));



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

View attachment 46233 View attachment 46234 View attachment 46235

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

View attachment 46236 View attachment 46237 View attachment 46238

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

View attachment 46239 View attachment 46240 View attachment 46241

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

View attachment 46242 View attachment 46244 View attachment 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(); обрезать до черных пикселей. Давайте ради любопытства сделаем это)

View attachment 46248

View attachment 46249

View attachment 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# в интернете нету, я облазил все вдоль и поперек, не нашел, все делал своими силами :(
 
  • Thank you
Reactions: fri-lancer

prodox

Client
Joined
Aug 28, 2018
Messages
280
Reaction score
55
Points
28

prodox

Client
Joined
Aug 28, 2018
Messages
280
Reaction score
55
Points
28

prodox

Client
Joined
Aug 28, 2018
Messages
280
Reaction score
55
Points
28
Афтар,
Глянь, накопал референс на magik++ 7.1.0
Это что? для C++? или только версия другая?
DLL нужна другая? в примере из конкурса смотрел, там методы те же есть

 
Last edited:

mrgreyarbtr

Пользователь
Joined
Oct 1, 2022
Messages
99
Reaction score
30
Points
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);
}
}

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

Users Who Are Viewing This Thread (Total: 1, Members: 0, Guests: 1)