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

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 983
Благодарностей
4 434
Баллы
113
стандартных средств зенно хватает для работы с графикой
Очень часто требуется нанести текст на картинку с пёстрым фоном. Без наложения эффекта тени или glow вокруг букв всё сливается.
Расскажи нам как сделать тени или свечение средствами зенки или даже другими c# либами по работе с графикой?
 
  • Спасибо
Реакции: fri-lancer и samsonnn

RipWay

Client
Регистрация
21.11.2013
Сообщения
99
Благодарностей
45
Баллы
18
Вот это статья! Всё супер подробно и с примерами! Спасибо! Голос за тебя!
 
  • Спасибо
Реакции: samsonnn

Int_Now

Client
Регистрация
23.02.2019
Сообщения
29
Благодарностей
27
Баллы
13
А каких методов будет достаточно для уникализации?
Или по другому - какие методы лучше использовать для уникализации.
 

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 784
Благодарностей
1 452
Баллы
113
А каких методов будет достаточно для уникализации?
Или по другому - какие методы лучше использовать для уникализации.
Не подскажу, так как я не разу в жизни подобным не занимался, даже не знаю что это такое - "уникализации")
 

seoshnek

Client
Регистрация
08.03.2010
Сообщения
101
Благодарностей
47
Баллы
28
Коллеги, а какой алго лучше выбрать для "гламура" тумб ? Нужно с одной стороны сгладить кожу, с другой добавить резкости определенным участкам типа волос и глаз, и потом яркости и контраста. Первые два пункта мэджик сделает? (есть плагины для фотошопа, но хочется серверное решение)


btw Спасибо за статью!
 

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 784
Благодарностей
1 452
Баллы
113
Коллеги, а какой алго лучше выбрать для "гламура" тумб ? Нужно с одной стороны сгладить кожу, с другой добавить резкости определенным участкам типа волос и глаз, и потом яркости и контраста. Первые два пункта мэджик сделает? (есть плагины для фотошопа, но хочется серверное решение)


btw Спасибо за статью!
Как вариант попробуйте метод .Normalize(); код находится в самом конце первой части фильтров
 
  • Спасибо
Реакции: seoshnek

uRusure

Client
Регистрация
07.07.2018
Сообщения
40
Благодарностей
14
Баллы
8
Получается ли этим способом сильно изменить phash изображения?
 

Gefest

Client
Регистрация
30.04.2016
Сообщения
73
Благодарностей
14
Баллы
8
А каких методов будет достаточно для уникализации?
Или по другому - какие методы лучше использовать для уникализации.
Ты если обрежешь, повернешь фото - это уже уникальное фото будет. Плюс любой фильтр. В идеале может еще EXIF очистить
Или добавить текст мелким шрифтом куда угодно на фото
Или маску с 1-2% видимости
 
  • Спасибо
Реакции: Kinomanius и samsonnn

Metrix

Client
Регистрация
03.01.2014
Сообщения
343
Благодарностей
272
Баллы
63
Хорошо, можно будет теперь в одном месте посмотреть часть возможностей библиотеки и примеры работы с ней!
 
  • Спасибо
Реакции: samsonnn

DaDoXa

Client
Регистрация
05.09.2017
Сообщения
143
Благодарностей
208
Баллы
43
Топчик! Спасибо вам большое, нужная вещь и главное сразу знаешь где применить!
 
  • Спасибо
Реакции: samsonnn

perfectum

Новичок
Регистрация
20.12.2018
Сообщения
8
Благодарностей
7
Баллы
3
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 добавил в полезняшки :-)
а прозрчый в белый можно превращать? (очень нужно)

и как можно создать, например, пустой файл png белого цвета 100х100 пикселей?

если без библиотеки dll, то так:
code:
convert -size 100x100 xc:none fond.png
и еще нужно склеить два изображения (одно снизу, другое свеху)
 

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 784
Благодарностей
1 452
Баллы
113
а прозрчый в белый можно превращать? (очень нужно)
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(MagickColor.FromRgba(0, 0, 0, 0), MagickColors.White);
    image.Write(SaveImagePath);
}
и как можно создать, например, пустой файл png белого цвета 100х100 пикселей?
C#:
string SaveImagePath = project.Variables["SaveImagePath"].Value;
using (MagickImage image = new MagickImage(MagickColors.White, 100, 100)){
    image.Format = MagickFormat.Png;
    image.Alpha(AlphaOption.Set);
    image.Write(SaveImagePath);
}
и еще нужно склеить два изображения (одно снизу, другое свеху)

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

C#:
string FirstImagePath = project.Variables["FirstImagePath"].Value;
string SecondImagePath = project.Variables["SecondImagePath"].Value;
string SaveImagePath = project.Variables["SaveImagePath"].Value;
using(MagickImageCollection Images = new MagickImageCollection()){
    using(MagickImage FirstImage = new MagickImage(FirstImagePath)){
        using(MagickImage SecondImage = new MagickImage(SecondImagePath)){
            Images.Add(FirstImage);
            Images.Add(SecondImage);
                   MontageSettings ms = new MontageSettings();
                   ms.Geometry = new MagickGeometry(FirstImage.Width, FirstImage.Height);
            ms.TileGeometry = new MagickGeometry(string.Format("{0}", 1));
            using(IMagickImage result = Images.Montage(ms)){
                result.Write(SaveImagePath);
            }
        }
    }
}
 
  • Спасибо
Реакции: sydoow и perfectum

perfectum

Новичок
Регистрация
20.12.2018
Сообщения
8
Благодарностей
7
Баллы
3
Изображения которые нужно склеить, должны быть одинакового размера.

C#:
string FirstImagePath = project.Variables["FirstImagePath"].Value;
string SecondImagePath = project.Variables["SecondImagePath"].Value;
string SaveImagePath = project.Variables["SaveImagePath"].Value;
using(MagickImageCollection Images = new MagickImageCollection()){
    using(MagickImage FirstImage = new MagickImage(FirstImagePath)){
        using(MagickImage SecondImage = new MagickImage(SecondImagePath)){
            Images.Add(FirstImage);
            Images.Add(SecondImage);
                   MontageSettings ms = new MontageSettings();
                   ms.Geometry = new MagickGeometry(FirstImage.Width, FirstImage.Height);
            ms.TileGeometry = new MagickGeometry(string.Format("{0}", 1));
            using(IMagickImage result = Images.Montage(ms)){
                result.Write(SaveImagePath);
            }
        }
    }
}
магареспект тебе!
и победы в конкурсе! )
 
  • Спасибо
Реакции: samsonnn

perfectum

Новичок
Регистрация
20.12.2018
Сообщения
8
Благодарностей
7
Баллы
3
Изображения которые нужно склеить, должны быть одинакового размера.
а еще такая проблема появилась:
при склейке двух png с прозрачным фоном в итоговом избражении склеенном - фон белый становится
можно ли при склейке сохранить прозрачность, как в исходных первом и втором изображениях?
 

perfectum

Новичок
Регистрация
20.12.2018
Сообщения
8
Благодарностей
7
Баллы
3
нашел решение склейки двух png с сохранением прозрачного фона, может, кому-то пригодится:
C#:
string FirstImagePath = project.Variables["FirstImagePath"].Value;
string SecondImagePath = project.Variables["SecondImagePath"].Value;
string SaveImagePath = project.Variables["SaveImagePath"].Value;
using(MagickImageCollection Images = new MagickImageCollection()){
    using(MagickImage FirstImage = new MagickImage(FirstImagePath)){
        using(MagickImage SecondImage = new MagickImage(SecondImagePath)){
            Images.Add(FirstImage);
            Images.Add(SecondImage);
                   MontageSettings ms = new MontageSettings();
                   ms.Geometry = new MagickGeometry(FirstImage.Width, FirstImage.Height);
                   ms.BackgroundColor = MagickColors.Transparent;
            ms.TileGeometry = new MagickGeometry(string.Format("{0}", 1));
            using(IMagickImage result = Images.Montage(ms)){
                result.Write(SaveImagePath);
            }
        }
    }
}
 
  • Спасибо
Реакции: Nike59 и samsonnn

MarDeVal

Client
Регистрация
12.12.2019
Сообщения
20
Благодарностей
4
Баллы
3
Очень полезный пост! Автору- спасибо!
 
  • Спасибо
Реакции: samsonnn

Valandersi

Client
Регистрация
19.01.2015
Сообщения
1 924
Благодарностей
1 123
Баллы
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# в интернете нету, я облазил все вдоль и поперек, не нашел, все делал своими силами :(
Подскажи может ты уже тестил, какие эффекты дают максимальный эффект уникализации, при этом не меняется сильно сама картинка
 

vrska

Client
Регистрация
07.02.2010
Сообщения
589
Благодарностей
408
Баллы
63
Подскажи может ты уже тестил, какие эффекты дают максимальный эффект уникализации, при этом не меняется сильно сама картинка
Не подскажу, так как я не разу в жизни подобным не занимался, даже не знаю что это такое - "уникализации")
 
  • Спасибо
Реакции: samsonnn

Чешир

Client
Регистрация
27.06.2014
Сообщения
1 634
Благодарностей
963
Баллы
113
Большой объем работы. Спасибо!
 
  • Спасибо
Реакции: samsonnn

Gfoblin

Client
Регистрация
30.05.2013
Сообщения
4 596
Благодарностей
1 014
Баллы
113
Очень часто требуется нанести текст на картинку с пёстрым фоном. Без наложения эффекта тени или glow вокруг букв всё сливается.
Расскажи нам как сделать тени или свечение средствами зенки или даже другими c# либами по работе с графикой?
На сайте их был пример )
Делал такое лет 10 назад - нормально выходит...
 

max2011

Client
Регистрация
22.10.2015
Сообщения
43
Благодарностей
1
Баллы
8
За проделаную работу респект и уважуха
 
  • Спасибо
Реакции: samsonnn

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 784
Благодарностей
1 452
Баллы
113
За проделаную работу респект и уважуха
Ребята, честно для вас старался, по возможности помогаю вам с сниппетами, сам до конца еще не разобрался, материала очень много, не успел физически)
 

seodima

Client
Регистрация
21.09.2014
Сообщения
199
Благодарностей
60
Баллы
28
Отличная статья. Спасибо. Мой голос за Вас.
 
  • Спасибо
Реакции: samsonnn

Hazar

Client
Регистрация
05.12.2018
Сообщения
107
Благодарностей
19
Баллы
18
  • Спасибо
Реакции: Phoenix78

radv

Client
Регистрация
11.05.2015
Сообщения
3 789
Благодарностей
1 954
Баллы
113
  • Спасибо
Реакции: Hazar

Dufus111

Client
Регистрация
31.01.2016
Сообщения
51
Благодарностей
9
Баллы
8
Ребята, помогите нубу, с C# дружу плохо, как правильно прописать код, чтоб сюда вставлялись слова взятые с переменной? Так все работает, вставляю переменную, перестают работать, дело в синтаксисе, но я не шерю). Спасибо
 

Вложения

radv

Client
Регистрация
11.05.2015
Сообщения
3 789
Благодарностей
1 954
Баллы
113
как правильно прописать код, чтоб сюда вставлялись слова взятые с переменной?
Берешь нужное имя переменной и вставляешь вместо текста в кавычках, тогда подставится значение из этой переменной (если оно там есть)

используя string.Format("label: {0}", ИмяПеременной) получишь текст из переменной с label: в начале.

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

Dufus111

Client
Регистрация
31.01.2016
Сообщения
51
Благодарностей
9
Баллы
8
Берешь нужное имя переменной и вставляешь вместо текста в кавычках, тогда подставится значение из этой переменной (если оно там есть)

используя string.Format("label: {0}", ИмяПеременной) получишь текст из переменной с label: в начале.


Что тоу меня не получается, выдаёт ошибку, может что то не так прописал. Переменная называется Name в ней Имя и Фамилия человека нужного
 

Вложения

radv

Client
Регистрация
11.05.2015
Сообщения
3 789
Благодарностей
1 954
Баллы
113
Что тоу меня не получается, выдаёт ошибку, может что то не так прописал. Переменная называется Name в ней Имя и Фамилия человека нужного
Переведите текст ошибки и увидите, что он пытается открыть файл ИМЯ Фамилия, видимо переменную или метод перепутали.
При использовании методов, возможно есть всплывающие подсказки, какие параметры и в каком формате требуются для конкретного метода. Так быстрее найдете в чем ошибка.
 

eee

Client
Регистрация
04.06.2018
Сообщения
134
Благодарностей
31
Баллы
28
Спасибо за статью!
 
Последнее редактирование:
  • Спасибо
Реакции: DV_ и samsonnn

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