Сжатие файлов JPG в каталоге в C#
Я написал этот пример, чтобы помочь создать уменьшенные версии некоторых из тысяч фотографий, которые я собирал за эти годы. К сожалению, фотографии, которые вы снимаете с современной камерой или телефоном, как правило, огромны. К счастью, большинству моих родственников и друзей Facebook обычно не нужно видеть изображения с их оригинальной точностью. Обычно вы можете немного уменьшить уровень сжатия, чтобы сжать файлы JPG и создать изображение, которое по-прежнему выглядит хорошо на компьютере, но занимает гораздо меньше места.
Пример показывает, как настроить сжатие JPG-файла для экономии места. В этом примере применяется этот метод для сжатия JPG-файлов в каталоге. Следующий код показывает ключевой цикл, используемый в этом примере.
// Прокручиваем файлы JPEG.
string dir_name = txtFolder.Text;
foreach (string file_name in
Directory.GetFiles(dir_name, "*.jp*g"))
{
// Обработать этот файл.
try
{
// Обновляем исходный размер.
long file_size = new FileInfo(file_name).Length;
original_size += file_size;
txtOriginalTotalSize.Text = original_size.ToFileSizeApi();
if (set_level)
{
// Сохраним файл на нужном уровне.
using (Bitmap bm = ImageStuff.LoadBitmap(file_name))
{
ImageStuff.SaveJpg(bm, file_name, level);
}
}
else
{
// Сохраним файл размером не более, чем желаемый размер.
if (file_size > max_size)
{
using (Bitmap bm = ImageStuff.LoadBitmap(file_name))
{
ImageStuff.SaveJpgAtFileSize(
bm, file_name, max_size);
}
}
}
// Обновляем окончательный размер.
final_size += new FileInfo(file_name).Length;
txtFinalTotalSize.Text = final_size.ToFileSizeApi();
num_files++;
txtFilesProcessed.Text = num_files.ToString();
txtFilesProcessed.Refresh();
txtOriginalTotalSize.Refresh();
txtFinalTotalSize.Refresh();
if (num_files % 10 == 0) Application.DoEvents();
}
catch (Exception ex)
{
// Отображение сообщения об ошибке и
// даем пользователю возможность остановиться.
if (MessageBox.Show("Error compressing file " +
file_name + "\n" + ex.Message +
"\nDo you want to continue?",
"Error", MessageBoxButtons.YesNo,
MessageBoxIcon.Error) == DialogResult.No)
{
break;
}
}
}
В коде используется Directory.GetFiles, чтобы получить массив, содержащий файлы, которые заканчиваются на .jpg или .jpeg. Для каждого файла программа либо вызывает SaveJpg, либо SaveJpgAtFileSize, чтобы сохранить файл с новым уровнем сжатия или с новым максимальным размером, в зависимости от того, выбран ли выбранный уровень сжатия радио.
Загрузите пример, чтобы увидеть остальную часть кода.
Обратите внимание, что код не открывается, если установлен переключатель «Установить максимальный размер файла», а размер файла уже достаточно мал. Это экономит немало времени. Это также мешает программе повторно сохранять файл, если это не нужно, что может снизить качество файла без уважительной причины.
