diff --git a/tools/Calculator.cs b/tools/Calculator.cs
index a6e018e..7c0def6 100644
--- a/tools/Calculator.cs
+++ b/tools/Calculator.cs
@@ -1,34 +1,34 @@
-using System;
-
-namespace AppStore
-{
- ///
- /// 提供基本数学运算功能的工具类
- ///
- public static class Calculator
- {
- ///
- /// 加法运算
- ///
- public static double Add(double a, double b) => a + b;
-
- ///
- /// 减法运算
- ///
- public static double Subtract(double a, double b) => a - b;
-
- ///
- /// 乘法运算
- ///
- public static double Multiply(double a, double b) => a * b;
-
- ///
- /// 除法运算
- ///
- public static double Divide(double a, double b)
- {
- if (b == 0) throw new DivideByZeroException("除数不能为零");
- return a / b;
- }
- }
-}
+using System;
+
+namespace AppStore
+{
+ ///
+ /// 提供基本数学运算功能的工具类
+ ///
+ public static class Calculator
+ {
+ ///
+ /// 加法运算
+ ///
+ public static double Add(double a, double b) => a + b;
+
+ ///
+ /// 减法运算
+ ///
+ public static double Subtract(double a, double b) => a - b;
+
+ ///
+ /// 乘法运算
+ ///
+ public static double Multiply(double a, double b) => a * b;
+
+ ///
+ /// 除法运算
+ ///
+ public static double Divide(double a, double b)
+ {
+ if (b == 0) throw new DivideByZeroException("除数不能为零");
+ return a / b;
+ }
+ }
+}
diff --git a/tools/CalculatorForm.cs b/tools/CalculatorForm.cs
index d00cfcf..4b59b5d 100644
--- a/tools/CalculatorForm.cs
+++ b/tools/CalculatorForm.cs
@@ -1,118 +1,118 @@
-using System;
-using System.Drawing;
-using System.Windows.Forms;
-using AppStore;
-
-namespace AppStore
-{
- public class CalculatorForm : Form
- {
- private TextBox display = new TextBox();
- private double firstNumber = 0;
- private string operation = "";
-
- public CalculatorForm()
- {
- this.Text = "计算器";
- this.Size = new Size(300, 400);
- this.StartPosition = FormStartPosition.CenterScreen;
- CreateControls();
- }
-
- private void CreateControls()
- {
- // 显示框
- display = new TextBox();
- display.ReadOnly = true;
- display.TextAlign = HorizontalAlignment.Right;
- display.Font = new Font("Microsoft YaHei", 14);
- display.Size = new Size(260, 40);
- display.Location = new Point(20, 20);
- this.Controls.Add(display);
-
- // 按钮布局
- string[] buttonLabels = {
- "7", "8", "9", "/",
- "4", "5", "6", "*",
- "1", "2", "3", "-",
- "0", ".", "=", "+"
- };
-
- for (int i = 0; i < buttonLabels.Length; i++)
- {
- var btn = new Button();
- btn.Text = buttonLabels[i];
- btn.Size = new Size(60, 50);
- btn.Location = new Point(20 + (i % 4) * 65, 70 + (i / 4) * 55);
- btn.Font = new Font("Microsoft YaHei", 12);
- btn.Click += ButtonClickHandler;
- this.Controls.Add(btn);
- }
-
- // 清除按钮
- var clearBtn = new Button();
- clearBtn.Text = "C";
- clearBtn.Size = new Size(260, 40);
- clearBtn.Location = new Point(20, 300);
- clearBtn.Font = new Font("Microsoft YaHei", 12);
- clearBtn.Click += (s, e) => {
- display.Text = "";
- firstNumber = 0;
- operation = "";
- };
- this.Controls.Add(clearBtn);
- }
-
- private void ButtonClickHandler(object sender, EventArgs e)
- {
- var button = sender as Button;
- if (button == null) return;
-
- switch (button.Text)
- {
- case "+":
- case "-":
- case "*":
- case "/":
- if (!string.IsNullOrEmpty(display.Text))
- {
- firstNumber = double.Parse(display.Text);
- operation = button.Text;
- display.Text = "";
- }
- break;
-
- case "=":
- if (!string.IsNullOrEmpty(operation) && !string.IsNullOrEmpty(display.Text))
- {
- double secondNumber = double.Parse(display.Text);
- double result = 0;
-
- try
- {
- result = operation switch
- {
- "+" => AppStore.Calculator.Add(firstNumber, secondNumber),
- "-" => AppStore.Calculator.Subtract(firstNumber, secondNumber),
- "*" => AppStore.Calculator.Multiply(firstNumber, secondNumber),
- "/" => AppStore.Calculator.Divide(firstNumber, secondNumber),
- _ => 0
- };
-
- display.Text = result.ToString();
- }
- catch (DivideByZeroException)
- {
- MessageBox.Show("除数不能为零", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
- }
- operation = "";
- }
- break;
-
- default:
- display.Text += button.Text;
- break;
- }
- }
- }
-}
+using System;
+using System.Drawing;
+using System.Windows.Forms;
+using AppStore;
+
+namespace AppStore
+{
+ public class CalculatorForm : Form
+ {
+ private TextBox display = new TextBox();
+ private double firstNumber = 0;
+ private string operation = "";
+
+ public CalculatorForm()
+ {
+ this.Text = "计算器";
+ this.Size = new Size(300, 400);
+ this.StartPosition = FormStartPosition.CenterScreen;
+ CreateControls();
+ }
+
+ private void CreateControls()
+ {
+ // 显示框
+ display = new TextBox();
+ display.ReadOnly = true;
+ display.TextAlign = HorizontalAlignment.Right;
+ display.Font = new Font("Microsoft YaHei", 14);
+ display.Size = new Size(260, 40);
+ display.Location = new Point(20, 20);
+ this.Controls.Add(display);
+
+ // 按钮布局
+ string[] buttonLabels = {
+ "7", "8", "9", "/",
+ "4", "5", "6", "*",
+ "1", "2", "3", "-",
+ "0", ".", "=", "+"
+ };
+
+ for (int i = 0; i < buttonLabels.Length; i++)
+ {
+ var btn = new Button();
+ btn.Text = buttonLabels[i];
+ btn.Size = new Size(60, 50);
+ btn.Location = new Point(20 + (i % 4) * 65, 70 + (i / 4) * 55);
+ btn.Font = new Font("Microsoft YaHei", 12);
+ btn.Click += ButtonClickHandler;
+ this.Controls.Add(btn);
+ }
+
+ // 清除按钮
+ var clearBtn = new Button();
+ clearBtn.Text = "C";
+ clearBtn.Size = new Size(260, 40);
+ clearBtn.Location = new Point(20, 300);
+ clearBtn.Font = new Font("Microsoft YaHei", 12);
+ clearBtn.Click += (s, e) => {
+ display.Text = "";
+ firstNumber = 0;
+ operation = "";
+ };
+ this.Controls.Add(clearBtn);
+ }
+
+ private void ButtonClickHandler(object sender, EventArgs e)
+ {
+ var button = sender as Button;
+ if (button == null) return;
+
+ switch (button.Text)
+ {
+ case "+":
+ case "-":
+ case "*":
+ case "/":
+ if (!string.IsNullOrEmpty(display.Text))
+ {
+ firstNumber = double.Parse(display.Text);
+ operation = button.Text;
+ display.Text = "";
+ }
+ break;
+
+ case "=":
+ if (!string.IsNullOrEmpty(operation) && !string.IsNullOrEmpty(display.Text))
+ {
+ double secondNumber = double.Parse(display.Text);
+ double result = 0;
+
+ try
+ {
+ result = operation switch
+ {
+ "+" => AppStore.Calculator.Add(firstNumber, secondNumber),
+ "-" => AppStore.Calculator.Subtract(firstNumber, secondNumber),
+ "*" => AppStore.Calculator.Multiply(firstNumber, secondNumber),
+ "/" => AppStore.Calculator.Divide(firstNumber, secondNumber),
+ _ => 0
+ };
+
+ display.Text = result.ToString();
+ }
+ catch (DivideByZeroException)
+ {
+ MessageBox.Show("除数不能为零", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ operation = "";
+ }
+ break;
+
+ default:
+ display.Text += button.Text;
+ break;
+ }
+ }
+ }
+}
diff --git a/tools/CalculatorToolCard.cs b/tools/CalculatorToolCard.cs
index 4044524..8661c70 100644
--- a/tools/CalculatorToolCard.cs
+++ b/tools/CalculatorToolCard.cs
@@ -1,38 +1,38 @@
-using System;
-using System.Drawing;
-using System.Windows.Forms;
-
-namespace AppStore
-{
- public class CalculatorToolCard : ToolCard
- {
- public CalculatorToolCard()
- {
- ToolName = "计算器";
- try
- {
- string iconPath = Path.Combine(Application.StartupPath, "img", "resource", "png", "Calculator.png");
- if (File.Exists(iconPath))
- {
- ToolIcon = Image.FromFile(iconPath);
- }
- else
- {
- ToolIcon = SystemIcons.Application.ToBitmap();
- }
- }
- catch
- {
- ToolIcon = SystemIcons.Application.ToBitmap();
- }
- this.ToolCardClicked += OnCalculatorCardClicked;
- UpdateDisplay();
- }
-
- private void OnCalculatorCardClicked(object sender, EventArgs e)
- {
- var calculatorForm = new CalculatorForm();
- calculatorForm.ShowDialog();
- }
- }
-}
+using System;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace AppStore
+{
+ public class CalculatorToolCard : ToolCard
+ {
+ public CalculatorToolCard()
+ {
+ ToolName = "计算器";
+ try
+ {
+ string iconPath = Path.Combine(Application.StartupPath, "img", "resource", "png", "Calculator.png");
+ if (File.Exists(iconPath))
+ {
+ ToolIcon = Image.FromFile(iconPath);
+ }
+ else
+ {
+ ToolIcon = SystemIcons.Application.ToBitmap();
+ }
+ }
+ catch
+ {
+ ToolIcon = SystemIcons.Application.ToBitmap();
+ }
+ this.ToolCardClicked += OnCalculatorCardClicked;
+ UpdateDisplay();
+ }
+
+ private void OnCalculatorCardClicked(object sender, EventArgs e)
+ {
+ var calculatorForm = new CalculatorForm();
+ calculatorForm.ShowDialog();
+ }
+ }
+}
diff --git a/tools/QrCodeGenerator.cs b/tools/QrCodeGenerator.cs
index d845005..70dd894 100644
--- a/tools/QrCodeGenerator.cs
+++ b/tools/QrCodeGenerator.cs
@@ -1,136 +1,136 @@
-using System;
-using System.Drawing;
-using System.Windows.Forms;
-using ZXing;
-using ZXing.Common;
-using ZXing.QrCode;
-
-namespace AppStore
-{
- public class QrCodeGeneratorForm : Form
- {
- private TextBox? inputTextBox;
- private PictureBox? qrCodePictureBox;
- private Button? generateButton;
- private Button? saveButton;
-
- public QrCodeGeneratorForm()
- {
- InitializeComponent();
- this.Text = "二维码生成器";
- this.Size = new Size(500, 600);
- this.StartPosition = FormStartPosition.CenterScreen;
- this.FormBorderStyle = FormBorderStyle.FixedDialog;
- this.MaximizeBox = false;
- }
-
- private void InitializeComponent()
- {
- // 输入文本框
- inputTextBox = new TextBox();
- inputTextBox.Multiline = true;
- inputTextBox.ScrollBars = ScrollBars.Vertical;
- inputTextBox.Size = new Size(400, 100);
- inputTextBox.Location = new Point(50, 30);
- inputTextBox.PlaceholderText = "请输入要生成二维码的文本内容...";
- this.Controls.Add(inputTextBox);
-
- // 生成按钮
- generateButton = new Button();
- generateButton.Text = "生成二维码";
- generateButton.Size = new Size(150, 40);
- generateButton.Location = new Point(50, 150);
- generateButton.Click += GenerateButton_Click;
- this.Controls.Add(generateButton);
-
- // 二维码显示区域
- qrCodePictureBox = new PictureBox();
- qrCodePictureBox.Size = new Size(300, 300);
- qrCodePictureBox.Location = new Point(100, 220);
- qrCodePictureBox.SizeMode = PictureBoxSizeMode.StretchImage;
- qrCodePictureBox.BorderStyle = BorderStyle.FixedSingle;
- this.Controls.Add(qrCodePictureBox);
-
- // 保存按钮
- saveButton = new Button();
- saveButton.Text = "保存二维码";
- saveButton.Size = new Size(150, 40);
- saveButton.Location = new Point(300, 150);
- saveButton.Click += SaveButton_Click;
- this.Controls.Add(saveButton);
- }
-
- private void GenerateButton_Click(object sender, EventArgs e)
- {
- if (string.IsNullOrWhiteSpace(inputTextBox?.Text))
- {
- MessageBox.Show("请输入要生成二维码的文本内容", "提示",
- MessageBoxButtons.OK, MessageBoxIcon.Information);
- return;
- }
-
- try
- {
- var writer = new BarcodeWriterPixelData
- {
- Format = BarcodeFormat.QR_CODE,
- Options = new QrCodeEncodingOptions
- {
- Width = 300,
- Height = 300,
- Margin = 1
- }
- };
-
- var pixelData = writer.Write(inputTextBox.Text);
- var bitmap = new Bitmap(pixelData.Width, pixelData.Height, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
- var bitmapData = bitmap.LockBits(new Rectangle(0, 0, pixelData.Width, pixelData.Height),
- System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
- try
- {
- System.Runtime.InteropServices.Marshal.Copy(pixelData.Pixels, 0, bitmapData.Scan0, pixelData.Pixels.Length);
- }
- finally
- {
- bitmap.UnlockBits(bitmapData);
- }
- qrCodePictureBox!.Image = bitmap;
- }
- catch (Exception ex)
- {
- MessageBox.Show($"生成二维码失败: {ex.Message}", "错误",
- MessageBoxButtons.OK, MessageBoxIcon.Error);
- }
- }
-
- private void SaveButton_Click(object sender, EventArgs e)
- {
- if (qrCodePictureBox?.Image == null)
- {
- MessageBox.Show("请先生成二维码", "提示",
- MessageBoxButtons.OK, MessageBoxIcon.Information);
- return;
- }
-
- using (var saveDialog = new SaveFileDialog())
- {
- saveDialog.Filter = "PNG 图片|*.png|JPEG 图片|*.jpg|BMP 图片|*.bmp";
- saveDialog.Title = "保存二维码图片";
- if (saveDialog.ShowDialog() == DialogResult.OK)
- {
- try
- {
- qrCodePictureBox!.Image.Save(saveDialog.FileName);
- MessageBox.Show("二维码保存成功", "成功",
- MessageBoxButtons.OK, MessageBoxIcon.Information);
- }
- catch (Exception ex)
- {
- MessageBox.Show($"保存二维码失败: {ex.Message}", "错误",
- MessageBoxButtons.OK, MessageBoxIcon.Error);
- }
- }
- }
- }
- }
-}
+using System;
+using System.Drawing;
+using System.Windows.Forms;
+using ZXing;
+using ZXing.Common;
+using ZXing.QrCode;
+
+namespace AppStore
+{
+ public class QrCodeGeneratorForm : Form
+ {
+ private TextBox? inputTextBox;
+ private PictureBox? qrCodePictureBox;
+ private Button? generateButton;
+ private Button? saveButton;
+
+ public QrCodeGeneratorForm()
+ {
+ InitializeComponent();
+ this.Text = "二维码生成器";
+ this.Size = new Size(500, 600);
+ this.StartPosition = FormStartPosition.CenterScreen;
+ this.FormBorderStyle = FormBorderStyle.FixedDialog;
+ this.MaximizeBox = false;
+ }
+
+ private void InitializeComponent()
+ {
+ // 输入文本框
+ inputTextBox = new TextBox();
+ inputTextBox.Multiline = true;
+ inputTextBox.ScrollBars = ScrollBars.Vertical;
+ inputTextBox.Size = new Size(400, 100);
+ inputTextBox.Location = new Point(50, 30);
+ inputTextBox.PlaceholderText = "请输入要生成二维码的文本内容...";
+ this.Controls.Add(inputTextBox);
+
+ // 生成按钮
+ generateButton = new Button();
+ generateButton.Text = "生成二维码";
+ generateButton.Size = new Size(150, 40);
+ generateButton.Location = new Point(50, 150);
+ generateButton.Click += GenerateButton_Click;
+ this.Controls.Add(generateButton);
+
+ // 二维码显示区域
+ qrCodePictureBox = new PictureBox();
+ qrCodePictureBox.Size = new Size(300, 300);
+ qrCodePictureBox.Location = new Point(100, 220);
+ qrCodePictureBox.SizeMode = PictureBoxSizeMode.StretchImage;
+ qrCodePictureBox.BorderStyle = BorderStyle.FixedSingle;
+ this.Controls.Add(qrCodePictureBox);
+
+ // 保存按钮
+ saveButton = new Button();
+ saveButton.Text = "保存二维码";
+ saveButton.Size = new Size(150, 40);
+ saveButton.Location = new Point(300, 150);
+ saveButton.Click += SaveButton_Click;
+ this.Controls.Add(saveButton);
+ }
+
+ private void GenerateButton_Click(object sender, EventArgs e)
+ {
+ if (string.IsNullOrWhiteSpace(inputTextBox?.Text))
+ {
+ MessageBox.Show("请输入要生成二维码的文本内容", "提示",
+ MessageBoxButtons.OK, MessageBoxIcon.Information);
+ return;
+ }
+
+ try
+ {
+ var writer = new BarcodeWriterPixelData
+ {
+ Format = BarcodeFormat.QR_CODE,
+ Options = new QrCodeEncodingOptions
+ {
+ Width = 300,
+ Height = 300,
+ Margin = 1
+ }
+ };
+
+ var pixelData = writer.Write(inputTextBox.Text);
+ var bitmap = new Bitmap(pixelData.Width, pixelData.Height, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
+ var bitmapData = bitmap.LockBits(new Rectangle(0, 0, pixelData.Width, pixelData.Height),
+ System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
+ try
+ {
+ System.Runtime.InteropServices.Marshal.Copy(pixelData.Pixels, 0, bitmapData.Scan0, pixelData.Pixels.Length);
+ }
+ finally
+ {
+ bitmap.UnlockBits(bitmapData);
+ }
+ qrCodePictureBox!.Image = bitmap;
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show($"生成二维码失败: {ex.Message}", "错误",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+
+ private void SaveButton_Click(object sender, EventArgs e)
+ {
+ if (qrCodePictureBox?.Image == null)
+ {
+ MessageBox.Show("请先生成二维码", "提示",
+ MessageBoxButtons.OK, MessageBoxIcon.Information);
+ return;
+ }
+
+ using (var saveDialog = new SaveFileDialog())
+ {
+ saveDialog.Filter = "PNG 图片|*.png|JPEG 图片|*.jpg|BMP 图片|*.bmp";
+ saveDialog.Title = "保存二维码图片";
+ if (saveDialog.ShowDialog() == DialogResult.OK)
+ {
+ try
+ {
+ qrCodePictureBox!.Image.Save(saveDialog.FileName);
+ MessageBox.Show("二维码保存成功", "成功",
+ MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show($"保存二维码失败: {ex.Message}", "错误",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/tools/image_compressor.cpp b/tools/image_compressor.cpp
index 73ee5bc..c1a1fca 100644
--- a/tools/image_compressor.cpp
+++ b/tools/image_compressor.cpp
@@ -1,103 +1,103 @@
-#include
-#include
-#include
-#include
-
-#define STB_IMAGE_IMPLEMENTATION
-#include
-#define STB_IMAGE_WRITE_IMPLEMENTATION
-#include
-
-namespace fs = std::filesystem;
-
-void ShowHelp() {
- std::cout << "图片压缩工具 v1.0\n";
- std::cout << "用法: image_compressor [选项] 输入文件 输出文件\n";
- std::cout << "选项:\n";
- std::cout << " -t 压缩类型: lossy(有损)/lossless(无损) (默认: lossy)\n";
- std::cout << " -q 压缩质量 (1-1000) (默认: 80)\n";
- std::cout << " -e 保留EXIF信息 (默认: 不保留)\n";
- std::cout << " -h 显示帮助信息\n";
-}
-
-int main(int argc, char** argv) {
- // 默认参数
- std::string compressType = "lossy";
- int quality = 80;
- bool keepExif = false;
- std::string inputFile;
- std::string outputFile;
-
- // 解析命令行参数
- for (int i = 1; i < argc; ++i) {
- std::string arg = argv[i];
- if (arg == "-h") {
- ShowHelp();
- return 0;
- } else if (arg == "-t" && i + 1 < argc) {
- compressType = argv[++i];
- } else if (arg == "-q" && i + 1 < argc) {
- quality = std::stoi(argv[++i]);
- } else if (arg == "-e") {
- keepExif = true;
- } else if (inputFile.empty()) {
- inputFile = arg;
- } else {
- outputFile = arg;
- }
- }
-
- // 验证参数
- if (inputFile.empty() || outputFile.empty()) {
- std::cerr << "错误: 必须指定输入文件和输出文件\n";
- ShowHelp();
- return 1;
- }
-
- if (quality < 1 || quality > 1000) {
- std::cerr << "错误: 压缩质量必须在1-1000之间\n";
- return 1;
- }
-
- try {
- std::cout << "正在压缩: " << inputFile << " -> " << outputFile << std::endl;
- std::cout << "类型: " << compressType << std::endl;
- std::cout << "质量: " << quality << std::endl;
- std::cout << "保留EXIF: " << (keepExif ? "是" : "否") << std::endl;
-
- // 加载图片
- int width, height, channels;
- unsigned char* image = stbi_load(inputFile.c_str(), &width, &height, &channels, 0);
- if (!image) {
- std::cerr << "错误: 无法加载图片 " << inputFile << " - " << stbi_failure_reason() << std::endl;
- return 1;
- }
-
- // 压缩图片
- int result = 0;
- if (compressType == "lossy") {
- // 有损压缩 (JPEG)
- int jpeg_quality = quality / 10; // 将1-1000映射到1-100
- jpeg_quality = std::max(1, std::min(jpeg_quality, 100));
- result = stbi_write_jpg(outputFile.c_str(), width, height, channels, image, jpeg_quality);
- } else {
- // 无损压缩 (PNG)
- result = stbi_write_png(outputFile.c_str(), width, height, channels, image, width * channels);
- }
-
- // 释放内存
- stbi_image_free(image);
-
- if (!result) {
- std::cerr << "错误: 无法保存图片 " << outputFile << std::endl;
- return 1;
- }
-
- std::cout << "压缩完成\n";
- return 0;
-
- } catch (const std::exception& e) {
- std::cerr << "发生错误: " << e.what() << std::endl;
- return 1;
- }
-}
+#include
+#include
+#include
+#include
+
+#define STB_IMAGE_IMPLEMENTATION
+#include
+#define STB_IMAGE_WRITE_IMPLEMENTATION
+#include
+
+namespace fs = std::filesystem;
+
+void ShowHelp() {
+ std::cout << "图片压缩工具 v1.0\n";
+ std::cout << "用法: image_compressor [选项] 输入文件 输出文件\n";
+ std::cout << "选项:\n";
+ std::cout << " -t 压缩类型: lossy(有损)/lossless(无损) (默认: lossy)\n";
+ std::cout << " -q 压缩质量 (1-1000) (默认: 80)\n";
+ std::cout << " -e 保留EXIF信息 (默认: 不保留)\n";
+ std::cout << " -h 显示帮助信息\n";
+}
+
+int main(int argc, char** argv) {
+ // 默认参数
+ std::string compressType = "lossy";
+ int quality = 80;
+ bool keepExif = false;
+ std::string inputFile;
+ std::string outputFile;
+
+ // 解析命令行参数
+ for (int i = 1; i < argc; ++i) {
+ std::string arg = argv[i];
+ if (arg == "-h") {
+ ShowHelp();
+ return 0;
+ } else if (arg == "-t" && i + 1 < argc) {
+ compressType = argv[++i];
+ } else if (arg == "-q" && i + 1 < argc) {
+ quality = std::stoi(argv[++i]);
+ } else if (arg == "-e") {
+ keepExif = true;
+ } else if (inputFile.empty()) {
+ inputFile = arg;
+ } else {
+ outputFile = arg;
+ }
+ }
+
+ // 验证参数
+ if (inputFile.empty() || outputFile.empty()) {
+ std::cerr << "错误: 必须指定输入文件和输出文件\n";
+ ShowHelp();
+ return 1;
+ }
+
+ if (quality < 1 || quality > 1000) {
+ std::cerr << "错误: 压缩质量必须在1-1000之间\n";
+ return 1;
+ }
+
+ try {
+ std::cout << "正在压缩: " << inputFile << " -> " << outputFile << std::endl;
+ std::cout << "类型: " << compressType << std::endl;
+ std::cout << "质量: " << quality << std::endl;
+ std::cout << "保留EXIF: " << (keepExif ? "是" : "否") << std::endl;
+
+ // 加载图片
+ int width, height, channels;
+ unsigned char* image = stbi_load(inputFile.c_str(), &width, &height, &channels, 0);
+ if (!image) {
+ std::cerr << "错误: 无法加载图片 " << inputFile << " - " << stbi_failure_reason() << std::endl;
+ return 1;
+ }
+
+ // 压缩图片
+ int result = 0;
+ if (compressType == "lossy") {
+ // 有损压缩 (JPEG)
+ int jpeg_quality = quality / 10; // 将1-1000映射到1-100
+ jpeg_quality = std::max(1, std::min(jpeg_quality, 100));
+ result = stbi_write_jpg(outputFile.c_str(), width, height, channels, image, jpeg_quality);
+ } else {
+ // 无损压缩 (PNG)
+ result = stbi_write_png(outputFile.c_str(), width, height, channels, image, width * channels);
+ }
+
+ // 释放内存
+ stbi_image_free(image);
+
+ if (!result) {
+ std::cerr << "错误: 无法保存图片 " << outputFile << std::endl;
+ return 1;
+ }
+
+ std::cout << "压缩完成\n";
+ return 0;
+
+ } catch (const std::exception& e) {
+ std::cerr << "发生错误: " << e.what() << std::endl;
+ return 1;
+ }
+}
diff --git a/tools/system_cleaner.cpp b/tools/system_cleaner.cpp
index c394ad0..0146707 100644
--- a/tools/system_cleaner.cpp
+++ b/tools/system_cleaner.cpp
@@ -1,96 +1,96 @@
-#include
-#include
-#include
-#include
-#include
-
-namespace fs = std::filesystem;
-
-bool IsAdmin() {
- BOOL isAdmin = FALSE;
- SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
- PSID AdminGroup;
-
- if (AllocateAndInitializeSid(&NtAuthority, 2,
- SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS,
- 0, 0, 0, 0, 0, 0, &AdminGroup)) {
- if (!CheckTokenMembership(NULL, AdminGroup, &isAdmin)) {
- isAdmin = FALSE;
- }
- FreeSid(AdminGroup);
- }
- return isAdmin == TRUE;
-}
-
-void CleanDirectory(const fs::path& dir, size_t& deletedCount, size_t& errorCount) {
- if (!fs::exists(dir)) {
- std::cout << "目录不存在: " << dir << std::endl;
- return;
- }
-
- for (const auto& entry : fs::directory_iterator(dir)) {
- try {
- if (fs::is_regular_file(entry)) {
- fs::remove(entry);
- deletedCount++;
- }
- } catch (const std::exception& e) {
- std::cerr << "删除文件失败: " << entry.path() << " - " << e.what() << std::endl;
- errorCount++;
- }
- }
-}
-
-int main() {
- try {
- if (!IsAdmin()) {
- std::cerr << "请以管理员身份运行此程序以清理所有目录" << std::endl;
- }
-
- auto start = std::chrono::high_resolution_clock::now();
- size_t totalDeleted = 0;
- size_t totalErrors = 0;
-
- // 定义要清理的目录列表
- std::vector directories = {
- "C:\\Windows\\Temp",
- fs::path(std::getenv("USERPROFILE")) / "AppData" / "Local" / "Temp",
- "C:\\Windows\\SoftwareDistribution\\Download",
- "C:\\Windows\\Logs",
- "C:\\Windows\\Minidump"
- };
-
- // 只有管理员才能清理Prefetch目录
- if (IsAdmin()) {
- directories.push_back("C:\\Windows\\Prefetch");
- }
-
- // 清理每个目录
- for (const auto& dir : directories) {
- size_t dirDeleted = 0;
- size_t dirErrors = 0;
-
- std::cout << "正在清理: " << dir << std::endl;
- CleanDirectory(dir, dirDeleted, dirErrors);
-
- totalDeleted += dirDeleted;
- totalErrors += dirErrors;
-
- std::cout << "已删除 " << dirDeleted << " 个文件" << std::endl;
- }
-
- auto end = std::chrono::high_resolution_clock::now();
- auto duration = std::chrono::duration_cast(end - start);
-
- std::cout << "\n清理完成:" << std::endl;
- std::cout << "总共删除文件数: " << totalDeleted << std::endl;
- std::cout << "总共错误数: " << totalErrors << std::endl;
- std::cout << "耗时: " << duration.count() << " 毫秒" << std::endl;
-
- } catch (const std::exception& e) {
- std::cerr << "发生错误: " << e.what() << std::endl;
- return 1;
- }
-
- return 0;
-}
+#include
+#include
+#include
+#include
+#include
+
+namespace fs = std::filesystem;
+
+bool IsAdmin() {
+ BOOL isAdmin = FALSE;
+ SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
+ PSID AdminGroup;
+
+ if (AllocateAndInitializeSid(&NtAuthority, 2,
+ SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS,
+ 0, 0, 0, 0, 0, 0, &AdminGroup)) {
+ if (!CheckTokenMembership(NULL, AdminGroup, &isAdmin)) {
+ isAdmin = FALSE;
+ }
+ FreeSid(AdminGroup);
+ }
+ return isAdmin == TRUE;
+}
+
+void CleanDirectory(const fs::path& dir, size_t& deletedCount, size_t& errorCount) {
+ if (!fs::exists(dir)) {
+ std::cout << "目录不存在: " << dir << std::endl;
+ return;
+ }
+
+ for (const auto& entry : fs::directory_iterator(dir)) {
+ try {
+ if (fs::is_regular_file(entry)) {
+ fs::remove(entry);
+ deletedCount++;
+ }
+ } catch (const std::exception& e) {
+ std::cerr << "删除文件失败: " << entry.path() << " - " << e.what() << std::endl;
+ errorCount++;
+ }
+ }
+}
+
+int main() {
+ try {
+ if (!IsAdmin()) {
+ std::cerr << "请以管理员身份运行此程序以清理所有目录" << std::endl;
+ }
+
+ auto start = std::chrono::high_resolution_clock::now();
+ size_t totalDeleted = 0;
+ size_t totalErrors = 0;
+
+ // 定义要清理的目录列表
+ std::vector directories = {
+ "C:\\Windows\\Temp",
+ fs::path(std::getenv("USERPROFILE")) / "AppData" / "Local" / "Temp",
+ "C:\\Windows\\SoftwareDistribution\\Download",
+ "C:\\Windows\\Logs",
+ "C:\\Windows\\Minidump"
+ };
+
+ // 只有管理员才能清理Prefetch目录
+ if (IsAdmin()) {
+ directories.push_back("C:\\Windows\\Prefetch");
+ }
+
+ // 清理每个目录
+ for (const auto& dir : directories) {
+ size_t dirDeleted = 0;
+ size_t dirErrors = 0;
+
+ std::cout << "正在清理: " << dir << std::endl;
+ CleanDirectory(dir, dirDeleted, dirErrors);
+
+ totalDeleted += dirDeleted;
+ totalErrors += dirErrors;
+
+ std::cout << "已删除 " << dirDeleted << " 个文件" << std::endl;
+ }
+
+ auto end = std::chrono::high_resolution_clock::now();
+ auto duration = std::chrono::duration_cast(end - start);
+
+ std::cout << "\n清理完成:" << std::endl;
+ std::cout << "总共删除文件数: " << totalDeleted << std::endl;
+ std::cout << "总共错误数: " << totalErrors << std::endl;
+ std::cout << "耗时: " << duration.count() << " 毫秒" << std::endl;
+
+ } catch (const std::exception& e) {
+ std::cerr << "发生错误: " << e.what() << std::endl;
+ return 1;
+ }
+
+ return 0;
+}
diff --git a/tools/viewer/IImageViewer.cs b/tools/viewer/IImageViewer.cs
index c97b9fa..9a8cdd1 100644
--- a/tools/viewer/IImageViewer.cs
+++ b/tools/viewer/IImageViewer.cs
@@ -1,21 +1,21 @@
-namespace KortAppZ.Tools.Viewer
-{
- public interface IImageViewer
- {
- ///
- /// 加载图片文件
- ///
- /// 图片文件路径
- void LoadImage(string filePath);
-
- ///
- /// 显示图片
- ///
- void ShowImage();
-
- ///
- /// 关闭图片查看器
- ///
- void CloseViewer();
- }
-}
+namespace KortAppZ.Tools.Viewer
+{
+ public interface IImageViewer
+ {
+ ///
+ /// 加载图片文件
+ ///
+ /// 图片文件路径
+ void LoadImage(string filePath);
+
+ ///
+ /// 显示图片
+ ///
+ void ShowImage();
+
+ ///
+ /// 关闭图片查看器
+ ///
+ void CloseViewer();
+ }
+}
diff --git a/tools/viewer/ImageFileHandler.cs b/tools/viewer/ImageFileHandler.cs
index 53686d0..f18a776 100644
--- a/tools/viewer/ImageFileHandler.cs
+++ b/tools/viewer/ImageFileHandler.cs
@@ -1,41 +1,41 @@
-using System;
-using System.Drawing;
-using System.IO;
-
-namespace KortAppZ.Tools.Viewer
-{
- public static class ImageFileHandler
- {
- private static readonly string[] SupportedExtensions =
- {
- ".jpg", ".jpeg", ".png", ".bmp", ".gif", ".tiff", ".tif"
- };
-
- public static bool IsImageFile(string filePath)
- {
- if (string.IsNullOrEmpty(filePath))
- return false;
-
- string extension = Path.GetExtension(filePath).ToLower();
- return Array.Exists(SupportedExtensions, ext => ext == extension);
- }
-
- public static Image LoadImage(string filePath)
- {
- if (!IsImageFile(filePath))
- throw new ArgumentException("不支持的图片格式");
-
- if (!File.Exists(filePath))
- throw new FileNotFoundException("图片文件不存在", filePath);
-
- try
- {
- return Image.FromFile(filePath);
- }
- catch (Exception ex)
- {
- throw new Exception($"无法加载图片: {ex.Message}", ex);
- }
- }
- }
-}
+using System;
+using System.Drawing;
+using System.IO;
+
+namespace KortAppZ.Tools.Viewer
+{
+ public static class ImageFileHandler
+ {
+ private static readonly string[] SupportedExtensions =
+ {
+ ".jpg", ".jpeg", ".png", ".bmp", ".gif", ".tiff", ".tif"
+ };
+
+ public static bool IsImageFile(string filePath)
+ {
+ if (string.IsNullOrEmpty(filePath))
+ return false;
+
+ string extension = Path.GetExtension(filePath).ToLower();
+ return Array.Exists(SupportedExtensions, ext => ext == extension);
+ }
+
+ public static Image LoadImage(string filePath)
+ {
+ if (!IsImageFile(filePath))
+ throw new ArgumentException("不支持的图片格式");
+
+ if (!File.Exists(filePath))
+ throw new FileNotFoundException("图片文件不存在", filePath);
+
+ try
+ {
+ return Image.FromFile(filePath);
+ }
+ catch (Exception ex)
+ {
+ throw new Exception($"无法加载图片: {ex.Message}", ex);
+ }
+ }
+ }
+}
diff --git a/tools/viewer/ImageViewerForm.cs b/tools/viewer/ImageViewerForm.cs
index 80850b9..96c4cd7 100644
--- a/tools/viewer/ImageViewerForm.cs
+++ b/tools/viewer/ImageViewerForm.cs
@@ -1,93 +1,93 @@
-using System;
-using System.Drawing;
-using System.Windows.Forms;
-using System.IO;
-using KortAppZ.Tools.Viewer;
-
-namespace KortAppZ.Tools.Viewer
-{
- public class ImageViewerForm : Form
- {
- private Button? openButton;
-
- public ImageViewerForm()
- {
- InitializeComponent();
- }
-
- private void InitializeComponent()
- {
- this.openButton = new Button();
- //
- // openButton
- //
- this.openButton.Text = "打开图片";
- this.openButton.Size = new Size(120, 40);
- this.openButton.Font = new Font("Microsoft YaHei", 10);
- this.openButton.Anchor = AnchorStyles.None;
- this.openButton.Click += new EventHandler(OpenButton_Click);
-
- // 初始位置
- CenterOpenButton();
-
- // 窗体大小变化时重新居中按钮
- this.Resize += (s, e) => CenterOpenButton();
-
- //
- // ImageViewerForm
- //
- this.Text = "图片查看器";
- this.ClientSize = new Size(400, 300);
- this.StartPosition = FormStartPosition.CenterScreen;
- this.MinimumSize = new Size(300, 200);
- this.MaximizeBox = false;
- this.FormBorderStyle = FormBorderStyle.FixedDialog;
- this.MaximizedBounds = Screen.FromHandle(this.Handle).WorkingArea;
- this.Controls.Add(this.openButton);
- }
-
- private void CenterOpenButton()
- {
- if (openButton != null)
- {
- openButton.Location = new Point(
- (this.ClientSize.Width - openButton.Width) / 2,
- (this.ClientSize.Height - openButton.Height) / 2);
- }
- }
-
- private void OpenButton_Click(object sender, EventArgs e)
- {
- OpenFileDialog openFileDialog = new OpenFileDialog();
- openFileDialog.Filter = "图片文件|*.jpg;*.jpeg;*.png;*.bmp;*.gif;*.tiff;*.tif|所有文件|*.*";
-
- if (openFileDialog.ShowDialog() == DialogResult.OK)
- {
- string filePath = openFileDialog.FileName;
- ShowImage(filePath);
- }
- }
-
- private void ShowImage(string filePath)
- {
- try
- {
- if (!ImageFileHandler.IsImageFile(filePath))
- {
- MessageBox.Show("不支持的图片格式", "错误",
- MessageBoxButtons.OK, MessageBoxIcon.Error);
- return;
- }
-
- ImageDisplayForm displayForm = new ImageDisplayForm();
- displayForm.LoadImage(filePath);
- displayForm.Show();
- }
- catch (Exception ex)
- {
- MessageBox.Show($"无法加载图片: {ex.Message}", "错误",
- MessageBoxButtons.OK, MessageBoxIcon.Error);
- }
- }
- }
-}
+using System;
+using System.Drawing;
+using System.Windows.Forms;
+using System.IO;
+using KortAppZ.Tools.Viewer;
+
+namespace KortAppZ.Tools.Viewer
+{
+ public class ImageViewerForm : Form
+ {
+ private Button? openButton;
+
+ public ImageViewerForm()
+ {
+ InitializeComponent();
+ }
+
+ private void InitializeComponent()
+ {
+ this.openButton = new Button();
+ //
+ // openButton
+ //
+ this.openButton.Text = "打开图片";
+ this.openButton.Size = new Size(120, 40);
+ this.openButton.Font = new Font("Microsoft YaHei", 10);
+ this.openButton.Anchor = AnchorStyles.None;
+ this.openButton.Click += new EventHandler(OpenButton_Click);
+
+ // 初始位置
+ CenterOpenButton();
+
+ // 窗体大小变化时重新居中按钮
+ this.Resize += (s, e) => CenterOpenButton();
+
+ //
+ // ImageViewerForm
+ //
+ this.Text = "图片查看器";
+ this.ClientSize = new Size(400, 300);
+ this.StartPosition = FormStartPosition.CenterScreen;
+ this.MinimumSize = new Size(300, 200);
+ this.MaximizeBox = false;
+ this.FormBorderStyle = FormBorderStyle.FixedDialog;
+ this.MaximizedBounds = Screen.FromHandle(this.Handle).WorkingArea;
+ this.Controls.Add(this.openButton);
+ }
+
+ private void CenterOpenButton()
+ {
+ if (openButton != null)
+ {
+ openButton.Location = new Point(
+ (this.ClientSize.Width - openButton.Width) / 2,
+ (this.ClientSize.Height - openButton.Height) / 2);
+ }
+ }
+
+ private void OpenButton_Click(object sender, EventArgs e)
+ {
+ OpenFileDialog openFileDialog = new OpenFileDialog();
+ openFileDialog.Filter = "图片文件|*.jpg;*.jpeg;*.png;*.bmp;*.gif;*.tiff;*.tif|所有文件|*.*";
+
+ if (openFileDialog.ShowDialog() == DialogResult.OK)
+ {
+ string filePath = openFileDialog.FileName;
+ ShowImage(filePath);
+ }
+ }
+
+ private void ShowImage(string filePath)
+ {
+ try
+ {
+ if (!ImageFileHandler.IsImageFile(filePath))
+ {
+ MessageBox.Show("不支持的图片格式", "错误",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+
+ ImageDisplayForm displayForm = new ImageDisplayForm();
+ displayForm.LoadImage(filePath);
+ displayForm.Show();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show($"无法加载图片: {ex.Message}", "错误",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ }
+}
diff --git a/tools/viewer/ImageViewerToolCard.cs b/tools/viewer/ImageViewerToolCard.cs
index f5aee17..bb42e32 100644
--- a/tools/viewer/ImageViewerToolCard.cs
+++ b/tools/viewer/ImageViewerToolCard.cs
@@ -1,48 +1,48 @@
-using System;
-using System.Drawing;
-using System.Windows.Forms;
-using System.IO;
-using AppStore;
-
-namespace KortAppZ.Tools.Viewer
-{
- public class ImageViewerToolCard : ToolCard
- {
- public ImageViewerToolCard()
- {
- this.ToolName = "图片查看";
-
- try
- {
- string iconPath = Path.Combine(Application.StartupPath, "img", "resource", "png", "ImageCompressor.png");
- if (File.Exists(iconPath))
- {
- this.ToolIcon = Image.FromFile(iconPath);
- }
- else
- {
- this.ToolIcon = SystemIcons.Application.ToBitmap();
- }
- }
- catch
- {
- this.ToolIcon = SystemIcons.Application.ToBitmap();
- }
-
- this.ToolCardClicked += (s, e) => {
- try
- {
- ImageViewerForm viewerForm = new ImageViewerForm();
- viewerForm.Show();
- }
- catch (Exception ex)
- {
- MessageBox.Show($"打开图片查看器失败: {ex.Message}", "错误",
- MessageBoxButtons.OK, MessageBoxIcon.Error);
- }
- };
-
- this.UpdateDisplay();
- }
- }
-}
+using System;
+using System.Drawing;
+using System.Windows.Forms;
+using System.IO;
+using AppStore;
+
+namespace KortAppZ.Tools.Viewer
+{
+ public class ImageViewerToolCard : ToolCard
+ {
+ public ImageViewerToolCard()
+ {
+ this.ToolName = "图片查看";
+
+ try
+ {
+ string iconPath = Path.Combine(Application.StartupPath, "img", "resource", "png", "ImageCompressor.png");
+ if (File.Exists(iconPath))
+ {
+ this.ToolIcon = Image.FromFile(iconPath);
+ }
+ else
+ {
+ this.ToolIcon = SystemIcons.Application.ToBitmap();
+ }
+ }
+ catch
+ {
+ this.ToolIcon = SystemIcons.Application.ToBitmap();
+ }
+
+ this.ToolCardClicked += (s, e) => {
+ try
+ {
+ ImageViewerForm viewerForm = new ImageViewerForm();
+ viewerForm.Show();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show($"打开图片查看器失败: {ex.Message}", "错误",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ };
+
+ this.UpdateDisplay();
+ }
+ }
+}