mirror of
https://github.com/zs-yg/kortapp-z.git
synced 2025-12-06 16:10:42 +08:00
添加图标提取器代码
This commit is contained in:
186
tools/ico_extractor/IconExtractorForm.cs
Normal file
186
tools/ico_extractor/IconExtractorForm.cs
Normal file
@@ -0,0 +1,186 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user