Загрузка данных
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using ImageMagick;
using FFMpegCore;
using Spire.Presentation;
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", "bmp", "tiff" },
["Audio"] = new List<string> { "mp3", "wav", "aac", "ogg" },
["Video"] = new List<string> { "mp4", "mkv", "mov", "avi" },
["Pres"] = new List<string> { "Извлечь фото (PPTX)" }
};
public Form1()
{
InitializeComponent();
SetupTools();
// Стартовый набор форматов
cmbTargetFormat.Items.AddRange(_categories["Image"].ToArray());
cmbTargetFormat.SelectedIndex = 0;
}
private void SetupTools()
{
string baseDir = AppDomain.CurrentDomain.BaseDirectory;
MagickNET.SetGhostscriptDirectory(baseDir);
GlobalFFOptions.Configure(options => options.BinaryFolder = baseDir);
}
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()!);
// Умное определение: смотрим на первый файл
string firstExt = Path.GetExtension(_selectedFiles[0]).ToLower().Replace(".", "");
UpdateFormatList(firstExt);
}
}
}
private void UpdateFormatList(string ext)
{
cmbTargetFormat.Items.Clear();
if (_categories["Image"].Contains(ext))
cmbTargetFormat.Items.AddRange(_categories["Image"].ToArray());
else if (ext == "pptx")
cmbTargetFormat.Items.AddRange(_categories["Pres"].ToArray());
else {
cmbTargetFormat.Items.AddRange(_categories["Video"].ToArray());
cmbTargetFormat.Items.AddRange(_categories["Audio"].ToArray());
}
if (cmbTargetFormat.Items.Count > 0) cmbTargetFormat.SelectedIndex = 0;
}
private void btnClear_Click(object sender, EventArgs e)
{
lstFiles.Items.Clear();
_selectedFiles = null;
lblStatus.Text = "Статус: Ожидание";
progressBar.Value = 0;
}
private async void btnStart_Click(object sender, EventArgs e)
{
if (_selectedFiles == null || _selectedFiles.Length == 0) return;
string savePath = "";
using (FolderBrowserDialog fbd = new FolderBrowserDialog { Description = "Куда сохранить результат?" })
{
if (fbd.ShowDialog() == DialogResult.OK) savePath = fbd.SelectedPath;
else return;
}
btnStart.Enabled = false;
string selectedMode = cmbTargetFormat.SelectedItem.ToString()!;
progressBar.Maximum = _selectedFiles.Length;
progressBar.Value = 0;
foreach (var file in _selectedFiles)
{
try
{
string ext = Path.GetExtension(file).ToLower().Replace(".", "");
lblStatus.Text = $"Обработка: {Path.GetFileName(file)}...";
if (ext == "pptx" && selectedMode == "Извлечь фото (PPTX)")
{
await Task.Run(() => ExtractPhotosFromPptx(file, savePath));
}
else if (_categories["Image"].Contains(ext))
{
string outPath = Path.Combine(savePath, Path.GetFileNameWithoutExtension(file) + "_conv." + selectedMode.ToLower());
await Task.Run(() => {
using (var img = new MagickImage(file)) img.Write(outPath);
});
}
else
{
string outPath = Path.Combine(savePath, Path.GetFileNameWithoutExtension(file) + "_conv." + selectedMode.ToLower());
await FFMpegArguments.FromFileInput(file)
.OutputToFile(outPath, true, opt => opt.WithSpeedPreset(Speed.Fast))
.ProcessAsynchronously();
}
}
catch (Exception ex)
{
MessageBox.Show($"Ошибка в {Path.GetFileName(file)}: {ex.Message}");
}
progressBar.Value++;
}
lblStatus.Text = "Готово!";
btnStart.Enabled = true;
MessageBox.Show("Конвертация завершена!");
}
private void ExtractPhotosFromPptx(string input, string outputDir)
{
Presentation ppt = new Presentation();
ppt.LoadFromFile(input);
string name = Path.GetFileNameWithoutExtension(input);
for (int i = 0; i < ppt.Images.Count; i++)
{
File.WriteAllBytes(Path.Combine(outputDir, $"{name}_img_{i}.png"), ppt.Images[i].Data);
}
}
}
}