mirror of
https://github.com/zs-yg/kortapp-z.git
synced 2025-12-07 00:20:43 +08:00
187 lines
6.9 KiB
C#
187 lines
6.9 KiB
C#
using System;
|
||
using System.Drawing;
|
||
using System.Windows.Forms;
|
||
using System.IO;
|
||
using AppStore.Tools.IconExtractor;
|
||
|
||
namespace AppStore.Tools.IconExtractor
|
||
{
|
||
public class IconExtractorForm : Form
|
||
{
|
||
private Button btnBrowse = new Button();
|
||
private Button btnSave = new Button();
|
||
private NumericUpDown numIconIndex = new NumericUpDown();
|
||
private PictureBox picIcon = new PictureBox();
|
||
private Label lblStatus = new Label();
|
||
private TextBox txtFilePath = new TextBox();
|
||
private ComboBox cmbIconSize = new ComboBox();
|
||
private string currentFilePath = string.Empty;
|
||
|
||
public IconExtractorForm()
|
||
{
|
||
this.Text = "图标提取器";
|
||
this.Size = new Size(500, 550);
|
||
this.StartPosition = FormStartPosition.CenterScreen;
|
||
InitializeComponents();
|
||
}
|
||
|
||
private void InitializeComponents()
|
||
{
|
||
// 文件路径文本框
|
||
txtFilePath.Location = new Point(20, 20);
|
||
txtFilePath.Size = new Size(300, 25);
|
||
txtFilePath.ReadOnly = true;
|
||
this.Controls.Add(txtFilePath);
|
||
|
||
// 浏览按钮
|
||
btnBrowse.Text = "浏览...";
|
||
btnBrowse.Location = new Point(330, 20);
|
||
btnBrowse.Size = new Size(80, 25);
|
||
btnBrowse.Click += BtnBrowse_Click;
|
||
this.Controls.Add(btnBrowse);
|
||
|
||
// 图标索引标签
|
||
Label lblIndex = new Label();
|
||
lblIndex.Text = "图标索引:";
|
||
lblIndex.Location = new Point(20, 60);
|
||
lblIndex.Size = new Size(80, 20);
|
||
this.Controls.Add(lblIndex);
|
||
|
||
// 图标索引选择器
|
||
numIconIndex.Location = new Point(100, 60);
|
||
numIconIndex.Size = new Size(80, 20);
|
||
numIconIndex.Minimum = 0;
|
||
numIconIndex.ValueChanged += NumIconIndex_ValueChanged;
|
||
this.Controls.Add(numIconIndex);
|
||
|
||
// 图标预览区域
|
||
picIcon.Location = new Point(20, 100);
|
||
picIcon.Size = new Size(256, 256);
|
||
picIcon.SizeMode = PictureBoxSizeMode.Zoom;
|
||
picIcon.BorderStyle = BorderStyle.FixedSingle;
|
||
this.Controls.Add(picIcon);
|
||
|
||
// 索引说明
|
||
Label lblIndexHelp = new Label();
|
||
lblIndexHelp.Text = "索引号表示文件中的第几个图标,从0开始";
|
||
lblIndexHelp.Location = new Point(20, 240);
|
||
lblIndexHelp.Size = new Size(300, 20);
|
||
this.Controls.Add(lblIndexHelp);
|
||
|
||
// 保存按钮
|
||
btnSave.Text = "保存图标";
|
||
btnSave.Location = new Point(20, 450);
|
||
btnSave.Size = new Size(100, 30);
|
||
btnSave.Click += BtnSave_Click;
|
||
this.Controls.Add(btnSave);
|
||
|
||
// 状态标签
|
||
lblStatus.Location = new Point(20, 490);
|
||
lblStatus.Size = new Size(400, 20);
|
||
lblStatus.Text = "请选择包含图标的文件";
|
||
this.Controls.Add(lblStatus);
|
||
}
|
||
|
||
private void BtnBrowse_Click(object sender, EventArgs e)
|
||
{
|
||
using (OpenFileDialog ofd = new OpenFileDialog())
|
||
{
|
||
ofd.Filter = "可执行文件|*.exe;*.dll;*.ocx;*.cpl|所有文件|*.*";
|
||
if (ofd.ShowDialog() == DialogResult.OK)
|
||
{
|
||
currentFilePath = ofd.FileName;
|
||
txtFilePath.Text = currentFilePath;
|
||
LoadIconInfo();
|
||
}
|
||
}
|
||
}
|
||
|
||
private void LoadIconInfo()
|
||
{
|
||
try
|
||
{
|
||
int iconCount = IconExtractor.GetIconCount(currentFilePath);
|
||
numIconIndex.Maximum = Math.Max(0, iconCount - 1);
|
||
|
||
// 如果是ICO文件,获取实际包含的尺寸
|
||
if (currentFilePath.EndsWith(".ico", StringComparison.OrdinalIgnoreCase))
|
||
{
|
||
var sizes = IconExtractor.GetIconDimensions(currentFilePath);
|
||
if (sizes.Count > 0)
|
||
{
|
||
cmbIconSize.Items.Clear();
|
||
foreach (var size in sizes)
|
||
{
|
||
cmbIconSize.Items.Add($"{size}x{size}");
|
||
}
|
||
|
||
// 默认选择最接近256的尺寸
|
||
int closest = sizes.OrderBy(s => Math.Abs(s - 256)).First();
|
||
cmbIconSize.SelectedIndex = sizes.IndexOf(closest);
|
||
}
|
||
}
|
||
|
||
lblStatus.Text = $"找到 {iconCount} 个图标";
|
||
ExtractAndDisplayIcon();
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
lblStatus.Text = $"错误: {ex.Message}";
|
||
picIcon.Image = null;
|
||
}
|
||
}
|
||
|
||
private void NumIconIndex_ValueChanged(object sender, EventArgs e)
|
||
{
|
||
if (!string.IsNullOrEmpty(currentFilePath))
|
||
{
|
||
ExtractAndDisplayIcon();
|
||
}
|
||
}
|
||
|
||
private void ExtractAndDisplayIcon()
|
||
{
|
||
try
|
||
{
|
||
Icon icon = IconExtractor.ExtractIconFromFile(currentFilePath, (int)numIconIndex.Value);
|
||
picIcon.Image = icon.ToBitmap();
|
||
lblStatus.Text = $"显示原始图标 #{numIconIndex.Value}";
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
lblStatus.Text = $"提取图标失败: {ex.Message}";
|
||
picIcon.Image = null;
|
||
}
|
||
}
|
||
|
||
private void BtnSave_Click(object sender, EventArgs e)
|
||
{
|
||
if (picIcon.Image == null)
|
||
{
|
||
MessageBox.Show("没有可保存的图标", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
||
return;
|
||
}
|
||
|
||
using (SaveFileDialog sfd = new SaveFileDialog())
|
||
{
|
||
sfd.Filter = "图标文件|*.ico|位图文件|*.bmp|PNG文件|*.png";
|
||
if (sfd.ShowDialog() == DialogResult.OK)
|
||
{
|
||
try
|
||
{
|
||
using (Icon icon = IconExtractor.ExtractIconFromFile(currentFilePath, (int)numIconIndex.Value))
|
||
{
|
||
IconExtractor.SaveIconToFile(icon, sfd.FileName);
|
||
lblStatus.Text = $"已保存原始图标到 {sfd.FileName}";
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
MessageBox.Show($"保存图标失败: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|