Смотрите видео ниже, чтобы узнать, как установить наш сайт в качестве веб-приложения на домашнем экране.
Примечание: Эта возможность может быть недоступна в некоторых браузерах.
Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно. Вам необходимо обновить браузер или попробовать использовать другой.
Очень часто требуется нанести текст на картинку с пёстрым фоном. Без наложения эффекта тени или glow вокруг букв всё сливается.
Расскажи нам как сделать тени или свечение средствами зенки или даже другими c# либами по работе с графикой?
Коллеги, а какой алго лучше выбрать для "гламура" тумб ? Нужно с одной стороны сгладить кожу, с другой добавить резкости определенным участкам типа волос и глаз, и потом яркости и контраста. Первые два пункта мэджик сделает? (есть плагины для фотошопа, но хочется серверное решение)
Коллеги, а какой алго лучше выбрать для "гламура" тумб ? Нужно с одной стороны сгладить кожу, с другой добавить резкости определенным участкам типа волос и глаз, и потом яркости и контраста. Первые два пункта мэджик сделает? (есть плагины для фотошопа, но хочется серверное решение)
Ты если обрежешь, повернешь фото - это уже уникальное фото будет. Плюс любой фильтр. В идеале может еще EXIF очистить
Или добавить текст мелким шрифтом куда угодно на фото
Или маску с 1-2% видимости
а еще такая проблема появилась:
при склейке двух png с прозрачным фоном в итоговом избражении склеенном - фон белый становится
можно ли при склейке сохранить прозрачность, как в исходных первом и втором изображениях?
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);
}
}
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);
}
}
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);
}
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 указать путь к изображению
Так же в 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);
}
}
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 указать путь к первому изображению
В переменной SaveImagePath указать путь куда сохраняем обработанное изображение. В результате нам показывает то, чего нету на втором изображении, то есть разницу)
Это может быть полезно при работе с капчами, чтоб изображение не сохранять на диск после обработки фильтрами, а сразу конвертировать в 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 указать путь к изображению
Информация о картинке (формат, размер, битность, цветность)
Кодом ниже, можно получить краткую информацию о изображении
C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
using (MagickImage image = new MagickImage(InputImagePath)){
project.Variables["InfoImage"].Value = image.ToString();
}
В переменной InputImagePath указать путь к изображению
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveFilePath = project.Variables["SaveFilePath"].Value; // В переменной SaveFilePath указать путь к файлу, с его названием и он будет создан сам
using (MagickImage image = new MagickImage(InputImagePath)){
image.Write(SaveFilePath);
}
В файлике мы увидим следующее: общее количество пикселей, которое на изображении, и информацию про каждый пиксель, его координаты расположения на изображении и цвет
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);
}
Действительно, на фоне (задний с лева и нижний план изображения) больше темного чем светлого.
Практика (работа с капчей)
Делаем капчу черно-белой
Есть два способа сделать изображение капчи черно-белым:
Первый способ
Monochrome, специально капчи выискивать не буду, покажу на примере тех что у меня есть, решил совсем немного затронуть эту тему, чтоб было понимание того, как сделать капчу черно-белой)
Как видим мы добились того чего хотели) Это простые капчи, они без шумов, а так для каждой нужен индивидуальный подход, и свои фильтры с настройками.
C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
image.Format = MagickFormat.Png;
image.ColorType = ColorType.Bilevel;
image.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));
Действительно произошла магия, не даром название библиотеки 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(); обрезать до черных пикселей. Давайте ради любопытства сделаем это)
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# в интернете нету, я облазил все вдоль и поперек, не нашел, все делал своими силами
Очень часто требуется нанести текст на картинку с пёстрым фоном. Без наложения эффекта тени или glow вокруг букв всё сливается.
Расскажи нам как сделать тени или свечение средствами зенки или даже другими c# либами по работе с графикой?
Ребята, помогите нубу, с C# дружу плохо, как правильно прописать код, чтоб сюда вставлялись слова взятые с переменной? Так все работает, вставляю переменную, перестают работать, дело в синтаксисе, но я не шерю). Спасибо
Переведите текст ошибки и увидите, что он пытается открыть файл ИМЯ Фамилия, видимо переменную или метод перепутали.
При использовании методов, возможно есть всплывающие подсказки, какие параметры и в каком формате требуются для конкретного метода. Так быстрее найдете в чем ошибка.