This commit is contained in:
2026-02-02 21:56:45 +08:00
commit 320550399d
24 changed files with 4551 additions and 0 deletions

View File

@@ -0,0 +1,867 @@
//#define InitialPath
using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Windows.Forms;
using System.IO;
using System.Diagnostics;
namespace ImageCompressor
{
public partial class ImageCompressorForm : Form
{
public ImageCompressorForm()
{
manager = new FilesManager(this);
}
/// <summary>
/// 后台读取图片,并且负责运行
/// </summary>
FilesManager manager;
/// <summary>
/// 替换原有的Panel作为进度条
/// </summary>
NewProgressPanel newProgressPanel;
protected override void OnLoad(EventArgs e)
{
this.newProgressPanel = new NewProgressPanel(new Font("Bahnschrift Condensed", 12F), SystemColors.ControlDark);
InitializeComponent();
SetLanguage();
newProgressPanel.Clone(ProgressPanel);
ProgressPanel.Visible = false;
this.Controls.Add(this.newProgressPanel);
OnSizeChanged(null);
ZoomInPictureBox.Visible = false;
PostPictureBox.MouseMove += OnPictureMouseMovePost;
PreviousPictureBox.MouseMove += OnPictureMouseMovePrevious;
ZoomInPictureBox.MouseMove += OnZoomMouseMove;
PostPictureBox.MouseWheel += OnZoomMouseWheelPost;
PreviousPictureBox.MouseWheel += OnZoomMouseWheelPre;
MaxWidthPixelTextBox.Leave += MaxWidthPixelTextBox_FocusLeave;
MaxHeightPixelTextBox.Leave += MaxHeightPixelTextBox_FocusLeave;
SkipFileSizeTextBox.Leave += SkipFileSizeTextBox_FocusLeave;
MaxWidthPixelTextBox.KeyDown += TextBox_KeyDown;
MaxHeightPixelTextBox.KeyDown += TextBox_KeyDown;
SkipFileSizeTextBox.KeyDown += TextBox_KeyDown;
ApplySettingsFromForm();
UpdateDisplayInfo();
UpdateRunButtonText();
SetProgressValue(0);
PathTextBox.DragDrop += Box_DragDrop;
PathTextBox.DragEnter += Box_DragEnter;
this.DragDrop += Box_DragDrop;
this.DragEnter += Box_DragEnter;
#if InitialPath && DEBUG
//string path = @"C:\Users\wucl12\Downloads\Test\Italy";
string path = @"D:\Users\MandO\Downloads\重庆照片";
dragDropFolderPaths.Add(path);
UpdateDropFilePaths();
UpdateRunButtonText();
#endif
}
/// <summary>
/// 启动时设置语言
/// </summary>
void SetLanguage()
{
if(!Localize.IsEN)
{
this.PathTextBox.Font = new System.Drawing.Font("等线", 12F);
this.SizeEstimateLabel.Font = new Font("等线", 12F);
this.KeepOriginalCheckBox.Font = new Font("等线", 12F);
this.MaxPixelMultiplyLabel.Font = new Font("等线", 12F);
this.MaxPixelLimitLabel.Font = new Font("等线", 12F);
//this.CompressLevelTextLabel.Font = new Font("等线", 15F);
this.TitleTextLabel.Font = new Font("等线", 12F);
this.InfoLabel.Font = new Font("等线", 12F);
this.RunButton.Font = new Font("等线", 12F, FontStyle.Bold);
this.SubFolderCheckBox.Font = new Font("等线", 12F);
this.SkipFileSizeLabel.Font = new Font("等线", 12F);
this.CompressLevelLabel.Font = new Font("等线", 12F);
}
this.CompressLevelLabel.Text = Localize.Get("Compress Level (1-10)");
this.SkipFileSizeLabel.Text = Localize.Get("Skip File Size (KB)");
this.KeepOriginalCheckBox.Text = Localize.Get("Keep Original (Compress in new folder)");
this.SubFolderCheckBox.Text = Localize.Get("Include SubFolders");
this.MaxPixelLimitLabel.Text = Localize.Get("Max Pixel Limit");
this.TitleTextLabel.Text = Localize.Get("Image Compressor") +" 2026.02.02 by WR";
this.Text = Localize.Get("Image Compressor");
}
#region Resize
/// <summary>
/// 点击到左右边界
/// </summary>
ClickResize clickResizeHorizen = ClickResize.None;
/// <summary>
/// 点击到上下边界
/// </summary>
ClickResize clickResizeVertical = ClickResize.None;
/// <summary>
/// 记录点击边界值
/// </summary>
enum ClickResize
{
None,
Left,
Right,
Top,
Buttom,
}
/// <summary>
/// 鼠标点击位置是移动还是缩放
/// </summary>
enum SizeChangeState
{
None,
ChangeSize,
Move,
}
/// <summary>
/// 记录移动或者缩放状态
/// </summary>
SizeChangeState sizeChangeState = SizeChangeState.None;
/// <summary>
/// 绘制尺寸时的间距控制常数
/// </summary>
const int sizePad = 15;
/// <summary>
/// 减少卡顿
/// </summary>
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000;
return cp;
}
}
/// <summary>
/// 动态缩放
/// </summary>
/// <param name="e"></param>
protected override void OnSizeChanged(EventArgs e)
{
SuspendLayout();
this.CloseButton.Left = Width - sizePad - CloseButton.Width;
this.MaxmizeButton.Left = CloseButton.Left - sizePad - MaxmizeButton.Width;
this.MinimizeButton.Left = MaxmizeButton.Left - sizePad - MinimizeButton.Width;
this.PathTextBox.Width = Width - sizePad - PathTextBox.Left;
this.RunButton.Left = Width / 2 + sizePad / 2;
this.newProgressPanel.Top = Height - sizePad - newProgressPanel.Height;
this.newProgressPanel.Left = RunButton.Left;
this.newProgressPanel.Width = Width - sizePad - RunButton.Left;
this.ProgressPanel.Location = newProgressPanel.Location;
this.ProgressPanel.Width = newProgressPanel.Width;
this.RunButton.Top = this.ProgressPanel.Top - sizePad - RunButton.Height;
this.RunButton.Width = Width - sizePad - RunButton.Left;
this.InfoLabel.Left = RunButton.Left;
this.InfoLabel.Top = this.RunButton.Top - sizePad - InfoLabel.Height;
this.SizeEstimateLabel.Left = this.RunButton.Left;
this.SizeEstimateLabel.Top = this.InfoLabel.Top - sizePad - this.SizeEstimateLabel.Height;
this.PostPictureBox.Left = RunButton.Left;
this.PostPictureBox.Width = this.RunButton.Width;
this.PostPictureBox.Height = this.SizeEstimateLabel.Top - sizePad - this.PostPictureBox.Top;
this.PreviousPictureBox.Height = this.PostPictureBox.Height;
this.PreviousPictureBox.Width = this.PostPictureBox.Left- sizePad - this.PreviousPictureBox.Left;
this.KeepOriginalCheckBox.Top = ProgressPanel.Top;
this.SubFolderCheckBox.Top = this.KeepOriginalCheckBox.Top - 10 - this.SubFolderCheckBox.Height;
this.SkipFileSizeTextBox.Top = this.RunButton.Top - this.SkipFileSizeTextBox.Height;
this.CompressLevelDownButton.Top = this.PostPictureBox.Bottom + sizePad-5;
this.CompressLevelUpButton.Top = this.CompressLevelDownButton.Top;
this.CompressLevelTextLabel.Top = this.CompressLevelUpButton.Top + 7;
this.CompressLevelLabel.Top = this.CompressLevelTextLabel.Bottom - this.CompressLevelLabel.Height-3;
this.SkipFileSizeTextBox.Top = this.CompressLevelUpButton.Bottom + sizePad-5;
this.SkipFileSizeLabel.Top = this.SkipFileSizeTextBox.Top+5;
this.MaxPixelLimitLabel.Top = this.CompressLevelLabel.Top;
this.MaxPixelMultiplyLabel.Top = this.MaxPixelLimitLabel.Top;
this.MaxWidthPixelTextBox.Top = this.CompressLevelUpButton.Top + 3;
this.MaxHeightPixelTextBox.Top = this.MaxWidthPixelTextBox.Top;
ResumeLayout(false);
PerformLayout();
}
/// <summary>
/// 点击四边拖拽更改窗口大小的距离距离范围
/// </summary>
const float ChangeSizeClickTolerance = 10;
bool ClickNear(float n1, float n2)
{
return Math.Abs(n1 - n2) < ChangeSizeClickTolerance;
}
Point moveLocation;
protected override void OnMouseDown(MouseEventArgs e)
{
this.RunButton.Focus();
sizeChangeState = SizeChangeState.None;
if(e.Y > ChangeSizeClickTolerance && e.Y < MinimizeButton.Bottom && e.X < MinimizeButton.Left)
{
sizeChangeState = SizeChangeState.Move;
moveLocation = e.Location;
return;
}
if (ClickNear(0, e.X))
{
clickResizeHorizen = ClickResize.Left;
sizeChangeState = SizeChangeState.ChangeSize;
}
else if (ClickNear(Bounds.Width, e.X))
{
clickResizeHorizen = ClickResize.Right;
sizeChangeState = SizeChangeState.ChangeSize;
}
else clickResizeHorizen = ClickResize.None;
if (ClickNear(0, e.Y))
{
clickResizeVertical = ClickResize.Top;
sizeChangeState = SizeChangeState.ChangeSize;
}
else if (ClickNear(Bounds.Height, e.Y))
{
clickResizeVertical = ClickResize.Buttom;
sizeChangeState = SizeChangeState.ChangeSize;
}
else clickResizeVertical = ClickResize.None;
if (sizeChangeState == SizeChangeState.None)
{
base.OnMouseDown(e);
}
}
protected override void OnMouseMove(MouseEventArgs e)
{
ZoomInPictureBox.Visible = false;
if (sizeChangeState == SizeChangeState.Move)
{
if(this.WindowState != FormWindowState.Normal)
{
this.WindowState = FormWindowState.Normal;
moveLocation = new Point(Width / 2, 10);
}
else
{
Size size = Bounds.Size;
Point location = new Point(Bounds.X + e.X - moveLocation.X, Bounds.Y + e.Y - moveLocation.Y);
Bounds = new Rectangle(location, size);
}
}
else if(sizeChangeState == SizeChangeState.ChangeSize)
{
this.WindowState = FormWindowState.Normal;
Point location = Bounds.Location;
Size size = Bounds.Size;
bool changed = false;
if (clickResizeHorizen == ClickResize.Left)
{
location.X = Bounds.X + e.X;
size.Width = Bounds.Width - e.X;
changed = true;
}
else if (clickResizeHorizen == ClickResize.Right)
{
size.Width = e.X;
changed = true;
}
if (clickResizeVertical == ClickResize.Top)
{
location.Y = Bounds.Y + e.Y;
size.Height = Bounds.Height - e.Y;
changed = true;
}
else if (clickResizeVertical == ClickResize.Buttom)
{
size.Height = e.Y;
changed = true;
}
if (changed)
{
Bounds = new Rectangle(location, size);
}
}
else
{
bool left = ClickNear(0, e.X);
bool onHorizon = left || ClickNear(Bounds.Width, e.X);
bool top = ClickNear(0, e.Y);
bool onVertical = top || ClickNear(Bounds.Height, e.Y);
if (onHorizon && onVertical)
{
if ((left && top) || ((!left) || (!top))) this.Cursor = Cursors.SizeNWSE;
else this.Cursor = Cursors.SizeNESW;
}
else if (onHorizon)
{
this.Cursor = Cursors.SizeWE;
}
else if (onVertical)
{
this.Cursor = Cursors.SizeNS;
}
else this.Cursor = Cursors.Default;
base.OnMouseMove(e);
}
}
protected override void OnMouseUp(MouseEventArgs e)
{
if (sizeChangeState!= SizeChangeState.None)
{
clickResizeHorizen = ClickResize.None;
clickResizeVertical= ClickResize.None;
sizeChangeState = SizeChangeState.None;
OnSizeChanged(null);
}
else base.OnMouseUp(e);
}
#endregion
#region Drag&Drop
List<string> dragDropFolderPaths = new List<string>();
/// <summary>
/// 改变路径Box的消息
/// </summary>
/// <param name="messageText"></param>
private void ChangePathTextBoxMessage(string messageText)
{
if (!string.IsNullOrEmpty(messageText))
{
PathTextBox.Text = messageText;
PathTextBox.ForeColor = Color.Gray;
}
}
private void Box_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
e.Effect = DragDropEffects.Link;
}
else e.Effect = DragDropEffects.None;
}
private void Box_DragDrop(object sender, DragEventArgs e)
{
dragDropFolderPaths.Clear();
Array files = (Array)e.Data.GetData(DataFormats.FileDrop);
foreach (object file in files)
{
FileInfo info = new FileInfo(file.ToString());
if (info != null && info.Attributes.HasFlag(FileAttributes.Directory))
{
dragDropFolderPaths.Add(info.FullName);
}
}
if (dragDropFolderPaths.Count == 0)
{
ChangePathTextBoxMessage(Localize.Get("No Folders Droped"));
return;
}
UpdateDropFilePaths();
UpdateRunButtonText();
}
/// <summary>
/// 当Drop时更新路径
/// </summary>
void UpdateDropFilePaths()
{
manager.ReadAllFilePaths(dragDropFolderPaths);
SetProgressValue(0);
if (manager.FilesCount == 0)
{
MessageBox.Show(Localize.Get("No Images (JPG, PNG, BMP) Found in Folder Droped"), Localize.Get("Warning"));
PostPictureBox.Image = null;
PreviousPictureBox.Image = null;
UpdateDisplayInfo();
return;
}
UpdateDisplayInfo();
DrawPreviewImg();
PathTextBox.Lines = dragDropFolderPaths.ToArray();
}
#endregion
#region Zoom Picture
/// <summary>
/// 滚轮缩放Zoom框
/// </summary>
void OnZoomMouseWheelPre(object sender, MouseEventArgs e)
{
if (e.Delta > 0) ZoomFactor.ZoomPercent *= 0.8;
else ZoomFactor.ZoomPercent *= 1.25;
DrawZoomInImage(PreviousPictureBox, e);
}
void OnZoomMouseWheelPost(object sender, MouseEventArgs e)
{
if (e.Delta > 0) ZoomFactor.ZoomPercent *= 0.8;
else ZoomFactor.ZoomPercent *= 1.25;
DrawZoomInImage(PostPictureBox, e);
}
void OnZoomMouseMove(object sender, MouseEventArgs e)
{
ZoomInPictureBox.Location = new Point(ZoomInPictureBox.Left + e.X + 5, ZoomInPictureBox.Top - ZoomInPictureBox.Height + e.Y - 5);
}
void OnPictureMouseMovePost(object sender, MouseEventArgs e)
{
DrawZoomInImage(PostPictureBox, e);
}
void OnPictureMouseMovePrevious(object sender, MouseEventArgs e)
{
DrawZoomInImage(PreviousPictureBox, e);
}
long CpuTime => DateTime.Now.Ticks / 10000;
long wait = 0;
void DrawZoomInImage(PictureBox box, MouseEventArgs e)
{
long t = CpuTime;
if (t - wait > 100) wait = t;
else return;
if (PreviousPictureBox.Image == null || PostPictureBox.Image == null)
{
ZoomInPictureBox.Visible = false;
return;
}
ZoomInPictureBox.Visible = true;
ZoomInPictureBox.Location = new Point(box.Left + e.X + 5, box.Top + e.Y - 155);
ZoomFactor zoomFactor = new ZoomFactor(box.Bounds, e.Location, box.Image.Width, box.Image.Height);
ZoomInPictureBox.Image = GetZoomImage(zoomFactor);
}
Image GetZoomImage(ZoomFactor factor)
{
Bitmap newBit = new Bitmap(300, 150);
Rectangle destRectPre = new Rectangle(0, 0, 150, 150);
Rectangle destRectPost = new Rectangle(150, 0, 150, 150);
Graphics graphics = Graphics.FromImage(newBit);
graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;
graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half;
graphics.SetClip(destRectPre);
Rectangle srcRectPre = factor.GetSourceImage(PreviousPictureBox.Image);
graphics.DrawImage(PreviousPictureBox.Image, destRectPre, srcRectPre, GraphicsUnit.Pixel);
graphics.SetClip(destRectPost);
Rectangle srcRectPost = factor.GetSourceImage(PostPictureBox.Image);
graphics.DrawImage(PostPictureBox.Image, destRectPost, srcRectPost, GraphicsUnit.Pixel);
graphics.Dispose();
//Debug.WriteLine("srcRectPre = {0}, srcRectPost = {1}", srcRectPre, srcRectPost);
return newBit;
}
#endregion
#region UI Event
/// <summary>
/// 防止内部修改文字的时候调用了TextChange事件
/// </summary>
bool internalUpdating = false;
/// <summary>
/// 在Drop文件之后初始化Info显示
/// </summary>
private void UpdateDisplayInfo()
{
internalUpdating = true;
CompressLevelTextLabel.Text = manager.CompressLevel.ToString();
MaxHeightPixelTextBox.Text = manager.MaxHeight.ToString();
MaxWidthPixelTextBox.Text = manager.MaxWidth.ToString();
int fileCount = manager.FilesCount;
if (fileCount > 0)
{
newProgressPanel.Text = $"0/{fileCount}";
newProgressPanel.Refresh();
manager.SetSkipFileSizeInKB(SkipFileSizeTextBox.Text);
InfoLabel.Text = string.Format(Localize.Get("Find {0} Imgs , Sum Size = {1}"), manager.FilesCount, manager.GetFileSizeString(manager.PreAllImageSizeinKB));
}
else
{
ChangePathTextBoxMessage(Localize.Get("Drag and Drop Folders Here To Start"));
newProgressPanel.Text = $"0/0";
newProgressPanel.Refresh();
SizeEstimateLabel.Text = Localize.Get("New Image Size Estimate: ") + "0KB / 0KB";
InfoLabel.Text = "";
}
internalUpdating = false;
}
/// <summary>
/// 将Form的设置运用到后台程序中去
/// </summary>
void ApplySettingsFromForm(bool updateWidthHeight = false)
{
manager.SetSkipFileSizeInKB(SkipFileSizeTextBox.Text);
manager.IncludeSubFolders = SubFolderCheckBox.Checked;
manager.KeepOriginal = KeepOriginalCheckBox.Checked;
manager.CompressLevel = int.Parse(CompressLevelTextLabel.Text);
if(updateWidthHeight)
{
manager.MaxWidth = int.Parse(MaxWidthPixelTextBox.Text);
manager.MaxHeight = int.Parse(MaxHeightPixelTextBox.Text);
}
}
/// <summary>
/// 根据Seed绘制一个压缩后的预览图
/// </summary>
void DrawPreviewImg()
{
if (!manager.GetRandomIndex(seed, out int index))
{
//manager没有文件
PreviousPictureBox.Image = null;
PostPictureBox.Image = null;
SizeEstimateLabel.Text = Localize.Get("New Image Size Estimate: ") + "0KB / 0KB";
return;
}
var rawImage = manager.GetImageAtIndex(index, out string rawFileSize);
PreviousPictureBox.Image = rawImage;
var newImage = manager.GetCompressedImgAtIndex(index, out string newFileSize, out bool skip, out string errorMessage);
if (skip)
{
PostPictureBox.Image = rawImage;
SizeEstimateLabel.Text = Localize.Get("New Image Size Estimate: ")+$"{rawFileSize} / {rawFileSize}" + Localize.Get("(Skiped)");
}
else
{
if (newImage == null)
{
SizeEstimateLabel.Text = errorMessage;
PostPictureBox.Image = null;
return;
}
PostPictureBox.Image = newImage;
SizeEstimateLabel.Text = Localize.Get("New Image Size Estimate: ") +$"{newFileSize} / {rawFileSize}";
}
ZoomFactor.ZoomPercent = 0.1;
}
void SkipFileSizeTextBox_FocusLeave(object sender, EventArgs e)
{
if (!int.TryParse(SkipFileSizeTextBox.Text, out _))
SkipFileSizeTextBox.Text = manager.CurrentSkipFileSizeInKB.ToString();
ApplySettingsFromForm();
}
private void SubFolderCheckBox_CheckedChanged(object sender, EventArgs e)
{
ApplySettingsFromForm();
}
private void KeepOriginalCheckBox_CheckedChanged(object sender, EventArgs e)
{
ApplySettingsFromForm();
}
int seed = 0;
private void PreviousPictureBox_Click(object sender, EventArgs e)
{
if (manager.FilesCount > 0)
{
seed++;
DrawPreviewImg();
}
else seed = 0;
}
private void AfterPictureBox_Click(object sender, EventArgs e)
{
if (manager.FilesCount > 0)
{
seed--;
DrawPreviewImg();
}
else seed = 0;
}
private void CompressLevelTextChanged(bool manuallWidthHeight=false)
{
ApplySettingsFromForm(manuallWidthHeight);
DrawPreviewImg();
UpdateDisplayInfo();
}
void MaxHeightPixelTextBox_FocusLeave(object sender, EventArgs e)
{
if (internalUpdating) return;
if (!int.TryParse(MaxHeightPixelTextBox.Text, out _))
{
MaxHeightPixelTextBox.Text = manager.MaxHeight.ToString();
}
CompressLevelTextChanged(true);
}
private void TextBox_KeyDown(object sender, KeyEventArgs e)
{
if(e.KeyCode == Keys.Enter)
{
this.RunButton.Focus();
}
}
void MaxWidthPixelTextBox_FocusLeave(object sender, EventArgs e)
{
if (internalUpdating) return;
if (!int.TryParse(MaxWidthPixelTextBox.Text, out _))
{
MaxWidthPixelTextBox.Text = manager.MaxWidth.ToString();
}
CompressLevelTextChanged(true);
}
private void CompressLevelDownButton_Click(object sender, EventArgs e)
{
if (manager.CompressLevel > 1)
{
this.CompressLevelTextLabel.Text = (manager.CompressLevel - 1).ToString();
CompressLevelTextChanged();
}
}
private void CompressLevelUpButton_Click(object sender, EventArgs e)
{
if (manager.CompressLevel < 10)
{
this.CompressLevelTextLabel.Text = (manager.CompressLevel + 1).ToString();
CompressLevelTextChanged();
}
}
private void CloseButton_Click(object sender, EventArgs e)
{
if (manager.State != RunningState.Running)
{
this.Close();
return;
}
else
{
//发送结束指令
manager.Stop();
while (true)
{
if (manager.State != RunningState.Running)
{
//确保运行结束后才关闭
this.Close();
return;
}
else Thread.Sleep(100);
}
}
}
private void MaxmizeButton_Click(object sender, EventArgs e)
{
if (this.WindowState != FormWindowState.Maximized) this.WindowState = FormWindowState.Maximized;
else this.WindowState = FormWindowState.Normal;
}
private void MinimizeButton_Click(object sender, EventArgs e)
{
this.WindowState = FormWindowState.Minimized;
}
#endregion
#region Run
/// <summary>
/// 用于内部线程调用
/// </summary>
/// <param name="percent"></param>
public delegate void SetProgressValueDelegate(int percent);
/// <summary>
/// 设定进度条
/// </summary>
/// <param name="value"></param>
public void SetProgressValue(int fileCount)
{
if (InvokeRequired)
{
//从其他线程调用则在此返回Form线程调用
SetProgressValueDelegate setProgressValueDelegate = new SetProgressValueDelegate(SetProgressValue);
this.Invoke(setProgressValueDelegate, fileCount);
}
else
{
newProgressPanel.ProgressValue =(double)fileCount / manager.FilesCount;
this.newProgressPanel.Text = $"{fileCount} / {manager.FilesCount}";
newProgressPanel.Refresh();
}
}
/// <summary>
/// 根据RunningState更新按钮文字
/// </summary>
public void UpdateRunButtonText()
{
switch(manager.State)
{
case RunningState.NoFile:
RunButton.Text = Localize.Get("Waiting for image folders");
break;
case RunningState.Running:
RunButton.Text = Localize.Get("Running, Click to Pause");
break;
case RunningState.WaitStop:
RunButton.Text = Localize.Get("Running, Wait to Pause");
break;
case RunningState.AllThreadStoped:
RunButton.Text = Localize.Get("Paused, Click to Continue");
break;
case RunningState.Finished:
RunButton.Text = Localize.Get("Done");
break;
case RunningState.Ready:
RunButton.Text = Localize.Get("Ready");
break;
default:
RunButton.Text = Localize.Get("Run");
break;
}
}
/// <summary>
/// 点击Run之后运行
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void RunButton_Click(object sender, EventArgs e)
{
if (manager.State == RunningState.Running)
{
manager.Stop();
}
else if (manager.State == RunningState.Ready || manager.State == RunningState.AllThreadStoped)
{
manager.RunAllCompress();
}
else //(manager.State == RunningState.Finished)
{
RunButton.Text = Localize.Get("Done !!!");
}
UpdateRunButtonText();
}
/// <summary>
/// 运行完后显示结束报告
/// </summary>
internal void ShowReport()
{
if (InvokeRequired)
{
//从其他线程调用则在此返回Form线程调用
Action ac = new Action(ShowReport);
this.Invoke(ac);
}
else
{
CountProgress progress = manager.progress;
int minutes = (int)progress.stopwatch.Elapsed.TotalMinutes;
float seconds = progress.stopwatch.Elapsed.Seconds + (progress.stopwatch.Elapsed.Milliseconds / 100) * 0.1f;
string watchString;
if (minutes > 0) watchString = string.Format(Localize.Get("{0}min {1}s"),minutes,seconds);
else watchString = string.Format(Localize.Get("{0}s"),seconds);
UpdateRunButtonText();
InfoLabel.Text = string.Format(Localize.Get("Compressed {0}, Skiped {1}, Failed {2}, "), progress.SuccessCount, progress.SkipCount, progress.FailedCount) +
string.Format(Localize.Get("Time {0}, Compressed Result {1} / {2}"),watchString,manager.GetFileSizeString(progress.PostSizeKBSum), manager.GetFileSizeString(progress.PreSizeKBSum));
if (progress.FailedInfos.Count > 0)
{
MessageBox.Show(string.Join("\n", progress.FailedInfos), Localize.Get("Failed Images Info"));
}
}
}
#endregion
}
}