当前位置: 首页 > news >正文

c# 无损压缩照片大小,并且设计了界面,添加了外部Ookii.Dialogs.dll,不一样的选择文件夹界面,并且可以把外部dll打包进exe中

c# 无损压缩照片大小,并且设计了界面,添加了外部Ookii.Dialogs.dll,不一样的选择文件夹界面,并且可以把外部dll打包进exe中
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Net.NetworkInformation;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Net.WebRequestMethods;
using static System.Windows.Forms.AxHost;

namespace _23_无损压缩照片大小
{
public partial class Form1 : Form
{
public Form1()
{
DllClass.LoadResourceDll();//将dll加到exe需要加入这行代码
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string path = textBox1.Text;
string path_bc = textBox2.Text;
ArrayList list_jpg = select_jpg(path);
//设置进度条的最小及最大值
progressBar1.Maximum = list_jpg.Count;
progressBar1.Minimum = 0;
int i = 0;
setPos(i);
foreach (string item in list_jpg)
{
string pPath = System.IO.Path.GetDirectoryName(item); //获取文件路径
string pName = System.IO.Path.GetFileName(item); //获取文件名
string path_jpg_bc = path_bc + “\压缩后-” + pName;
//执行照片压缩
CompressImage(item, path_jpg_bc);
setPos(i);
i++;
}
setPos(i);
}
///
/// 根据文本框内容获取照片路径集合
///
/// 文本框路径
/// 照片集合
private static ArrayList select_jpg(string path)
{
ArrayList list_jpg = new ArrayList();
//判断是否是文件夹
if (Directory.Exists(path))
{
DirectoryInfo folder = new DirectoryInfo(path);
FileSystemInfo fileinfo1 = folder as FileSystemInfo;
list_jpg = selecte_jpg(fileinfo1);//获取文件夹下面所有的照片
}
else
{
//根据符号拆分照片路径
string[] result = path.Split(‘|’);
foreach (string item in result)
{
list_jpg.Add(item);//将路径添加到集合中
}
}
return list_jpg;
}
///
/// 提取文件夹下面所有的png
///
/// 文件夹路径
/// 所有png照片路径
private static ArrayList selecte_jpg(FileSystemInfo info)
{
DirectoryInfo dir = info as DirectoryInfo;
ArrayList listPics = new ArrayList();
FileSystemInfo[] files = dir.GetFileSystemInfos();
for (int i = 0; i < files.Length; i++)
{
FileInfo file = files[i] as FileInfo;
//是文件
if (file != null)
{
string extension = Path.GetExtension(file.Name);
if (extension.ToUpper() == “.PNG”)
{
listPics.Add(file.FullName);
}
else if (extension.ToUpper() == “.JPG”)
{
listPics.Add(file.FullName);
}
else if (extension.ToUpper() == “.ICO”)
{
listPics.Add(file.FullName);
}
}
else//对于子目录,进行递归调用
selecte_jpg(files[i]);
}
return listPics;
}
///
/// 无损压缩图片
///
/// 原图片地址
/// 压缩后保存图片地址
/// 压缩质量(数字越小压缩率越高)1-100
/// 压缩后图片的最大大小
/// 是否是第一次调用
///
public static bool CompressImage(string sFile, string dFile, int flag = 100, int size = 1000, bool sfsc = true)
{
Image iSource = Image.FromFile(sFile);
ImageFormat tFormat = iSource.RawFormat;
//如果是第一次调用,原始图像的大小小于要压缩的大小,则直接复制文件,并且返回true
FileInfo firstFileInfo = new FileInfo(sFile);
if (sfsc == true && firstFileInfo.Length < size * 1024)
{
try { firstFileInfo.CopyTo(dFile); }
catch
{
System.IO.File.Delete(dFile);
firstFileInfo.CopyTo(dFile);
}
return true;
}
int dHeight = iSource.Height / 2;
int dWidth = iSource.Width / 2;
int sW = 0, sH = 0;
//按比例缩放
Size tem_size = new Size(iSource.Width, iSource.Height);
if (tem_size.Width > dHeight || tem_size.Width > dWidth)
{
if ((tem_size.Width * dHeight) > (tem_size.Width * dWidth))
{
sW = dWidth;
sH = (dWidth * tem_size.Height) / tem_size.Width;
}
else
{
sH = dHeight;
sW = (tem_size.Width * dHeight) / tem_size.Height;
}
}
else
{
sW = tem_size.Width;
sH = tem_size.Height;
}
Bitmap ob = new Bitmap(dWidth, dHeight);
Graphics g = Graphics.FromImage(ob);
g.Clear(Color.WhiteSmoke);
g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
g.DrawImage(iSource, new Rectangle((dWidth - sW) / 2, (dHeight - sH) / 2, sW, sH), 0, 0, iSource.Width, iSource.Height, GraphicsUnit.Pixel);
g.Dispose();
//以下代码为保存图片时,设置压缩质量
EncoderParameters ep = new EncoderParameters();
long[] qy = new long[1];
qy[0] = flag;//设置压缩的比例1-100
EncoderParameter eParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qy);
ep.Param[0] = eParam;
try
{
ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
ImageCodecInfo jpegICIinfo = null;
for (int x = 0; x < arrayICI.Length; x++)
{
if (arrayICI[x].FormatDescription.Equals(“JPEG”))
{
jpegICIinfo = arrayICI[x];
break;
}
}
if (jpegICIinfo != null)
{
ob.Save(dFile, jpegICIinfo, ep);//dFile是压缩后的新路径
FileInfo fi = new FileInfo(dFile);
if (fi.Length > 1024 * size)
{
flag = flag - 10;
CompressImage(sFile, dFile, flag, size, false);
}
}
else
{
ob.Save(dFile, tFormat);
}
return true;
}
catch
{
return false;
}
finally
{
iSource.Dispose();
ob.Dispose();
}
}
private void label1_Click(object sender, EventArgs e)
{

    }private void button2_Click(object sender, MouseEventArgs e){if (e.Button == MouseButtons.Left){OpenFileDialog dialog = new OpenFileDialog();dialog.Multiselect = true;//该值确定是否可以选择多个文件dialog.Title = "请选择电子文档excel";dialog.Filter = "图片文件(*.jpg,*.png,*.ico)|*.jpg;*.png;*.ico";if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK){List<string> list = new List<string>();//循环将多个文件添加到集合中foreach (string file in dialog.FileNames){list.Add(file);}string result = String.Join("|", list);textBox1.Text = result.TrimEnd('|');}}else{Ookii.Dialogs.VistaFolderBrowserDialog folderBrowser = new Ookii.Dialogs.VistaFolderBrowserDialog();//folderBrowser.SelectedPath = @"D:";//folderBrowser.Description = "请选择网页所在的目录";folderBrowser.ShowNewFolderButton = true;if (folderBrowser.ShowDialog() == DialogResult.OK){textBox1.Text = folderBrowser.SelectedPath;}}}private void button3_Click(object sender, EventArgs e){Ookii.Dialogs.VistaFolderBrowserDialog folderBrowser = new Ookii.Dialogs.VistaFolderBrowserDialog();//folderBrowser.SelectedPath = @"D:";//folderBrowser.Description = "请选择网页所在的目录";folderBrowser.ShowNewFolderButton = true;if (folderBrowser.ShowDialog() == DialogResult.OK){textBox2.Text = folderBrowser.SelectedPath;}}/// <summary>/// 设置进度条/// </summary>/// <param name="value"></param>private void setPos(int value) //设置进度条当前进度值{if (value < progressBar1.Maximum + 1) //如果值有效{progressBar1.Value = value; //设置进度值}Application.DoEvents();//重点,必须加上,否则父子窗体都假死}/// <summary>/// 应用外部dll需要加上这个模块/// </summary>class DllClass{public static void LoadResourceDll(){AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);}private static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args){string dllName = args.Name.Contains(",") ? args.Name.Substring(0, args.Name.IndexOf(',')) : args.Name.Replace(".dll", "");dllName = dllName.Replace(".", "_");if (dllName.EndsWith("_resources")) return null;string Namespace = Assembly.GetEntryAssembly().GetTypes()[0].Namespace;System.Resources.ResourceManager rm = new System.Resources.ResourceManager(Namespace + ".Properties.Resources", System.Reflection.Assembly.GetExecutingAssembly());byte[] bytes = (byte[])rm.GetObject(dllName);return System.Reflection.Assembly.Load(bytes);}}
}

}

相关文章:

c# 无损压缩照片大小,并且设计了界面,添加了外部Ookii.Dialogs.dll,不一样的选择文件夹界面,并且可以把外部dll打包进exe中

c# 无损压缩照片大小&#xff0c;并且设计了界面&#xff0c;添加了外部Ookii.Dialogs.dll&#xff0c;不一样的选择文件夹界面&#xff0c;并且可以把外部dll打包进exe中 using System; using System.Collections; using System.Collections.Generic; using System.ComponentM…...

《统计学习方法》——隐马尔可夫模型(上)

引言 这是《统计学习方法》第二版的读书笔记&#xff0c;由于包含书上所有公式的推导和大量的图示&#xff0c;因此文章较长&#xff0c;正文分成三篇&#xff0c;以及课后习题解答&#xff0c;在习题解答中用Numpy实现了维特比算法和前向后向算法。 《统计学习方法》——隐马…...

ElasticSearch删除索引【真实案例】

文章目录 背景分析解决遇到的问题 - 删除超时报错信息解决办法1:调大超时时间解决办法2:调大ES堆内存参考背景 项目中使用了ELK技术栈实现了日志管理,但是日志管理功能目前并没有在生产上实际使用。 但ELK程序依然在运行,导致系统磁盘发生告警,剩余可用磁盘不足10%。 所以…...

基于FPGA+JESD204B 时钟双通道 6.4GSPS 高速数据采集设计(三)连续多段触发存储及传输逻辑设计

本章将完成数据速率为 80MHz 、位宽为 12bits 的 80 路并行采样数据的连续多 段触发存储。首先&#xff0c;给出数据触发存储的整体框架及功能模块划分。然后&#xff0c;简介 MIG 用户接口、设置及读写时序。最后&#xff0c;进行数据跨时钟域模块设计&#xff0c;内存…...

对 Iterator, Generator 的理解?

Iterator Iterator是最简单最好理解的。 简单的说&#xff0c;我们常用的 for of 循环&#xff0c;都是通过调用被循环对象的一个特殊函数 Iterator 来实现的&#xff0c;但是以前这个函数是隐藏的我们无法访问&#xff0c; 从 Symbol 引入之后&#xff0c;我们就可以通过 Sy…...

C++基础

文章目录 C命名空间定义命名空间using指令不连续的命名空间嵌套的命名空间 面向对象类类成员的访问权限及类的封装对象类成员函数类访问修饰符构造函数和析构函数类的构造函数带参数的构造函数使用初始化列表来初始化字段类的析构函数拷贝构造函数 友元函数内联函数this指针指向…...

软件测试全流程

软件测试全流程 一、制定测试策略二、制定测试方案三、编辑测试用例四、执行测试用例五、输出问题单六、回归测试七、测试文件归档 一、制定测试策略 1、测试目的测试范围 2、用什么测试方法工具&#xff08;例如功能测试用黑盒测试&#xff09; 3、测试优先级&#xff08;功能…...

【软件测试】支付模块测试攻略,这些测试方法和注意事项你掌握了么?

对于大部分人而言&#xff0c;支付模块或许是日常生活中最为关注和使用的功能之一&#xff0c;因此&#xff0c;对于支付模块的质量控制也显得尤为重要。 但考虑到支付涉及到金钱流转等敏感信息&#xff0c;一旦出现问题可能带来非常严重后果。因此&#xff0c;在支付模块测试…...

刷完这个笔记,17K不能再少了....

大家好&#xff0c;最近有不少小伙伴在后台留言&#xff0c;得准备面试了&#xff0c;又不知道从何下手&#xff01;为了帮大家节约时间&#xff0c;特意准备了一份面试相关的资料&#xff0c;内容非常的全面&#xff0c;真的可以好好补一补&#xff0c;希望大家在都能拿到理想…...

知识变现创业指南-《知识变现秘籍》

《知识变现秘籍》 知识变现创业者指南 读完将改变你的认知 开阔你的知识变现思路 系统掌握知识变现的要点 知识付费创业方法 帮你利用知识赚到你弟一桶金 如果你有一技之长&#xff0c;想变现 如果你有一身才华&#xff0c;想变现 如果你在某个领域有绝活 如果你是&am…...

springboot+java博物馆文物管理系统

用户前台进入系统可以进行首页、文物信息、论坛交流、文物资讯、留言反馈、我的、跳转到后台等springboot是基于spring的快速开发框架, 相比于原生的spring而言, 它通过大量的java config来避免了大量的xml文件, 只需要简单的生成器便能生成一个可以运行的javaweb项目, 是目前最…...

Ansible 自动化运维工具(二)——Ansible 的脚本(playbook 剧本)

Ansible 自动化运维工具—Ansible 的脚本playbook 剧本 playbooks 概述以及实例操作playbooks 的组成操作示例一&#xff1a;编写yaml文件也就是playbook修改配置文件并放入/opt/目录下运行playbook 操作实例二&#xff1a;定义、引用变量操作示例三&#xff1a;指定远程主机su…...

阿里云镜像服务下载并安装Go环境

【阿里云镜像】下载并安装Go环境 一、参考链接 阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 (aliyun.com) golang镜像-golang下载地址-golang安装教程-阿里巴巴开源镜像站 (aliyun.com) GO语言安装以及国内镜像 - DbWong_0918 - 博客园 (cnblogs.com) 二、Go介绍 Gol…...

工作线程快速优雅退出方式探讨

本文我们不用定时器。定时器会阻塞消息循环。先看需求&#xff1a; 我们先看第一种&#xff0c;有一个任务&#xff0c;要求每1秒钟执行一次&#xff0c;最常见的写法如下两种 bool bExitThread false; DWORD WorkThread1(LPVOID param) {while (false bExitThread){//// to…...

甘特图控件DHTMLX Gantt教程:用PHP:Laravel实现Gantt(上)

DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的大部分开发需求&#xff0c;具备完善的甘特图图表库&#xff0c;功能强大&#xff0c;价格便宜&#xff0c;提供丰富而灵活的JavaScript API接口&#xff0c;与各种服务器端技术&am…...

ffmpeg-命令大全03

ffplay/mpv 查看所有的解码器 ffplay -decoders >>decoders.txt ffplay无延时无缓存播放 ffplay -fflags nobuffer -i "%1" ffplay指定size播放 ffplay -x 480 -y 270 -i "%1" ffplay指定解码器 ffplay -vcodec hevc_cuvid "%1" […...

MATLAB中太赫兹时域光谱的最大似然参数估计

目录 一、引言 二、最大似然估计的基本原理 三、MATLAB中的最大似然估计实现 四、太赫兹时域光谱的最大似然参数估计 五、结论 六、参考文献 一、引言 太赫兹波&#xff08;Terahertz wave&#xff09;是电磁谱中介于微波与光波之间的一段频率范围&#xff0c;频率大约在…...

详解MySQL的并发控制

目录 1.概述 2.事务 2.1.什么是事务 2.2.事务的隔离级别 2.2.1.三种数据一致性问题 2.2.2.四种隔离级别 2.3.如何设置隔离级别 3.锁 3.1.锁与事务的关系 3.2.分类 3.3.表锁 3.3.1.概述 3.3.2.读锁 3.3.3.写锁 3.3.4.保护机制 3.4.行锁 3.4.1.概述 3.4.2.什么…...

Android Termux安装MySQL数据库 | 公网安全远程连接【cpolar内网穿透】

文章目录 前言1.安装MariaDB2.安装cpolar内网穿透工具3. 创建安全隧道映射mysql4. 公网远程连接5. 固定远程连接地址 前言 Android作为移动设备&#xff0c;尽管最初并非设计为服务器&#xff0c;但是随着技术的进步我们可以将Android配置为生产力工具&#xff0c;变成一个随身…...

SpringBoot的常见配置

SpringBoot基础配置 1. 配置文件格式问题导入1.1 修改服务器端口1.2 自动提示功能消失解决方案1.3 SpringBoot配置文件加载顺序 2. yaml问题导入2.1 yaml语法规则2.2 yaml数组数据2.3 yaml数据读取 3. 多环境开发配置问题导入3.1 多环境启动配置3.2 多环境启动命令格式3.3 多环…...

ArcGIS分区统计:从矢量边界到栅格数据的多维度指标提取

1. ArcGIS分区统计工具入门指南 第一次接触ArcGIS的分区统计功能时&#xff0c;我被它强大的数据处理能力惊艳到了。这个工具就像是一个智能的数据提取器&#xff0c;能够帮我们从复杂的空间数据中快速获取关键指标。想象一下&#xff0c;你手里有一张全国温度分布图&#xff0…...

别再只盯着UNet了!用TransFuse在医疗图像分割上实现又快又准(附PyTorch代码)

TransFuse&#xff1a;医疗图像分割的下一代混合架构实战指南 在息肉检测和皮肤病变分析等医疗图像分割任务中&#xff0c;我们常常陷入一个两难困境&#xff1a;选择CNN架构能够保留丰富的局部细节但难以建模全局关系&#xff0c;而纯Transformer模型虽然擅长捕捉长距离依赖却…...

告别虚拟机卡顿:用WSL2+Docker在Windows上丝滑编译OpenHarmony 4.0源码

告别虚拟机卡顿&#xff1a;用WSL2Docker在Windows上丝滑编译OpenHarmony 4.0源码 对于Windows平台的开发者而言&#xff0c;编译OpenHarmony源码一直是个令人头疼的问题。传统虚拟机方案不仅占用大量系统资源&#xff0c;还会导致编译速度缓慢&#xff0c;严重影响开发效率。…...

告别Qt Creator!在VSCode里配置Qt 6.8.3 + MSVC2022开发环境(附完整settings.json)

在VSCode中构建Qt 6.8.3开发环境&#xff1a;从零配置到高效开发 Qt Creator曾经是Qt开发者的标配IDE&#xff0c;但随着VSCode在代码编辑、插件生态和跨语言支持上的突飞猛进&#xff0c;越来越多的开发者开始转向这个轻量级但功能强大的编辑器。本文将带你从零开始&#xff0…...

Arduino nRF5x低功耗库:深度解析SYSTEM_OFF与CONSTANT_LATENCY模式

1. 项目概述 Arduino nRF5x_lowPower 是专为 Nordic Semiconductor nRF5x 系列 SoC&#xff08;如 nRF52832、nRF52840、nRF51822&#xff09;设计的 Arduino 兼容低功耗管理库。它并非简单封装睡眠函数&#xff0c;而是深度对接 nRF5x 片上电源管理单元&#xff08;PMU&…...

终极指南:如何用VR-Reversal免费将3D视频转为2D播放

终极指南&#xff1a;如何用VR-Reversal免费将3D视频转为2D播放 【免费下载链接】VR-reversal VR-Reversal - Player for conversion of 3D video to 2D with optional saving of head tracking data and rendering out of 2D copies. 项目地址: https://gitcode.com/gh_mirr…...

高性能客服系统技术内幕:通过 SpinWait 自旋等待结构体提升高频消息分发性能挥

1. 智能软件工程的范式转移&#xff1a;从库集成到原生框架演进 在生成式人工智能&#xff08;Generative AI&#xff09;从单纯的文本生成向具备自主规划与执行能力的“代理化&#xff08;Agentic&#xff09;”系统跨越的过程中&#xff0c;.NET 生态系统正在经历一场自该平台…...

基于eNSP的企业级网络规划与高可用性设计实战:从需求分析到配置验证

1. 企业级网络规划的核心挑战与eNSP价值 刚接手公司网络改造项目时&#xff0c;我最头疼的就是如何在纸上方案和真实环境之间架起桥梁。直到接触华为eNSP模拟器&#xff0c;才发现这个神器完美解决了网络工程师的三大痛点&#xff1a; 真实设备价格昂贵的问题被彻底化解。用笔记…...

多元高斯分布:条件分布的实际应用与推导解析

1. 多元高斯分布基础回顾 第一次接触多元高斯分布时&#xff0c;我被它优雅的数学形式深深吸引。这种分布在自然界中随处可见&#xff0c;比如一群人的身高体重数据、股票市场的收益率波动&#xff0c;甚至是天气预报中的温度湿度关系。多元高斯分布就像一位全能选手&#xff0…...

Android16进阶之SoundPool.setVolume调用流程与实战(二百七十九)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》作者 博主新书推荐&#xff1a;《Android系统多媒体进阶实战》&#x1f680; Android Audio工程师专栏地址&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; Android多媒体专栏地址&a…...