Изменение размера изображений
Изменение размера изображений

Изменение размера изображений

12 июля 2022       112 просмотров

Итак, какая передо мной стояла задача? Не обосраться. Мне нужно раз за разом жепежки, которые мне дают для сайта пережимать до ширины в 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, чтобы память не засирать, сделал как сделал, отъебитесь, мой говнокод под мои задачи и объемы вполне подходит. А нет — можете подправить, чтобы потешить своё ЧСВ не увеличивать энтропию вселенной сверх меры.