Работа над ошибками (ресайзер изображений)
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();//жмакай уже что-нибудь
}
}
}
До кучи — заименовал переменные, чтобы было понятнее для тех кто инглиш, мазафака, ду ю спик ит.
Пример работы:

