Изменение размера изображений
Итак, какая передо мной стояла задача? Не обосраться. Мне нужно раз за разом жепежки, которые мне дают для сайта пережимать до ширины в 2000 пикселей и делать превьюшки к ним, шириной в 500 пикселей. В определенный момент я подумал, что меня уже заебало возюкать мышой в этих ваших графических редакторах на это можно тратить и поменьше времени, потому было принято волевое решение немедленно выпить пива набросать код, который окончательно решит еврейский вопрос эту задачу.
Ну, и по традиции, всё хорошенько пояснено комментариями, чтобы мог разобраться даже ишак инженер Роснано:
using System;
using System.IO;
using System.Drawing;
using System.Diagnostics;
namespace resizer
{
internal class Program
{
static void Main(string[] args)
{
var stopwatch = new Stopwatch();//создаем и
stopwatch.Start();//запускаем счетчик
string[] files = Directory.GetFiles(@".", "*.jpg", SearchOption.AllDirectories);//читаем жепежки из локальной директории
Bitmap[] images = new Bitmap[files.Length];//и создаем из них массив
for (int number = 0; number < images.Length; number++)//а теперь пройдёмся по каждому элементу массива
{
images[number] = new Bitmap(files[number]);
if (images[number].Width > 2000)// для начала нам нужно ужать картинки слоновьего размера до 2000px в ширину
{
double iwo = Convert.ToDouble(images[number].Width);//для рассчетов
double iho = Convert.ToDouble(images[number].Height);//типы переменных
double heighto = 2000 / iwo * iho;//должны быть одинаковы
int iheighto = Convert.ToInt32(heighto);//типа округлили
Bitmap newimage = new Bitmap(images[number], 2000, iheighto);//создаем новое изображение
newimage.Save(files[number]+"_0.jpg", images[number].RawFormat);//и сохраняем его
Console.WriteLine("original =" + "\t" + images[number].Width + "x" + images[number].Height + "\n" + "resized =" + "\t" + newimage.Width + "x" + newimage.Height);//выведем информацию из какого размера в какой пережали
double iw = Convert.ToDouble(images[number].Width);//для рассчетов
double ih = Convert.ToDouble(images[number].Height);//типы переменных
double height = 500 / iw * ih;//должны быть одинаковы
int iheight = Convert.ToInt32(height);//типа округлили
Bitmap preview = new Bitmap(images[number], 500, iheight);//делаем превьюшку с шириной в 500px
preview.Save(files[number] + "_1.jpg", images[number].RawFormat);//и сохраняем её
Console.WriteLine("original =" + "\t" + images[number].Width + "x" + images[number].Height + "\n" + "resized =" + "\t" + preview.Width + "x" + preview.Height);//по превьюшке инфу тоже выведем
}
else if (images[number].Width <= 2000 && images[number].Width > 500)//для картинок размером от 500 до 2000 — нужно просто сделать превьюшки
{
double iw = Convert.ToDouble(images[number].Width);//для рассчетов
double ih = Convert.ToDouble(images[number].Height);//типы переменных
double height = 500 / iw * ih;//должны быть одинаковы
int iheight = Convert.ToInt32(height);//типа округлили
Bitmap preview = new Bitmap(images[number], 500, iheight);//делаем превьюшку с шириной в 500px
preview.Save(files[number]+"_1.jpg", images[number].RawFormat);//и сохраняем её
Console.WriteLine("original =" + "\t" + images[number].Width + "x" + images[number].Height + "\n" + "resized =" + "\t" + preview.Width + "x" + preview.Height);//выведем информацию о размерах
}
else
{
images[number].Save(files[number]+"_0.jpg", images[number].RawFormat);//в принципе этого можно было и не делать
Console.WriteLine("original = " + images[number].Width + "x" + images[number].Height);//но пусть имена файлов будут шаблонные
}
}
stopwatch.Stop();//останавливаем счетчик
Console.WriteLine("done in " + stopwatch.ElapsedMilliseconds + " ms");//смотрим сколько времени ушло на обработку
Console.ReadKey();
}
}
}
Да, я знаю, что когда картинок дохуя, то лучше использовать метод EnumerateFiles вместо GetFiles, чтобы память не засирать, сделал как сделал, отъебитесь, мой говнокод под мои задачи и объемы вполне подходит. А нет — можете подправить, чтобы потешить своё ЧСВ не увеличивать энтропию вселенной сверх меры.