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

  • Автор темы Автор темы samsonnn
  • Дата начала Дата начала
стандартных средств зенно хватает для работы с графикой
Очень часто требуется нанести текст на картинку с пёстрым фоном. Без наложения эффекта тени или glow вокруг букв всё сливается.
Расскажи нам как сделать тени или свечение средствами зенки или даже другими c# либами по работе с графикой?
 
  • Спасибо
Реакции: fri-lancer и samsonnn
Вот это статья! Всё супер подробно и с примерами! Спасибо! Голос за тебя!
 
  • Спасибо
Реакции: samsonnn
А каких методов будет достаточно для уникализации?
Или по другому - какие методы лучше использовать для уникализации.
 
А каких методов будет достаточно для уникализации?
Или по другому - какие методы лучше использовать для уникализации.

Не подскажу, так как я не разу в жизни подобным не занимался, даже не знаю что это такое - "уникализации")
 
Коллеги, а какой алго лучше выбрать для "гламура" тумб ? Нужно с одной стороны сгладить кожу, с другой добавить резкости определенным участкам типа волос и глаз, и потом яркости и контраста. Первые два пункта мэджик сделает? (есть плагины для фотошопа, но хочется серверное решение)


btw Спасибо за статью!
 
Коллеги, а какой алго лучше выбрать для "гламура" тумб ? Нужно с одной стороны сгладить кожу, с другой добавить резкости определенным участкам типа волос и глаз, и потом яркости и контраста. Первые два пункта мэджик сделает? (есть плагины для фотошопа, но хочется серверное решение)


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

Как вариант попробуйте метод .Normalize(); код находится в самом конце первой части фильтров
 
  • Спасибо
Реакции: seoshnek
Получается ли этим способом сильно изменить phash изображения?
 
А каких методов будет достаточно для уникализации?
Или по другому - какие методы лучше использовать для уникализации.
Ты если обрежешь, повернешь фото - это уже уникальное фото будет. Плюс любой фильтр. В идеале может еще EXIF очистить
Или добавить текст мелким шрифтом куда угодно на фото
Или маску с 1-2% видимости
 
  • Спасибо
Реакции: Kinomanius и samsonnn
Хорошо, можно будет теперь в одном месте посмотреть часть возможностей библиотеки и примеры работы с ней!
 
  • Спасибо
Реакции: samsonnn
Топчик! Спасибо вам большое, нужная вещь и главное сразу знаешь где применить!
 
  • Спасибо
Реакции: samsonnn
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

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

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
Изображения которые нужно склеить, должны быть одинакового размера.

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
Изображения которые нужно склеить, должны быть одинакового размера.
а еще такая проблема появилась:
при склейке двух png с прозрачным фоном в итоговом избражении склеенном - фон белый становится
можно ли при склейке сохранить прозрачность, как в исходных первом и втором изображениях?
 
нашел решение склейки двух 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
Очень полезный пост! Автору- спасибо!
 
  • Спасибо
Реакции: samsonnn
Практика (полезняшки)

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

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# в интернете нету, я облазил все вдоль и поперек, не нашел, все делал своими силами :(
Подскажи может ты уже тестил, какие эффекты дают максимальный эффект уникализации, при этом не меняется сильно сама картинка
 
Подскажи может ты уже тестил, какие эффекты дают максимальный эффект уникализации, при этом не меняется сильно сама картинка
Не подскажу, так как я не разу в жизни подобным не занимался, даже не знаю что это такое - "уникализации")
 
  • Спасибо
Реакции: samsonnn
Большой объем работы. Спасибо!
 
  • Спасибо
Реакции: samsonnn
Очень часто требуется нанести текст на картинку с пёстрым фоном. Без наложения эффекта тени или glow вокруг букв всё сливается.
Расскажи нам как сделать тени или свечение средствами зенки или даже другими c# либами по работе с графикой?
На сайте их был пример )
Делал такое лет 10 назад - нормально выходит...
 
За проделаную работу респект и уважуха
 
  • Спасибо
Реакции: samsonnn
За проделаную работу респект и уважуха

Ребята, честно для вас старался, по возможности помогаю вам с сниппетами, сам до конца еще не разобрался, материала очень много, не успел физически)
 
Отличная статья. Спасибо. Мой голос за Вас.
 
  • Спасибо
Реакции: samsonnn
  • Спасибо
Реакции: Hazar
Ребята, помогите нубу, с C# дружу плохо, как правильно прописать код, чтоб сюда вставлялись слова взятые с переменной? Так все работает, вставляю переменную, перестают работать, дело в синтаксисе, но я не шерю). Спасибо
 

Вложения

  • Переменная.jpg
    Переменная.jpg
    156,7 KB · Просмотры: 400
как правильно прописать код, чтоб сюда вставлялись слова взятые с переменной?
Берешь нужное имя переменной и вставляешь вместо текста в кавычках, тогда подставится значение из этой переменной (если оно там есть)

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

ZaZtZwJ.png
 
Последнее редактирование:
Берешь нужное имя переменной и вставляешь вместо текста в кавычках, тогда подставится значение из этой переменной (если оно там есть)

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

ZaZtZwJ.png


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

Вложения

  • Name.png
    Name.png
    26,9 KB · Просмотры: 410
  • Ошибка.png
    Ошибка.png
    4,7 KB · Просмотры: 435
Что тоу меня не получается, выдаёт ошибку, может что то не так прописал. Переменная называется Name в ней Имя и Фамилия человека нужного
Переведите текст ошибки и увидите, что он пытается открыть файл ИМЯ Фамилия, видимо переменную или метод перепутали.
При использовании методов, возможно есть всплывающие подсказки, какие параметры и в каком формате требуются для конкретного метода. Так быстрее найдете в чем ошибка.
 
Спасибо за статью!
 
Последнее редактирование:
  • Спасибо
Реакции: DV_ и samsonnn

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