Загрузка данных
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using ImageMagick;
using FFMpegCore;
namespace UniversalConverter
{
public partial class Form1 : Form
{
private string[] _selectedFiles;
// Категории форматов
private readonly Dictionary<string, List<string>> _categories = new Dictionary<string, List<string>>
{
["Image"] = new List<string> { "jpg", "png", "webp", "avif", "bmp", "tiff", "gif", "ico" },
["Audio"] = new List<string> { "mp3", "wav", "flac", "aac", "ogg" },
["Video"] = new List<string> { "mp4", "mkv", "mov", "avi", "webm" }
};
public Form1()
{
InitializeComponent();
// Заполняем список форматов при старте (по умолчанию картинки)
cmbTargetFormat.Items.AddRange(_categories["Image"].ToArray());
cmbTargetFormat.SelectedIndex = 0;
}
private void btnSelect_Click(object sender, EventArgs e)
{
using (OpenFileDialog ofd = new OpenFileDialog { Multiselect = true })
{
if (ofd.ShowDialog() == DialogResult.OK)
{
_selectedFiles = ofd.FileNames;
lstFiles.Items.Clear();
lstFiles.Items.AddRange(_selectedFiles.Select(Path.GetFileName).ToArray());
// Умное определение формата: смотрим на первый файл и подгружаем нужные форматы
UpdateFormatList(Path.GetExtension(_selectedFiles[0]).ToLower().Replace(".", ""));
}
}
}
private void UpdateFormatList(string ext)
{
cmbTargetFormat.Items.Clear();
if (_categories["Image"].Contains(ext))
cmbTargetFormat.Items.AddRange(_categories["Image"].ToArray());
else {
cmbTargetFormat.Items.AddRange(_categories["Video"].ToArray());
cmbTargetFormat.Items.AddRange(_categories["Audio"].ToArray());
}
if (cmbTargetFormat.Items.Count > 0) cmbTargetFormat.SelectedIndex = 0;
}
private async void btnStart_Click(object sender, EventArgs e)
{
if (_selectedFiles == null || _selectedFiles.Length == 0) return;
// ШАГ 1: Как в браузере — сначала спрашиваем, куда сохранить результат
string savePath = "";
using (FolderBrowserDialog fbd = new FolderBrowserDialog { Description = "Выберите папку для сохранения готовых файлов" })
{
if (fbd.ShowDialog() == DialogResult.OK)
{
savePath = fbd.SelectedPath;
}
else return; // Пользователь передумал
}
// ШАГ 2: Процесс конвертации
btnStart.Enabled = false;
string targetExt = "." + cmbTargetFormat.SelectedItem.ToString();
progressBar.Maximum = _selectedFiles.Length;
progressBar.Value = 0;
foreach (var file in _selectedFiles)
{
try
{
string outName = Path.GetFileNameWithoutExtension(file) + "_converted" + targetExt;
string finalPath = Path.Combine(savePath, outName);
string ext = Path.GetExtension(file).ToLower().Replace(".", "");
lblStatus.Text = $"Обработка: {Path.GetFileName(file)}...";
if (_categories["Image"].Contains(ext))
{
await Task.Run(() => {
using (var img = new MagickImage(file)) img.Write(finalPath);
});
}
else
{
await FFMpegArguments.FromFileInput(file).OutputToFile(finalPath).ProcessAsynchronously();
}
}
catch (Exception ex)
{
MessageBox.Show($"Ошибка в файле {Path.GetFileName(file)}: {ex.Message}");
}
progressBar.Value++;
}
lblStatus.Text = "Готово! Все файлы в выбранной папке.";
btnStart.Enabled = true;
MessageBox.Show("Конвертация завершена!");
}
}
}