Как заказать у художника 1001 рисунок за 800 рублей

Это первый из заказанных рисунков. Что до остальной тысячи, то о ней под катом.<br /> Aria Midnight<br />
Это первый из заказанных рисунков. Что до остальной тысячи, то о ней под катом.
Aria Midnight

В какой-то момент мне понадобилось много рисунков для оформления канала на ютубе. Очень много рисунков. Пришлось идти на хитрость.

История такая. Есть у меня канал, где я делаю видеоигру. И для него мне понадобилась аватарка и превьюшки к видео. Но есть нюанс. Видео уже с полсотни, и я делаю по три штуки в неделю (стримлю). А художник, к которому я обращаюсь, делаю нормально и недорого, но неторопливо. И даже с этим недорого три рисунка в неделю встанут в копеечку. Казалось бы, ситуация так себе. Нояжпрограммист!

Формирую следующее техзадание:

Окей, два заказа. Один простой, второй сложный:

1) Аватарка для канала. Перерисовать уже имеющийся мемасик с моим понём и вашими цветами.https://support.google.com/youtube/answer/2976309?hl=ru

2) Превью для всех видео. Прошлых и будущих. Я не буду заказывать у вас 30+ рисунков, конечно же. Мне понадобятся один рисунок с местом под три цифры. И десять цифр на прозрачном фоне подходящего размера, из которых я составлю номер стрима, и налеплю его на основной рисунок.https://support.google.com/youtube/answer/72431?hl=ru

Я, Заказчик.

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

В итоге на руки я получил вот такой набор рисунков:

После этого я где-то с часик гуглил, какой библиотекой лучше всего программно шлёпнуть одно изображение поверх другого. Оказалось, что в стандартную библиотеку .NET такое счастье уже входит. Ещё полчаса и программа готова:

using System; using System.Linq; using System.Collections.Generic; using System.Drawing; namespace PreviewCreator { public class Program { static void Main(string[] args) { using (ImagesPool images = new ImagesPool()) { foreach (Int32 number in Enumerable.Range(0, 1000)) CreatePreview(images, number); } } private static void CreatePreview(ImagesPool images, Int32 number) { DecomposeNumber(number, out Int32 hundreds, out Int32 tens, out Int32 ones); using (Image baseImage = images.GetBase()) using (Graphics graphics = Graphics.FromImage(baseImage)) { PutDigit(images, graphics, hundreds, 0); PutDigit(images, graphics, tens, 1); PutDigit(images, graphics, ones, 2); graphics.DrawImage(images.Magic, new Point(0, 0)); baseImage.Save($"result_{hundreds}{tens}{ones}.png"); } } private static void DecomposeNumber(Int32 number, out Int32 hunders, out Int32 tens, out Int32 ones) { hunders = number / 100; tens = number / 10 % 10; ones = number % 10; } private static void PutDigit(ImagesPool images, Graphics graphics, Int32 digit, Int32 position) { Int32 x = 72 + 96 * (position + 2); graphics.DrawImage(images.Digits[digit], new Rectangle(x, 256, 96, 96)); } } internal class ImagesPool : IDisposable { internal Image Magic { get; } = Image.FromFile("magia.png"); internal Image GetBase() => Image.FromFile("vzhukh.png"); internal Dictionary<Int32, Image> Digits { get; } = GetDigits(); public void Dispose() { Magic.Dispose(); foreach (Image d in Digits.Values) d.Dispose(); } private static Dictionary<Int32, Image> GetDigits() { Int32[] digits = new Int32[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; return digits.ToDictionary(d => d, d => Image.FromFile($"{d}.png")); } } }

Если кто-то не умеет в эльфийский, то вкратце план действий такой:

  • Грузим с диска наш наборчик изображений (собран в объекте типа ImagesPool)
  • Для всех чисел от 0 до 999 создаём превьюшку по следующей схеме:
  • Разделяем номер на три цифры
  • Создаём рисунок, состоящий из фона
  • Шлёпаём на него три цифры (PutDigit считает позицию для цифры и лепит её на рисунок)
  • Лепим поверх слой со спецэффектами
  • Сохраняем результат на диск

Так как я вообще не парился по поводу оптимизации, программа вышла достаточно задумчивой. На всё про всё у неё ушло где-то около двух-трёх минут. Но это лучше, чем цеплять всё ручками. Результат работы программы выглядит приблизительно так:

chelovekbeznika и aria midnight<br />
chelovekbeznika и aria midnight

Почему эта статья здесь? Потому что для Хабра она, на мой вкус, недостаточно хардкорна. А вконтактике нельзя код в статью встраивать. А тут для оффтопа в самый раз. Мораль басни? Ну разве что "ищите возможность применить свои профессиональные навыки в быту".

P.S. Мне не простят, если я не оставлю тут ссылку на художницу.

6363
62 комментария

Кликбейтный заголовок. Я аж заявился сюда с горящим факелом !
По факту статья о том ,как имея пару рисунков сделать их большее количество

53
Ответить

Благодарю.

Ответить

А вы тоже хуйцы за деньги рисуете?

Ответить

Ну ты понимаешь, что никто эти бесконечные видео о том, как ты делаешь игру смотреть не будет?

25
Ответить

Сука, опять ебучие кони.

12
Ответить

Я обожаю ебучих коней! Из-за них-то всё и началось...

15
Ответить

Понифаги по немногу захватывают дтф...

3
Ответить