├── .gitignore ├── Language.csv ├── README.md ├── TinyGUI.sln ├── TinyGUI.sln.DotSettings.user ├── TinyGUI ├── App.config ├── App.xaml ├── App.xaml.cs ├── Commands │ └── Command.cs ├── Converters │ └── IsVisibleConverter.cs ├── Fonts │ ├── Font Awesome 6 Pro-Solid-900.otf │ ├── JetBrainsMono │ │ ├── JetBrainsMono-Bold-Italic.ttf │ │ ├── JetBrainsMono-Bold.ttf │ │ ├── JetBrainsMono-BoldItalic.ttf │ │ ├── JetBrainsMono-ExtraBold.ttf │ │ ├── JetBrainsMono-ExtraBoldItalic.ttf │ │ ├── JetBrainsMono-ExtraLight.ttf │ │ ├── JetBrainsMono-ExtraLightItalic.ttf │ │ ├── JetBrainsMono-Italic.ttf │ │ ├── JetBrainsMono-Light.ttf │ │ ├── JetBrainsMono-LightItalic.ttf │ │ ├── JetBrainsMono-Medium.ttf │ │ ├── JetBrainsMono-MediumItalic.ttf │ │ ├── JetBrainsMono-Regular.ttf │ │ ├── JetBrainsMono-Thin.ttf │ │ └── JetBrainsMono-ThinItalic.ttf │ └── segoe.ttf ├── Images │ ├── TinyGUI.png │ ├── panda.ico │ └── scale │ │ ├── cover.png │ │ ├── fit.png │ │ ├── scale.png │ │ └── thumb.png ├── Properties │ ├── AssemblyInfo.cs │ ├── Resources.Designer.cs │ ├── Resources.de-de.resx │ ├── Resources.resx │ ├── Resources.zh-hant.resx │ ├── Resources.zh.resx │ ├── Settings.Designer.cs │ └── Settings.settings ├── Styles │ ├── Button.xaml │ ├── ComboBoxStyle.xaml │ ├── Fonts.xaml │ ├── ScrollViewer.xaml │ └── TextBox.xaml ├── TinyGUI.csproj ├── ViewModels │ ├── MainModel.cs │ └── ViewModelBase.cs ├── Views │ ├── MainWindow.xaml │ └── MainWindow.xaml.cs └── panda.ico ├── donate.jpg ├── icons8-paypal-48.png ├── licence.md ├── microsoft.svg └── screenshot.png /.gitignore: -------------------------------------------------------------------------------- 1 | bin/ 2 | .idea/ 3 | .vs/ 4 | obj/ 5 | /packages/ 6 | riderModule.iml 7 | /_ReSharper.Caches/ 8 | AppPackages/ 9 | BundleArtifacts/ 10 | /Installer/ -------------------------------------------------------------------------------- /Language.csv: -------------------------------------------------------------------------------- 1 | KEY,English,中文(简体),Deutsch 2 | Back,Back,返回,Zurück 3 | Chinese,Chinese,中文,Chinesisch 4 | ChooseImageFiles,Choose Image Files,选择图像,Bilddatei auswählen 5 | DropImageHere,Drop Image Here,把图像拖到此处,Bild hier ablegen 6 | English,English,英文,Englisch 7 | File,File,文件,Datei 8 | KeyUrl,https://tinypng.com/developers,https://tinify.cn/developers,https://tinify.cn/developers 9 | Lang,Language,语言,Sprache 10 | ReplaceOriginalImage,Replace Original Image,压缩后替换原文件,Originales Bild ersetzen 11 | ResetKey,Reset API Key,重置API密钥,API Key zurücksetzen 12 | Save,Save,保存,Speichern 13 | SetAPIKey,Set Your API Key,设置你的API密钥,API Key einfügen 14 | Settings,Settings,设置,Einstellungen 15 | SupportMe,Support Me,给个星星,支持一下,Unterstützen Sie mich 16 | Version,Version,版本,Version 17 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # TinyGUI 2 | 3 | ![](./screenshot.png) 4 | 5 | get from microsoft store 6 | 7 | TinyGUI是TinyPNG的可视化实现,帮助你快速压缩图片。如果你想使用TinyGUI压缩WebP、PNG 或 JPEG图片,请先去 https://tinypng.com/developers 免费获取一个API Key。 8 | 9 | TinyGUI is a visual implementation of TinyPNG that helps you compress images quickly. If you want to use TinyGUI to compress WebP, PNG or JPEG images, please go to https://tinypng.com/developers to get an API Key for free. 10 | 11 | 12 | 13 | ## 捐助 14 | 15 | 感谢您的捐助,将有助于 TinyGUI 的后续开发,善款将用于硬件、软件、服务器托管等费用。 16 | 17 | 再次感谢您的支持! 18 | 19 | ![](./donate.jpg) 20 | 21 | ## Donate 22 | 23 | Thank you for your donation, it will help the subsequent development of TinyGUI, donations will be used for hardware, software, server hosting and other expenses. 24 | 25 | Thanks again for your support! 26 | 27 | ![](./icons8-paypal-48.png) 28 | [PayPal](https://paypal.me/chenjing9412) -------------------------------------------------------------------------------- /TinyGUI.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.1.32210.238 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TinyGUI", "TinyGUI\TinyGUI.csproj", "{439823D0-9D2D-4FBB-9805-BE38433AFE5D}" 7 | EndProject 8 | Project("{C7167F0D-BC9F-4E6E-AFE1-012C56B48DB5}") = "Installer", "Installer\Installer.wapproj", "{FD9FE64A-E702-45E0-8D2E-967157F3DA3C}" 9 | EndProject 10 | Global 11 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 12 | Debug|Any CPU = Debug|Any CPU 13 | Debug|ARM = Debug|ARM 14 | Debug|ARM64 = Debug|ARM64 15 | Debug|x64 = Debug|x64 16 | Debug|x86 = Debug|x86 17 | Release|Any CPU = Release|Any CPU 18 | Release|ARM = Release|ARM 19 | Release|ARM64 = Release|ARM64 20 | Release|x64 = Release|x64 21 | Release|x86 = Release|x86 22 | EndGlobalSection 23 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 24 | {439823D0-9D2D-4FBB-9805-BE38433AFE5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 25 | {439823D0-9D2D-4FBB-9805-BE38433AFE5D}.Debug|Any CPU.Build.0 = Debug|Any CPU 26 | {439823D0-9D2D-4FBB-9805-BE38433AFE5D}.Debug|ARM.ActiveCfg = Debug|Any CPU 27 | {439823D0-9D2D-4FBB-9805-BE38433AFE5D}.Debug|ARM.Build.0 = Debug|Any CPU 28 | {439823D0-9D2D-4FBB-9805-BE38433AFE5D}.Debug|ARM64.ActiveCfg = Debug|Any CPU 29 | {439823D0-9D2D-4FBB-9805-BE38433AFE5D}.Debug|ARM64.Build.0 = Debug|Any CPU 30 | {439823D0-9D2D-4FBB-9805-BE38433AFE5D}.Debug|x64.ActiveCfg = Debug|Any CPU 31 | {439823D0-9D2D-4FBB-9805-BE38433AFE5D}.Debug|x64.Build.0 = Debug|Any CPU 32 | {439823D0-9D2D-4FBB-9805-BE38433AFE5D}.Debug|x86.ActiveCfg = Debug|Any CPU 33 | {439823D0-9D2D-4FBB-9805-BE38433AFE5D}.Debug|x86.Build.0 = Debug|Any CPU 34 | {439823D0-9D2D-4FBB-9805-BE38433AFE5D}.Release|Any CPU.ActiveCfg = Release|Any CPU 35 | {439823D0-9D2D-4FBB-9805-BE38433AFE5D}.Release|Any CPU.Build.0 = Release|Any CPU 36 | {439823D0-9D2D-4FBB-9805-BE38433AFE5D}.Release|ARM.ActiveCfg = Release|Any CPU 37 | {439823D0-9D2D-4FBB-9805-BE38433AFE5D}.Release|ARM.Build.0 = Release|Any CPU 38 | {439823D0-9D2D-4FBB-9805-BE38433AFE5D}.Release|ARM64.ActiveCfg = Release|Any CPU 39 | {439823D0-9D2D-4FBB-9805-BE38433AFE5D}.Release|ARM64.Build.0 = Release|Any CPU 40 | {439823D0-9D2D-4FBB-9805-BE38433AFE5D}.Release|x64.ActiveCfg = Release|Any CPU 41 | {439823D0-9D2D-4FBB-9805-BE38433AFE5D}.Release|x64.Build.0 = Release|Any CPU 42 | {439823D0-9D2D-4FBB-9805-BE38433AFE5D}.Release|x86.ActiveCfg = Release|Any CPU 43 | {439823D0-9D2D-4FBB-9805-BE38433AFE5D}.Release|x86.Build.0 = Release|Any CPU 44 | {FD9FE64A-E702-45E0-8D2E-967157F3DA3C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 45 | {FD9FE64A-E702-45E0-8D2E-967157F3DA3C}.Debug|Any CPU.Build.0 = Debug|Any CPU 46 | {FD9FE64A-E702-45E0-8D2E-967157F3DA3C}.Debug|Any CPU.Deploy.0 = Debug|Any CPU 47 | {FD9FE64A-E702-45E0-8D2E-967157F3DA3C}.Debug|ARM.ActiveCfg = Debug|ARM 48 | {FD9FE64A-E702-45E0-8D2E-967157F3DA3C}.Debug|ARM.Build.0 = Debug|ARM 49 | {FD9FE64A-E702-45E0-8D2E-967157F3DA3C}.Debug|ARM.Deploy.0 = Debug|ARM 50 | {FD9FE64A-E702-45E0-8D2E-967157F3DA3C}.Debug|ARM64.ActiveCfg = Debug|ARM64 51 | {FD9FE64A-E702-45E0-8D2E-967157F3DA3C}.Debug|ARM64.Build.0 = Debug|ARM64 52 | {FD9FE64A-E702-45E0-8D2E-967157F3DA3C}.Debug|ARM64.Deploy.0 = Debug|ARM64 53 | {FD9FE64A-E702-45E0-8D2E-967157F3DA3C}.Debug|x64.ActiveCfg = Debug|x64 54 | {FD9FE64A-E702-45E0-8D2E-967157F3DA3C}.Debug|x64.Build.0 = Debug|x64 55 | {FD9FE64A-E702-45E0-8D2E-967157F3DA3C}.Debug|x64.Deploy.0 = Debug|x64 56 | {FD9FE64A-E702-45E0-8D2E-967157F3DA3C}.Debug|x86.ActiveCfg = Debug|x86 57 | {FD9FE64A-E702-45E0-8D2E-967157F3DA3C}.Debug|x86.Build.0 = Debug|x86 58 | {FD9FE64A-E702-45E0-8D2E-967157F3DA3C}.Debug|x86.Deploy.0 = Debug|x86 59 | {FD9FE64A-E702-45E0-8D2E-967157F3DA3C}.Release|Any CPU.ActiveCfg = Release|Any CPU 60 | {FD9FE64A-E702-45E0-8D2E-967157F3DA3C}.Release|Any CPU.Build.0 = Release|Any CPU 61 | {FD9FE64A-E702-45E0-8D2E-967157F3DA3C}.Release|Any CPU.Deploy.0 = Release|Any CPU 62 | {FD9FE64A-E702-45E0-8D2E-967157F3DA3C}.Release|ARM.ActiveCfg = Release|ARM 63 | {FD9FE64A-E702-45E0-8D2E-967157F3DA3C}.Release|ARM.Build.0 = Release|ARM 64 | {FD9FE64A-E702-45E0-8D2E-967157F3DA3C}.Release|ARM.Deploy.0 = Release|ARM 65 | {FD9FE64A-E702-45E0-8D2E-967157F3DA3C}.Release|ARM64.ActiveCfg = Release|ARM64 66 | {FD9FE64A-E702-45E0-8D2E-967157F3DA3C}.Release|ARM64.Build.0 = Release|ARM64 67 | {FD9FE64A-E702-45E0-8D2E-967157F3DA3C}.Release|ARM64.Deploy.0 = Release|ARM64 68 | {FD9FE64A-E702-45E0-8D2E-967157F3DA3C}.Release|x64.ActiveCfg = Release|x64 69 | {FD9FE64A-E702-45E0-8D2E-967157F3DA3C}.Release|x64.Build.0 = Release|x64 70 | {FD9FE64A-E702-45E0-8D2E-967157F3DA3C}.Release|x64.Deploy.0 = Release|x64 71 | {FD9FE64A-E702-45E0-8D2E-967157F3DA3C}.Release|x86.ActiveCfg = Release|x86 72 | {FD9FE64A-E702-45E0-8D2E-967157F3DA3C}.Release|x86.Build.0 = Release|x86 73 | {FD9FE64A-E702-45E0-8D2E-967157F3DA3C}.Release|x86.Deploy.0 = Release|x86 74 | EndGlobalSection 75 | GlobalSection(SolutionProperties) = preSolution 76 | HideSolutionNode = FALSE 77 | EndGlobalSection 78 | GlobalSection(ExtensibilityGlobals) = postSolution 79 | SolutionGuid = {09DB440A-562A-4BE7-9F20-8D62F5A2DBE2} 80 | EndGlobalSection 81 | EndGlobal 82 | -------------------------------------------------------------------------------- /TinyGUI.sln.DotSettings.user: -------------------------------------------------------------------------------- 1 |  2 | True 3 | 4 | True 5 | True 6 | False 7 | True 8 | -------------------------------------------------------------------------------- /TinyGUI/App.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | False 18 | 19 | 20 | -1 21 | 22 | 23 | False 24 | 25 | 26 | False 27 | 28 | 29 | False 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /TinyGUI/App.xaml: -------------------------------------------------------------------------------- 1 |  6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /TinyGUI/App.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Globalization; 3 | using System.Threading; 4 | using System.Threading.Tasks; 5 | using System.Windows; 6 | 7 | namespace TinyGUI 8 | { 9 | public partial class App 10 | { 11 | public static readonly string Version = "1.0.9.0"; 12 | private static readonly string[] AvailableLocales = {"zh", "zh-hant", "en", "de-de"}; 13 | 14 | protected override void OnStartup(StartupEventArgs e) 15 | { 16 | InitLanguage(); 17 | #if !DEBUG 18 | RegisterEvents(); 19 | #endif 20 | base.OnStartup(e); 21 | } 22 | 23 | private void RegisterEvents() 24 | { 25 | //Task线程内未捕获异常处理事件 26 | TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException; 27 | 28 | //UI线程未捕获异常处理事件(UI主线程) 29 | this.DispatcherUnhandledException += App_DispatcherUnhandledException; 30 | 31 | //非UI线程未捕获异常处理事件 32 | AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; 33 | } 34 | 35 | private void InitLanguage() 36 | { 37 | switch (TinyGUI.Properties.Settings.Default.LanguageIndex) 38 | { 39 | case -1: 40 | String lang = System.Globalization.CultureInfo.CurrentCulture.Name; 41 | if (!string.IsNullOrEmpty(lang) && lang.ToLower().Contains("zh")) 42 | { 43 | Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(AvailableLocales[0]); 44 | TinyGUI.Properties.Settings.Default.LanguageIndex = 0; 45 | } 46 | else 47 | { 48 | Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(AvailableLocales[2]); 49 | TinyGUI.Properties.Settings.Default.LanguageIndex = 2; 50 | } 51 | 52 | break; 53 | case 0: 54 | Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(AvailableLocales[0]); 55 | break; 56 | case 1: 57 | Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(AvailableLocales[1]); 58 | break; 59 | case 2: 60 | Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(AvailableLocales[2]); 61 | break; 62 | case 3: 63 | Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(AvailableLocales[3]); 64 | break; 65 | } 66 | } 67 | 68 | private static void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e) 69 | { 70 | try 71 | { 72 | if (e.Exception is Exception exception) 73 | { 74 | HandleException(exception); 75 | } 76 | } 77 | catch (Exception ex) 78 | { 79 | HandleException(ex); 80 | } 81 | finally 82 | { 83 | e.SetObserved(); 84 | } 85 | } 86 | 87 | //非UI线程未捕获异常处理事件 88 | private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 89 | { 90 | try 91 | { 92 | if (e.ExceptionObject is Exception exception) 93 | { 94 | HandleException(exception); 95 | } 96 | } 97 | catch (Exception ex) 98 | { 99 | HandleException(ex); 100 | } 101 | } 102 | 103 | //UI线程未捕获异常处理事件 104 | private static void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) 105 | { 106 | try 107 | { 108 | HandleException(e.Exception); 109 | } 110 | catch (Exception ex) 111 | { 112 | HandleException(ex); 113 | } 114 | finally 115 | { 116 | e.Handled = true; 117 | } 118 | } 119 | 120 | private static void HandleException(Exception e) 121 | { 122 | MessageBox.Show(e.InnerException != null ? e.InnerException.Message : e.Message, "ERROR"); 123 | } 124 | } 125 | } -------------------------------------------------------------------------------- /TinyGUI/Commands/Command.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Windows.Input; 3 | 4 | namespace TinyGUI.Commands 5 | { 6 | public class Command : ICommand 7 | { 8 | private readonly Action _action; 9 | 10 | public Command(Action action) 11 | { 12 | _action = action; 13 | } 14 | 15 | #region implementation of ICommand 16 | 17 | public bool CanExecute(object parameter) 18 | { 19 | return true; 20 | } 21 | 22 | public void Execute(object parameter) 23 | { 24 | _action(parameter); 25 | } 26 | 27 | public event EventHandler CanExecuteChanged; 28 | 29 | #endregion 30 | } 31 | } -------------------------------------------------------------------------------- /TinyGUI/Converters/IsVisibleConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Globalization; 3 | using System.Windows; 4 | using System.Windows.Data; 5 | 6 | namespace TinyGUI.Converters 7 | { 8 | public class IsVisibleConverter : IValueConverter 9 | { 10 | public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 11 | { 12 | if (value is bool isVisible && isVisible) 13 | { 14 | return Visibility.Visible; 15 | } 16 | 17 | return Visibility.Collapsed; 18 | } 19 | 20 | public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 21 | { 22 | throw new NotImplementedException(); 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /TinyGUI/Fonts/Font Awesome 6 Pro-Solid-900.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chenjing1294/TinyGUI/dfca299252ce0c7b5f4a666b5200f53b4784cd4b/TinyGUI/Fonts/Font Awesome 6 Pro-Solid-900.otf -------------------------------------------------------------------------------- /TinyGUI/Fonts/JetBrainsMono/JetBrainsMono-Bold-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chenjing1294/TinyGUI/dfca299252ce0c7b5f4a666b5200f53b4784cd4b/TinyGUI/Fonts/JetBrainsMono/JetBrainsMono-Bold-Italic.ttf -------------------------------------------------------------------------------- /TinyGUI/Fonts/JetBrainsMono/JetBrainsMono-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chenjing1294/TinyGUI/dfca299252ce0c7b5f4a666b5200f53b4784cd4b/TinyGUI/Fonts/JetBrainsMono/JetBrainsMono-Bold.ttf -------------------------------------------------------------------------------- /TinyGUI/Fonts/JetBrainsMono/JetBrainsMono-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chenjing1294/TinyGUI/dfca299252ce0c7b5f4a666b5200f53b4784cd4b/TinyGUI/Fonts/JetBrainsMono/JetBrainsMono-BoldItalic.ttf -------------------------------------------------------------------------------- /TinyGUI/Fonts/JetBrainsMono/JetBrainsMono-ExtraBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chenjing1294/TinyGUI/dfca299252ce0c7b5f4a666b5200f53b4784cd4b/TinyGUI/Fonts/JetBrainsMono/JetBrainsMono-ExtraBold.ttf -------------------------------------------------------------------------------- /TinyGUI/Fonts/JetBrainsMono/JetBrainsMono-ExtraBoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chenjing1294/TinyGUI/dfca299252ce0c7b5f4a666b5200f53b4784cd4b/TinyGUI/Fonts/JetBrainsMono/JetBrainsMono-ExtraBoldItalic.ttf -------------------------------------------------------------------------------- /TinyGUI/Fonts/JetBrainsMono/JetBrainsMono-ExtraLight.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chenjing1294/TinyGUI/dfca299252ce0c7b5f4a666b5200f53b4784cd4b/TinyGUI/Fonts/JetBrainsMono/JetBrainsMono-ExtraLight.ttf -------------------------------------------------------------------------------- /TinyGUI/Fonts/JetBrainsMono/JetBrainsMono-ExtraLightItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chenjing1294/TinyGUI/dfca299252ce0c7b5f4a666b5200f53b4784cd4b/TinyGUI/Fonts/JetBrainsMono/JetBrainsMono-ExtraLightItalic.ttf -------------------------------------------------------------------------------- /TinyGUI/Fonts/JetBrainsMono/JetBrainsMono-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chenjing1294/TinyGUI/dfca299252ce0c7b5f4a666b5200f53b4784cd4b/TinyGUI/Fonts/JetBrainsMono/JetBrainsMono-Italic.ttf -------------------------------------------------------------------------------- /TinyGUI/Fonts/JetBrainsMono/JetBrainsMono-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chenjing1294/TinyGUI/dfca299252ce0c7b5f4a666b5200f53b4784cd4b/TinyGUI/Fonts/JetBrainsMono/JetBrainsMono-Light.ttf -------------------------------------------------------------------------------- /TinyGUI/Fonts/JetBrainsMono/JetBrainsMono-LightItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chenjing1294/TinyGUI/dfca299252ce0c7b5f4a666b5200f53b4784cd4b/TinyGUI/Fonts/JetBrainsMono/JetBrainsMono-LightItalic.ttf -------------------------------------------------------------------------------- /TinyGUI/Fonts/JetBrainsMono/JetBrainsMono-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chenjing1294/TinyGUI/dfca299252ce0c7b5f4a666b5200f53b4784cd4b/TinyGUI/Fonts/JetBrainsMono/JetBrainsMono-Medium.ttf -------------------------------------------------------------------------------- /TinyGUI/Fonts/JetBrainsMono/JetBrainsMono-MediumItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chenjing1294/TinyGUI/dfca299252ce0c7b5f4a666b5200f53b4784cd4b/TinyGUI/Fonts/JetBrainsMono/JetBrainsMono-MediumItalic.ttf -------------------------------------------------------------------------------- /TinyGUI/Fonts/JetBrainsMono/JetBrainsMono-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chenjing1294/TinyGUI/dfca299252ce0c7b5f4a666b5200f53b4784cd4b/TinyGUI/Fonts/JetBrainsMono/JetBrainsMono-Regular.ttf -------------------------------------------------------------------------------- /TinyGUI/Fonts/JetBrainsMono/JetBrainsMono-Thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chenjing1294/TinyGUI/dfca299252ce0c7b5f4a666b5200f53b4784cd4b/TinyGUI/Fonts/JetBrainsMono/JetBrainsMono-Thin.ttf -------------------------------------------------------------------------------- /TinyGUI/Fonts/JetBrainsMono/JetBrainsMono-ThinItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chenjing1294/TinyGUI/dfca299252ce0c7b5f4a666b5200f53b4784cd4b/TinyGUI/Fonts/JetBrainsMono/JetBrainsMono-ThinItalic.ttf -------------------------------------------------------------------------------- /TinyGUI/Fonts/segoe.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chenjing1294/TinyGUI/dfca299252ce0c7b5f4a666b5200f53b4784cd4b/TinyGUI/Fonts/segoe.ttf -------------------------------------------------------------------------------- /TinyGUI/Images/TinyGUI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chenjing1294/TinyGUI/dfca299252ce0c7b5f4a666b5200f53b4784cd4b/TinyGUI/Images/TinyGUI.png -------------------------------------------------------------------------------- /TinyGUI/Images/panda.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chenjing1294/TinyGUI/dfca299252ce0c7b5f4a666b5200f53b4784cd4b/TinyGUI/Images/panda.ico -------------------------------------------------------------------------------- /TinyGUI/Images/scale/cover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chenjing1294/TinyGUI/dfca299252ce0c7b5f4a666b5200f53b4784cd4b/TinyGUI/Images/scale/cover.png -------------------------------------------------------------------------------- /TinyGUI/Images/scale/fit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chenjing1294/TinyGUI/dfca299252ce0c7b5f4a666b5200f53b4784cd4b/TinyGUI/Images/scale/fit.png -------------------------------------------------------------------------------- /TinyGUI/Images/scale/scale.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chenjing1294/TinyGUI/dfca299252ce0c7b5f4a666b5200f53b4784cd4b/TinyGUI/Images/scale/scale.png -------------------------------------------------------------------------------- /TinyGUI/Images/scale/thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chenjing1294/TinyGUI/dfca299252ce0c7b5f4a666b5200f53b4784cd4b/TinyGUI/Images/scale/thumb.png -------------------------------------------------------------------------------- /TinyGUI/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Resources; 3 | using System.Runtime.CompilerServices; 4 | using System.Runtime.InteropServices; 5 | using System.Windows; 6 | 7 | // General Information about an assembly is controlled through the following 8 | // set of attributes. Change these attribute values to modify the information 9 | // associated with an assembly. 10 | [assembly: AssemblyTitle("TinyGUI")] 11 | [assembly: AssemblyDescription("")] 12 | [assembly: AssemblyConfiguration("")] 13 | [assembly: AssemblyCompany("")] 14 | [assembly: AssemblyProduct("TinyGUI")] 15 | [assembly: AssemblyCopyright("Copyright © 2022")] 16 | [assembly: AssemblyTrademark("")] 17 | [assembly: AssemblyCulture("")] 18 | 19 | // Setting ComVisible to false makes the types in this assembly not visible 20 | // to COM components. If you need to access a type in this assembly from 21 | // COM, set the ComVisible attribute to true on that type. 22 | [assembly: ComVisible(false)] 23 | 24 | //In order to begin building localizable applications, set 25 | //CultureYouAreCodingWith in your .csproj file 26 | //inside a . For example, if you are using US english 27 | //in your source files, set the to en-US. Then uncomment 28 | //the NeutralResourceLanguage attribute below. Update the "en-US" in 29 | //the line below to match the UICulture setting in the project file. 30 | 31 | //[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] 32 | 33 | 34 | [assembly: ThemeInfo( 35 | ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located 36 | //(used if a resource is not found in the page, 37 | // or application resource dictionaries) 38 | ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located 39 | //(used if a resource is not found in the page, 40 | // app, or any theme specific resource dictionaries) 41 | )] 42 | 43 | 44 | // Version information for an assembly consists of the following four values: 45 | // 46 | // Major Version 47 | // Minor Version 48 | // Build Number 49 | // Revision 50 | // 51 | // You can specify all the values or you can default the Build and Revision Numbers 52 | // by using the '*' as shown below: 53 | // [assembly: AssemblyVersion("1.0.*")] 54 | [assembly: AssemblyVersion("1.0.0.0")] 55 | [assembly: AssemblyFileVersion("1.0.0.0")] -------------------------------------------------------------------------------- /TinyGUI/Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // 5 | // Changes to this file may cause incorrect behavior and will be lost if 6 | // the code is regenerated. 7 | // 8 | //------------------------------------------------------------------------------ 9 | 10 | namespace TinyGUI.Properties { 11 | using System; 12 | 13 | 14 | /// 15 | /// A strongly-typed resource class, for looking up localized strings, etc. 16 | /// 17 | // This class was auto-generated by the StronglyTypedResourceBuilder 18 | // class via a tool like ResGen or Visual Studio. 19 | // To add or remove a member, edit your .ResX file then rerun ResGen 20 | // with the /str option, or rebuild your VS project. 21 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] 22 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 23 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 24 | public class Resources { 25 | 26 | private static global::System.Resources.ResourceManager resourceMan; 27 | 28 | private static global::System.Globalization.CultureInfo resourceCulture; 29 | 30 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 31 | internal Resources() { 32 | } 33 | 34 | /// 35 | /// Returns the cached ResourceManager instance used by this class. 36 | /// 37 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 38 | public static global::System.Resources.ResourceManager ResourceManager { 39 | get { 40 | if (object.ReferenceEquals(resourceMan, null)) { 41 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("TinyGUI.Properties.Resources", typeof(Resources).Assembly); 42 | resourceMan = temp; 43 | } 44 | return resourceMan; 45 | } 46 | } 47 | 48 | /// 49 | /// Overrides the current thread's CurrentUICulture property for all 50 | /// resource lookups using this strongly typed resource class. 51 | /// 52 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 53 | public static global::System.Globalization.CultureInfo Culture { 54 | get { 55 | return resourceCulture; 56 | } 57 | set { 58 | resourceCulture = value; 59 | } 60 | } 61 | 62 | /// 63 | /// Looks up a localized string similar to Choose Image Files. 64 | /// 65 | public static string ChooseImageFiles { 66 | get { 67 | return ResourceManager.GetString("ChooseImageFiles", resourceCulture); 68 | } 69 | } 70 | 71 | /// 72 | /// Looks up a localized string similar to Compression. 73 | /// 74 | public static string Compression { 75 | get { 76 | return ResourceManager.GetString("Compression", resourceCulture); 77 | } 78 | } 79 | 80 | /// 81 | /// Looks up a localized string similar to Copyright. 82 | /// 83 | public static string Copyright { 84 | get { 85 | return ResourceManager.GetString("Copyright", resourceCulture); 86 | } 87 | } 88 | 89 | /// 90 | /// Looks up a localized string similar to All copyright information reserved. Include EXIF copyright notation (JPEG), XMP permission notation (PNG), and Photoshop copyright notation or URL. Use up to 90 bytes, plus the length of the copyright data.. 91 | /// 92 | public static string CopyrightTip { 93 | get { 94 | return ResourceManager.GetString("CopyrightTip", resourceCulture); 95 | } 96 | } 97 | 98 | /// 99 | /// Looks up a localized string similar to Scale down the image and crop the image if necessary. The result has the exact given dimensions. Which part of the picture will be cropped is determined automatically. Smart algorithms determine the most important areas in the image.. 100 | /// 101 | public static string CoverTip { 102 | get { 103 | return ResourceManager.GetString("CoverTip", resourceCulture); 104 | } 105 | } 106 | 107 | /// 108 | /// Looks up a localized string similar to Creation date. 109 | /// 110 | public static string CreationTime { 111 | get { 112 | return ResourceManager.GetString("CreationTime", resourceCulture); 113 | } 114 | } 115 | 116 | /// 117 | /// Looks up a localized string similar to Any GPS location information that describes where the picture or photo was created is preserved. Contains EXIF GPS Dimensions and GPS Accuracy tags (JPEG). Uses about 130 extra bytes.. 118 | /// 119 | public static string CreationTimeTip { 120 | get { 121 | return ResourceManager.GetString("CreationTimeTip", resourceCulture); 122 | } 123 | } 124 | 125 | /// 126 | /// Looks up a localized string similar to Drop Image Here. 127 | /// 128 | public static string DropImageHere { 129 | get { 130 | return ResourceManager.GetString("DropImageHere", resourceCulture); 131 | } 132 | } 133 | 134 | /// 135 | /// Looks up a localized string similar to Scale down the image so that it fits the given size. You must provide both width and height. The downscaled image will not exceed any of these dimensions.. 136 | /// 137 | public static string FitTip { 138 | get { 139 | return ResourceManager.GetString("FitTip", resourceCulture); 140 | } 141 | } 142 | 143 | /// 144 | /// Looks up a localized string similar to https://tinypng.com/developers. 145 | /// 146 | public static string KeyUrl { 147 | get { 148 | return ResourceManager.GetString("KeyUrl", resourceCulture); 149 | } 150 | } 151 | 152 | /// 153 | /// Looks up a localized string similar to Language:. 154 | /// 155 | public static string Lang { 156 | get { 157 | return ResourceManager.GetString("Lang", resourceCulture); 158 | } 159 | } 160 | 161 | /// 162 | /// Looks up a localized string similar to Location. 163 | /// 164 | public static string Location { 165 | get { 166 | return ResourceManager.GetString("Location", resourceCulture); 167 | } 168 | } 169 | 170 | /// 171 | /// Looks up a localized string similar to Any creation date or time is preserved. This is the moment when an image or photo is initially created. Includes EXIF raw datetime stamp (JPEG) or XMP creation time (PNG). Uses about 70 extra bytes.. 172 | /// 173 | public static string LocationTip { 174 | get { 175 | return ResourceManager.GetString("LocationTip", resourceCulture); 176 | } 177 | } 178 | 179 | /// 180 | /// Looks up a localized string similar to Preserve metadata:. 181 | /// 182 | public static string PreserveMetadata { 183 | get { 184 | return ResourceManager.GetString("PreserveMetadata", resourceCulture); 185 | } 186 | } 187 | 188 | /// 189 | /// Looks up a localized string similar to You can specify metadata that is copied from the uploaded image to the compressed version. Currently supports preserving copyright information, GPS location and creation date. Preserving metadata increases the size of compressed files, so you should only keep important metadata.. 190 | /// 191 | public static string PreserveMetadataTip { 192 | get { 193 | return ResourceManager.GetString("PreserveMetadataTip", resourceCulture); 194 | } 195 | } 196 | 197 | /// 198 | /// Looks up a localized string similar to https://www.redisant.com. 199 | /// 200 | public static string Redisant { 201 | get { 202 | return ResourceManager.GetString("Redisant", resourceCulture); 203 | } 204 | } 205 | 206 | /// 207 | /// Looks up a localized string similar to Replace Original Image. 208 | /// 209 | public static string ReplaceOriginalImage { 210 | get { 211 | return ResourceManager.GetString("ReplaceOriginalImage", resourceCulture); 212 | } 213 | } 214 | 215 | /// 216 | /// Looks up a localized string similar to Scale down the image. You must provide target width or height, not both. The reduced image will have a certain width or height.. 217 | /// 218 | public static string ScaleTip { 219 | get { 220 | return ResourceManager.GetString("ScaleTip", resourceCulture); 221 | } 222 | } 223 | 224 | /// 225 | /// Looks up a localized string similar to Settings. 226 | /// 227 | public static string Settings { 228 | get { 229 | return ResourceManager.GetString("Settings", resourceCulture); 230 | } 231 | } 232 | 233 | /// 234 | /// Looks up a localized string similar to Smart cut. 235 | /// 236 | public static string SmartCut { 237 | get { 238 | return ResourceManager.GetString("SmartCut", resourceCulture); 239 | } 240 | } 241 | 242 | /// 243 | /// Looks up a localized string similar to Support Me. 244 | /// 245 | public static string SupportMe { 246 | get { 247 | return ResourceManager.GetString("SupportMe", resourceCulture); 248 | } 249 | } 250 | 251 | /// 252 | /// Looks up a localized string similar to Detect images with simple backgrounds. The image will be scaled down to the width and height you provide. If a single object is detected in an image, the algorithm will add more background where necessary, or crop out unimportant parts.. 253 | /// 254 | public static string ThumbTip { 255 | get { 256 | return ResourceManager.GetString("ThumbTip", resourceCulture); 257 | } 258 | } 259 | 260 | /// 261 | /// Looks up a localized string similar to Upload. 262 | /// 263 | public static string Upload { 264 | get { 265 | return ResourceManager.GetString("Upload", resourceCulture); 266 | } 267 | } 268 | 269 | /// 270 | /// Looks up a localized string similar to You can upload any JPEG or PNG image to Tinify API for compression. We will automatically detect the image type and optimize accordingly using the TinyPNG or TinyJPG engine.. 271 | /// 272 | public static string UploadTip { 273 | get { 274 | return ResourceManager.GetString("UploadTip", resourceCulture); 275 | } 276 | } 277 | } 278 | } 279 | -------------------------------------------------------------------------------- /TinyGUI/Properties/Resources.de-de.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | text/microsoft-resx 4 | 5 | 6 | 1.3 7 | 8 | 9 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 10 | 11 | 12 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 13 | 14 | 15 | Bilddatei auswählen 16 | 17 | 18 | Bild hier ablegen 19 | 20 | 21 | https://tinypng.com/developers 22 | 23 | 24 | Sprache: 25 | 26 | 27 | Originales Bild ersetzen 28 | 29 | 30 | Einstellungen 31 | 32 | 33 | Unterstützen Sie mich 34 | 35 | 36 | Intelligenter schnitt 37 | 38 | 39 | Kompression 40 | 41 | 42 | Hochladen 43 | 44 | 45 | Sie können jedes JPEG- oder PNG-Bild zur Komprimierung in die Tinify-API hochladen. Wir werden den Bildtyp automatisch erkennen und mithilfe der TinyPNG- oder TinyJPG-Engine entsprechend optimieren. 46 | 47 | 48 | Verkleinern Sie das Bild. Sie müssen die Zielbreite oder -höhe angeben, nicht beides. Das verkleinerte Bild hat eine bestimmte Breite oder Höhe. 49 | 50 | 51 | Verkleinern Sie das Bild, sodass es der angegebenen Größe entspricht. Sie müssen Breite und Höhe angeben. Das verkleinerte Bild überschreitet keine dieser Abmessungen. 52 | 53 | 54 | Verkleinern Sie das Bild und schneiden Sie es bei Bedarf zu. Das Ergebnis hat genau die angegebenen Maße. Welcher Teil des Bildes beschnitten wird, wird automatisch bestimmt. Intelligente Algorithmen ermitteln die wichtigsten Bereiche im Bild. 55 | 56 | 57 | Erkennen Sie Bilder mit einfachen Hintergründen. Das Bild wird auf die von Ihnen angegebene Breite und Höhe verkleinert. Wenn ein einzelnes Objekt in einem Bild erkannt wird, fügt der Algorithmus bei Bedarf mehr Hintergrund hinzu oder schneidet unwichtige Teile aus. 58 | 59 | 60 | https://www.redisant.com 61 | 62 | 63 | Metadaten beibehalten: 64 | 65 | 66 | Sie können Metadaten angeben, die aus dem hochgeladenen Bild in die komprimierte Version kopiert werden. Unterstützt derzeit die Beibehaltung von Urheberrechtsinformationen, GPS-Standort und Erstellungsdatum. Das Beibehalten von Metadaten erhöht die Größe komprimierter Dateien, daher sollten Sie nur wichtige Metadaten aufbewahren. 67 | 68 | 69 | Urheberrechte © 70 | 71 | 72 | Alle Copyright-Informationen vorbehalten. Schließen Sie die EXIF-Copyright-Notation (JPEG), die XMP-Berechtigungsnotation (PNG) und die Photoshop-Copyright-Notation oder URL ein. Verwenden Sie bis zu 90 Byte plus die Länge der Copyright-Daten. 73 | 74 | 75 | Standort 76 | 77 | 78 | Alle Erstellungsdaten oder -zeiten werden beibehalten. Dies ist der Moment, in dem ein Bild oder Foto erstmals erstellt wird. Enthält EXIF-Raw-Datetime-Stempel (JPEG) oder XMP-Erstellungszeit (PNG). Verwendet etwa 70 zusätzliche Bytes. 79 | 80 | 81 | Erstellungsdatum 82 | 83 | 84 | Alle GPS-Standortinformationen, die beschreiben, wo das Bild oder Foto erstellt wurde, werden beibehalten. Enthält EXIF-GPS-Abmessungen und GPS-Genauigkeits-Tags (JPEG). Verwendet etwa 130 zusätzliche Bytes. 85 | 86 | -------------------------------------------------------------------------------- /TinyGUI/Properties/Resources.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | Choose Image Files 122 | 123 | 124 | Drop Image Here 125 | 126 | 127 | https://tinypng.com/developers 128 | 129 | 130 | Language: 131 | 132 | 133 | Replace Original Image 134 | 135 | 136 | Settings 137 | 138 | 139 | Support Me 140 | 141 | 142 | Smart cut 143 | 144 | 145 | Compression 146 | 147 | 148 | Upload 149 | 150 | 151 | You can upload any JPEG or PNG image to Tinify API for compression. We will automatically detect the image type and optimize accordingly using the TinyPNG or TinyJPG engine. 152 | 153 | 154 | Scale down the image. You must provide target width or height, not both. The reduced image will have a certain width or height. 155 | 156 | 157 | Scale down the image so that it fits the given size. You must provide both width and height. The downscaled image will not exceed any of these dimensions. 158 | 159 | 160 | Scale down the image and crop the image if necessary. The result has the exact given dimensions. Which part of the picture will be cropped is determined automatically. Smart algorithms determine the most important areas in the image. 161 | 162 | 163 | Detect images with simple backgrounds. The image will be scaled down to the width and height you provide. If a single object is detected in an image, the algorithm will add more background where necessary, or crop out unimportant parts. 164 | 165 | 166 | https://www.redisant.com 167 | 168 | 169 | Preserve metadata: 170 | 171 | 172 | You can specify metadata that is copied from the uploaded image to the compressed version. Currently supports preserving copyright information, GPS location and creation date. Preserving metadata increases the size of compressed files, so you should only keep important metadata. 173 | 174 | 175 | Copyright 176 | 177 | 178 | All copyright information reserved. Include EXIF copyright notation (JPEG), XMP permission notation (PNG), and Photoshop copyright notation or URL. Use up to 90 bytes, plus the length of the copyright data. 179 | 180 | 181 | Location 182 | 183 | 184 | Any creation date or time is preserved. This is the moment when an image or photo is initially created. Includes EXIF raw datetime stamp (JPEG) or XMP creation time (PNG). Uses about 70 extra bytes. 185 | 186 | 187 | Creation date 188 | 189 | 190 | Any GPS location information that describes where the picture or photo was created is preserved. Contains EXIF GPS Dimensions and GPS Accuracy tags (JPEG). Uses about 130 extra bytes. 191 | 192 | -------------------------------------------------------------------------------- /TinyGUI/Properties/Resources.zh-hant.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | text/microsoft-resx 4 | 5 | 6 | 1.3 7 | 8 | 9 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 10 | 11 | 12 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 13 | 14 | 15 | 選擇圖像 16 | 17 | 18 | 把圖像拖到此處 19 | 20 | 21 | https://tinify.cn/developers 22 | 23 | 24 | 語言 25 | 26 | 27 | 壓縮后替換原檔 28 | 29 | 30 | 設置 31 | 32 | 33 | 給個星星,支援一下 34 | 35 | 36 | 保留元數據: 37 | 38 | 39 | 您可以指定從上傳圖片拷貝到壓縮版本的元數據。當前支持保留版權信息,GPS位置和創建日期。保留元數據會增加壓縮文件的大小,因此您應該只保留重要的元數據。 40 | 41 | 42 | 版權信息 43 | 44 | 45 | 壓縮圖片 46 | 47 | 48 | 按比例縮小圖片,如有必要裁切圖片。結果具有準確的給定尺寸。圖片中哪個部分將被裁切是自動決定的。智能算法確定圖像中最重要的區域。 49 | 50 | 51 | 按比例縮小圖片,使其適合(fit)給定的尺寸。你必須同時提供width和height。縮小後的圖像不會超過這些尺寸中的任何一個。 52 | 53 | 54 | http://www.redisant.cn 55 | 56 | 57 | 按比例縮小圖片。您必須提供目標width或height,不能同時提供兩者。縮小後的圖片會有確定的寬度或者高度。 58 | 59 | 60 | 智能剪切 61 | 62 | 63 | 檢測具有簡單背景的圖片。圖片會被縮小到您提供的width和height的大小。如果一個圖片被檢測到獨立物體,算法將在必要位置添加更多的背景,或者裁切掉不重要的部分。 64 | 65 | 66 | 直接上傳 67 | 68 | 69 | 您可以上傳任何JPEG或PNG圖片到Tinify API來進行壓縮。我們將自動檢測圖片類型並相應的使用TinyPNG或TinyJPG引擎進行優化。 70 | 71 | 72 | 保留所有版權信息。包括EXIF版權標記(JPEG),XMP權限標記(PNG)以及Photoshop版權標記或URL。使用最多90個字節,再加上版權數據的長度。 73 | 74 | 75 | 位置信息 76 | 77 | 78 | 保留任何創建日期或時間。這是最初創建圖像或照片的時刻。包括EXIF原始日期時間標記(JPEG)或XMP創建時間(PNG)。使用大約70個額外字節。 79 | 80 | 81 | 創建日期 82 | 83 | 84 | 保留任何GPS位置信息,該信息描述圖片或者照片創建的位置。包含EXIF GPS維度和GPS精度標籤(JPEG)。使用大約130個額外字節。 85 | 86 | -------------------------------------------------------------------------------- /TinyGUI/Properties/Resources.zh.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | text/microsoft-resx 4 | 5 | 6 | 1.3 7 | 8 | 9 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 10 | 11 | 12 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 13 | 14 | 15 | 选择图像 16 | 17 | 18 | 把图像拖到此处 19 | 20 | 21 | https://tinify.cn/developers 22 | 23 | 24 | 语言: 25 | 26 | 27 | 压缩后替换原文件 28 | 29 | 30 | 设置 31 | 32 | 33 | 给个星星,支持一下 34 | 35 | 36 | 智能剪切 37 | 38 | 39 | 压缩图片 40 | 41 | 42 | 直接上传 43 | 44 | 45 | 您可以上传任何JPEG或PNG图片到Tinify API来进行压缩。我们将自动检测图片类型并相应的使用TinyPNG或TinyJPG引擎进行优化。 46 | 47 | 48 | 按比例缩小图片。您必须提供目标width或height,不能同时提供两者。缩小后的图片会有确定的宽度或者高度。 49 | 50 | 51 | 按比例缩小图片,使其适合(fit)给定的尺寸。你必须同时提供width和height。缩小后的图像不会超过这些尺寸中的任何一个。 52 | 53 | 54 | 按比例缩小图片,如有必要裁切图片。结果具有准确的给定尺寸。 图片中哪个部分将被裁切是自动决定的。智能算法确定图像中最重要的区域。 55 | 56 | 57 | 检测具有简单背景的图片。图片会被缩小到您提供的width和height的大小。 如果一个图片被检测到独立物体,算法将在必要位置添加更多的背景,或者裁切掉不重要的部分。 58 | 59 | 60 | http://www.redisant.cn 61 | 62 | 63 | 保留元数据: 64 | 65 | 66 | 您可以指定从上传图片拷贝到压缩版本的元数据。当前支持保留版权信息,GPS位置和创建日期。 保留元数据会增加压缩文件的大小,因此您应该只保留重要的元数据。 67 | 68 | 69 | 版权信息 70 | 71 | 72 | 保留所有版权信息。包括EXIF版权标记(JPEG),XMP权限标记(PNG)以及Photoshop版权标记或URL。 使用最多90个字节,再加上版权数据的长度。 73 | 74 | 75 | 位置信息 76 | 77 | 78 | 保留任何创建日期或时间。这是最初创建图像或照片的时刻。包括EXIF原始日期时间标记(JPEG)或XMP创建时间(PNG)。使用大约70个额外字节。 79 | 80 | 81 | 创建日期 82 | 83 | 84 | 保留任何GPS位置信息,该信息描述图片或者照片创建的位置。包含EXIF GPS维度和GPS精度标签(JPEG)。使用大约130个额外字节。 85 | 86 | -------------------------------------------------------------------------------- /TinyGUI/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // 5 | // Changes to this file may cause incorrect behavior and will be lost if 6 | // the code is regenerated. 7 | // 8 | //------------------------------------------------------------------------------ 9 | 10 | namespace TinyGUI.Properties { 11 | 12 | 13 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 14 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.9.0.0")] 15 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { 16 | 17 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 18 | 19 | public static Settings Default { 20 | get { 21 | return defaultInstance; 22 | } 23 | } 24 | 25 | [global::System.Configuration.UserScopedSettingAttribute()] 26 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 27 | [global::System.Configuration.DefaultSettingValueAttribute("")] 28 | public string Key { 29 | get { 30 | return ((string)(this["Key"])); 31 | } 32 | set { 33 | this["Key"] = value; 34 | } 35 | } 36 | 37 | [global::System.Configuration.UserScopedSettingAttribute()] 38 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 39 | [global::System.Configuration.DefaultSettingValueAttribute("False")] 40 | public bool ReplaceOriginalImage { 41 | get { 42 | return ((bool)(this["ReplaceOriginalImage"])); 43 | } 44 | set { 45 | this["ReplaceOriginalImage"] = value; 46 | } 47 | } 48 | 49 | [global::System.Configuration.UserScopedSettingAttribute()] 50 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 51 | [global::System.Configuration.DefaultSettingValueAttribute("-1")] 52 | public int LanguageIndex { 53 | get { 54 | return ((int)(this["LanguageIndex"])); 55 | } 56 | set { 57 | this["LanguageIndex"] = value; 58 | } 59 | } 60 | 61 | [global::System.Configuration.UserScopedSettingAttribute()] 62 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 63 | [global::System.Configuration.DefaultSettingValueAttribute("False")] 64 | public bool MetaCopyright { 65 | get { 66 | return ((bool)(this["MetaCopyright"])); 67 | } 68 | set { 69 | this["MetaCopyright"] = value; 70 | } 71 | } 72 | 73 | [global::System.Configuration.UserScopedSettingAttribute()] 74 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 75 | [global::System.Configuration.DefaultSettingValueAttribute("False")] 76 | public bool MetaLocation { 77 | get { 78 | return ((bool)(this["MetaLocation"])); 79 | } 80 | set { 81 | this["MetaLocation"] = value; 82 | } 83 | } 84 | 85 | [global::System.Configuration.UserScopedSettingAttribute()] 86 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 87 | [global::System.Configuration.DefaultSettingValueAttribute("False")] 88 | public bool MetaCreationTime { 89 | get { 90 | return ((bool)(this["MetaCreationTime"])); 91 | } 92 | set { 93 | this["MetaCreationTime"] = value; 94 | } 95 | } 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /TinyGUI/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | False 10 | 11 | 12 | -1 13 | 14 | 15 | False 16 | 17 | 18 | False 19 | 20 | 21 | False 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /TinyGUI/Styles/Button.xaml: -------------------------------------------------------------------------------- 1 |  3 | 4 | 47 | 48 | 49 | 50 | 94 | 95 | 96 | 144 | 145 | 190 | 191 | 214 | -------------------------------------------------------------------------------- /TinyGUI/Styles/ComboBoxStyle.xaml: -------------------------------------------------------------------------------- 1 |  3 | 4 | 5 | 6 | 7 | 8 | 9 | 13 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 106 | 107 | 130 | -------------------------------------------------------------------------------- /TinyGUI/Styles/Fonts.xaml: -------------------------------------------------------------------------------- 1 |  3 | pack://application:,,,/Fonts/#Segoe MDL2 Assets 4 | pack://application:,,,/Fonts/#Font Awesome 6 Pro 5 | pack://application:,,,/Fonts/JetBrainsMono/#JetBrains Mono 6 | -------------------------------------------------------------------------------- /TinyGUI/Styles/ScrollViewer.xaml: -------------------------------------------------------------------------------- 1 |  3 | 19 | 20 | 94 | 95 | 158 | 159 | 231 | 232 | 269 | -------------------------------------------------------------------------------- /TinyGUI/Styles/TextBox.xaml: -------------------------------------------------------------------------------- 1 |  3 | 44 | -------------------------------------------------------------------------------- /TinyGUI/TinyGUI.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {439823D0-9D2D-4FBB-9805-BE38433AFE5D} 8 | WinExe 9 | TinyGUI 10 | TinyGUI 11 | v4.7.2 12 | 512 13 | {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 14 | 4 15 | true 16 | 17 | 18 | AnyCPU 19 | true 20 | full 21 | false 22 | bin\Debug\ 23 | DEBUG;TRACE 24 | prompt 25 | 4 26 | 27 | 28 | AnyCPU 29 | pdbonly 30 | true 31 | bin\Release\ 32 | TRACE 33 | prompt 34 | 4 35 | 36 | 37 | Images\panda.ico 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 4.0 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | MSBuild:Compile 55 | Designer 56 | 57 | 58 | App.xaml 59 | Code 60 | 61 | 62 | 63 | 64 | True 65 | True 66 | Settings.settings 67 | 68 | 69 | 70 | 71 | MainWindow.xaml 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | Code 83 | 84 | 85 | True 86 | True 87 | Resources.resx 88 | 89 | 90 | PublicResXFileCodeGenerator 91 | Resources.Designer.cs 92 | 93 | 94 | Resources.resx 95 | 96 | 97 | Resources.resx 98 | 99 | 100 | Resources.resx 101 | 102 | 103 | 104 | 105 | 106 | SettingsSingleFileGenerator 107 | Settings.Designer.cs 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | -------------------------------------------------------------------------------- /TinyGUI/ViewModels/MainModel.cs: -------------------------------------------------------------------------------- 1 | namespace TinyGUI.ViewModels 2 | { 3 | public class MainModel : ViewModelBase 4 | { 5 | private bool _compressRadioButtonIsChecked = true; 6 | 7 | public bool CompressRadioButtonIsChecked 8 | { 9 | get => _compressRadioButtonIsChecked; 10 | set => SetField(ref _compressRadioButtonIsChecked, value, nameof(CompressRadioButtonIsChecked)); 11 | } 12 | 13 | private bool _smartCutRadioButtonIsChecked; 14 | 15 | public bool SmartCutRadioButtonIsChecked 16 | { 17 | get => _smartCutRadioButtonIsChecked; 18 | set => SetField(ref _smartCutRadioButtonIsChecked, value, nameof(SmartCutRadioButtonIsChecked)); 19 | } 20 | 21 | private bool _settingRadioButtonIsChecked; 22 | 23 | public bool SettingRadioButtonIsChecked 24 | { 25 | get => _settingRadioButtonIsChecked; 26 | set => SetField(ref _settingRadioButtonIsChecked, value, nameof(SettingRadioButtonIsChecked)); 27 | } 28 | 29 | 30 | #region 智能剪切 31 | 32 | private string _imageWidth = string.Empty; 33 | 34 | public string ImageWidth 35 | { 36 | get => _imageWidth; 37 | set => SetField(ref _imageWidth, value, nameof(ImageWidth)); 38 | } 39 | 40 | private string _imageHeight = string.Empty; 41 | 42 | public string ImageHeight 43 | { 44 | get => _imageHeight; 45 | set => SetField(ref _imageHeight, value, nameof(ImageHeight)); 46 | } 47 | 48 | private bool _scaleRadioButtonIsChecked = true; 49 | 50 | public bool ScaleRadioButtonIsChecked 51 | { 52 | get => _scaleRadioButtonIsChecked; 53 | set => SetField(ref _scaleRadioButtonIsChecked, value, nameof(ScaleRadioButtonIsChecked)); 54 | } 55 | 56 | private bool _fitRadioButtonIsChecked; 57 | 58 | public bool FitRadioButtonIsChecked 59 | { 60 | get => _fitRadioButtonIsChecked; 61 | set => SetField(ref _fitRadioButtonIsChecked, value, nameof(FitRadioButtonIsChecked)); 62 | } 63 | 64 | private bool _coverRadioButtonIsChecked; 65 | 66 | public bool CoverRadioButtonIsChecked 67 | { 68 | get => _coverRadioButtonIsChecked; 69 | set => SetField(ref _coverRadioButtonIsChecked, value, nameof(CoverRadioButtonIsChecked)); 70 | } 71 | 72 | private bool _thumbRadioButtonIsChecked; 73 | 74 | public bool ThumbRadioButtonIsChecked 75 | { 76 | get => _thumbRadioButtonIsChecked; 77 | set => SetField(ref _thumbRadioButtonIsChecked, value, nameof(ThumbRadioButtonIsChecked)); 78 | } 79 | 80 | #endregion 81 | 82 | private bool _isIndeterminate = false; 83 | 84 | public bool IsIndeterminate 85 | { 86 | get => _isIndeterminate; 87 | set => SetField(ref _isIndeterminate, value, nameof(IsIndeterminate)); 88 | } 89 | 90 | private double _progressBarValue = 0.0; 91 | 92 | public double ProgressBarValue 93 | { 94 | get => _progressBarValue; 95 | set 96 | { 97 | if (value > 0) 98 | { 99 | IsIndeterminate = false; 100 | } 101 | 102 | SetField(ref _progressBarValue, value, nameof(ProgressBarValue)); 103 | } 104 | } 105 | } 106 | } -------------------------------------------------------------------------------- /TinyGUI/ViewModels/ViewModelBase.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.ComponentModel; 3 | 4 | namespace TinyGUI.ViewModels 5 | { 6 | public class ViewModelBase : INotifyPropertyChanged 7 | { 8 | public event PropertyChangedEventHandler PropertyChanged; 9 | 10 | private void OnPropertyChanged(string propertyName) 11 | { 12 | PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 13 | } 14 | 15 | protected bool SetField(ref T field, T value, string propertyName) 16 | { 17 | if (EqualityComparer.Default.Equals(field, value)) return false; 18 | field = value; 19 | OnPropertyChanged(propertyName); 20 | return true; 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /TinyGUI/Views/MainWindow.xaml: -------------------------------------------------------------------------------- 1 |  15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 40 | 41 | 46 | 51 | 56 | 57 | 58 | 59 | 69 | 72 | 78 | 81 | 82 | 83 |