Работа над ошибками (ресайзер изображений)
Работа над ошибками (ресайзер изображений)

Работа над ошибками (ресайзер изображений)

7 февраля 2023       101 просмотр

В общем, помимо прочего, сейчас нужно выпить делать превьюшки не только в 500 пикселей шириной, но и 800.

Заодно допишем нормальное именование файлов при записи и расширим анус маску .GetFiles, чтобы png тоже проходили и выходили.

Итак, как обычно — с подробными пояснениями:

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(@".", "*.??g", 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 ImageWidth = Convert.ToDouble(images[number].Width);//для рассчетов
                    double ImageHeight = Convert.ToDouble(images[number].Height);//типы переменных
                    double NewImageHeight = 2000 / ImageWidth * ImageHeight;//должны быть одинаковы
                    int IntNewImageHeight = Convert.ToInt32(NewImageHeight);//типа округлили
                    Bitmap NewImage = new Bitmap(images[number], 2000, IntNewImageHeight);//создаем новое изображение
                    NewImage.Save(files[number], images[number].RawFormat);//перезаписываем файл
                    Console.WriteLine("original =" + "\t" + images[number].Width + "x" + images[number].Height + "\n" + "resized  =" + "\t" + NewImage.Width + "x" + NewImage.Height);//выведем информацию из какого размера в какой пережали
                    double PreviewHeight = 800 / ImageWidth * ImageHeight;//считаем высоту превьюшки
                    int IntPreviewHeight = Convert.ToInt32(PreviewHeight);//типа округлили
                    string PreviewName = files[number];//создаём строку и присваиваем ей имя текущего файла
                    string Extension = PreviewName.Remove(0, 4);//оставляем последние 4 символа
                    PreviewName = PreviewName.Remove(4);//удаляем последние 4 символа
                    Bitmap PreviewImage = new Bitmap(images[number], 800, IntPreviewHeight);//делаем превьюшку с шириной в 800px
                    PreviewImage.Save(PreviewName+"_0"+Extension, images[number].RawFormat);//и сохраняем её
                    Console.WriteLine("original =" + "\t" + images[number].Width + "x" + images[number].Height + "\n" + "resized  =" + "\t" + PreviewImage.Width + "x" + PreviewImage.Height);//по превьюшке инфу тоже выведем
                    double SmallPreviewHeight = 500 / ImageWidth * ImageHeight;//высота второй превьюшки
                    int IntSmallPreviewHeight = Convert.ToInt32(SmallPreviewHeight);//типа округлили
                    Bitmap SmallPreviewImage = new Bitmap(images[number], 500, IntSmallPreviewHeight);//делаем превьюшку для старого сайта (500px)
                    SmallPreviewImage.Save(PreviewName+"_1"+Extension, images[number].RawFormat);//и сохраняем
                    Console.WriteLine("original =" + "\t" + images[number].Width + "x" + images[number].Height + "\n" + "resized =" + "\t" + SmallPreviewImage.Width+ "x" + SmallPreviewImage.Height);//инфа по второй превьюшке
                }
                else if (images[number].Width <= 2000 && images[number].Width > 800)//для картинок размером от 800 до 2000 — нужно просто сделать превьюшки
                {
                    double ImageWidth = Convert.ToDouble(images[number].Width);//для рассчетов типы переменных
                    double ImageHeight = Convert.ToDouble(images[number].Height);//должны быть одинаковы
                    double PreviewHeight = 800 / ImageWidth * ImageHeight;//считаем высоту превьюшки
                    int IntPreviewHeight = Convert.ToInt32(PreviewHeight);//типа округлили
                    string PreviewName = files[number];//создаём строку и присваиваем ей имя текущего файла
                    string Extension = PreviewName.Remove(0, 4);//оставляем последние 4 символа
                    PreviewName = PreviewName.Remove(4);//удаляем последние 4 символа
                    Bitmap PreviewImage = new Bitmap(images[number], 800, IntPreviewHeight);//делаем превьюшку с шириной в 800px
                    PreviewImage.Save(PreviewName+"_0"+Extension, images[number].RawFormat);//и сохраняем её
                    Console.WriteLine("original =" + "\t" + images[number].Width + "x" + images[number].Height + "\n" + "resized  =" + "\t" + PreviewImage.Width + "x" + PreviewImage.Height);//инфа по превьюшке
                    double SmallPreviewHeight = 500 / ImageWidth * ImageHeight;//высота второй превьюшки
                    int IntSmallPreviewHeight = Convert.ToInt32(SmallPreviewHeight);//типа округлили
                    Bitmap SmallPreviewImage = new Bitmap(images[number], 500, IntSmallPreviewHeight);//делаем превьюшку для старого сайта (500px)
                    SmallPreviewImage.Save(PreviewName+"_1"+Extension, images[number].RawFormat);//и сохраняем
                    Console.WriteLine("original =" + "\t" + images[number].Width + "x" + images[number].Height + "\n" + "resized =" + "\t" + SmallPreviewImage.Width + "x" + SmallPreviewImage.Height);//инфа по второй превьюшке
                }
                else if (images[number].Width <= 800 && images[number].Width > 500)//если такие вообще будут
                {
                    double ImageWidth = Convert.ToDouble(images[number].Width);//не буду
                    double ImageHeigh = Convert.ToDouble(images[number].Height);//повторяться
                    double SmallPreviewHeight = 500 / ImageWidth * ImageHeigh;//высота второй превьюшки
                    int IntSmallPreviewHeight = Convert.ToInt32(SmallPreviewHeight);//типа округлили
                    string PreviewName = files[number];//делаем строку и суём туда имя файла
                    string Extension = PreviewName.Remove(0, 4);//оставляем последние 4 символа
                    PreviewName = PreviewName.Remove(4);//убираем последние 4 символа
                    Bitmap SmallPreviewImage = new Bitmap(images[number], 500, IntSmallPreviewHeight);//делаем превьюшку для старого сайта (500px)
                    SmallPreviewImage.Save(PreviewName+"_1"+Extension, images[number].RawFormat);//и сохраняем
                    Console.WriteLine("original =" + "\t" + images[number].Width + "x" + images[number].Height + "\n" + "resized =" + "\t" + SmallPreviewImage.Width + "x" + SmallPreviewImage.Height);//инфа по превьюшке для старого сайта
                }
                else
                {
                    Console.WriteLine("original = " + "\t" + images[number].Width + "x" + images[number].Height);//просто покажем размер оригинала
                }
            }
            stopwatch.Stop();//останавливаем счетчик
            Console.WriteLine("done in " + stopwatch.ElapsedMilliseconds + " ms" + "\n" + "press any key");//смотрим сколько времени ушло на обработку
            Console.ReadKey();//жмакай уже что-нибудь
        }
    }
}

До кучи — заименовал переменные, чтобы было понятнее для тех кто инглиш, мазафака, ду ю спик ит.

Пример работы:

больше превьюшек

богу превьюшек