C# 编写将C:\\TEST及TEST下所有子文件夹的所有图片批量压缩后保存到D:\\TEST及对应子文件夹下

时间: 2023-08-04 16:17:50 浏览: 15
您好,这是一个比较复杂的任务,需要用到 C# 的文件操作和图片压缩等相关知识。以下是一个参考的实现方法,仅供参考: ```csharp using System; using System.IO; using System.Drawing.Imaging; using System.Drawing; class Program { static void Main(string[] args) { // 源文件夹和目标文件夹路径 string sourceFolder = @"C:\TEST"; string targetFolder = @"D:\TEST"; // 批量处理源文件夹下的所有图片 ProcessFolder(sourceFolder, targetFolder); } // 批量处理文件夹下的所有图片 static void ProcessFolder(string sourceFolder, string targetFolder) { // 压缩后的图片质量 long quality = 70L; // 处理当前文件夹下的文件 foreach (string file in Directory.GetFiles(sourceFolder)) { // 判断是否为图片文件 if (IsImageFile(file)) { // 压缩图片并保存到目标文件夹下 CompressAndSaveImage(file, Path.Combine(targetFolder, Path.GetFileName(file)), quality); } } // 处理当前文件夹下的子文件夹 foreach (string folder in Directory.GetDirectories(sourceFolder)) { // 创建对应的目标文件夹 string subTargetFolder = Path.Combine(targetFolder, Path.GetFileName(folder)); Directory.CreateDirectory(subTargetFolder); // 递归处理子文件夹 ProcessFolder(folder, subTargetFolder); } } // 判断文件是否为图片文件 static bool IsImageFile(string file) { string ext = Path.GetExtension(file).ToLower(); return ext == ".jpg" || ext == ".jpeg" || ext == ".png" || ext == ".bmp"; } // 压缩图片并保存到目标文件夹下 static void CompressAndSaveImage(string sourceFile, string targetFile, long quality) { // 创建图片对象 Image image = Image.FromFile(sourceFile); // 创建编码器参数 EncoderParameter qualityParam = new EncoderParameter(Encoder.Quality, quality); EncoderParameters encoderParams = new EncoderParameters(1); encoderParams.Param[0] = qualityParam; // 获取文件格式对应的编码器 ImageCodecInfo codecInfo = GetEncoderInfo(Path.GetExtension(targetFile)); // 保存压缩后的图片 image.Save(targetFile, codecInfo, encoderParams); // 释放资源 image.Dispose(); } // 获取文件格式对应的编码器 static ImageCodecInfo GetEncoderInfo(string extension) { ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders(); foreach (ImageCodecInfo codec in codecs) { if (codec.FilenameExtension.ToLower().Contains(extension.ToLower())) { return codec; } } return null; } } ``` 上述代码中,`ProcessFolder` 方法递归处理文件夹下的所有文件和子文件夹,判断文件是否为图片文件,如果是则调用 `CompressAndSaveImage` 方法对图片进行压缩,并保存到目标文件夹下。`CompressAndSaveImage` 方法中,通过 `Image.FromFile` 方法创建图片对象,使用 `EncoderParameters` 对象设置图片压缩质量,再通过编码器保存压缩后的图片。`GetEncoderInfo` 方法根据文件格式获取对应的编码器。需要注意的是,这只是一个参考实现,您需要根据具体需求进行适当修改。

相关推荐

C#单元测试中的模拟(mock)是一种常用的技术,用于在测试中创建虚拟的对象,以替代真实的依赖项,以确保测试的可预测性和可重复性。 在C#中,常用的单元测试模拟框架包括Moq、NSubstitute和FakeItEasy等。这些框架提供了一些API,使得我们可以轻松地创建和配置模拟对象。 下面是一个使用Moq进行模拟的示例: csharp // 需要进行单元测试的类 public class Calculator { private IDataProvider _dataProvider; public Calculator(IDataProvider dataProvider) { _dataProvider = dataProvider; } public int AddNumbers(int a, int b) { // 从数据提供者获取数据 int data = _dataProvider.GetData(); // 执行计算 int result = a + b + data; return result; } } // 数据提供者的接口 public interface IDataProvider { int GetData(); } // 使用Moq创建并配置模拟对象进行测试 [Test] public void AddNumbers_ShouldReturnCorrectSum() { // 创建模拟对象 var dataProviderMock = new Mock<IDataProvider>(); // 配置模拟对象的行为 dataProviderMock.Setup(dp => dp.GetData()).Returns(10); // 创建被测试对象,并传入模拟对象 var calculator = new Calculator(dataProviderMock.Object); // 执行测试 int result = calculator.AddNumbers(1, 2); // 验证结果 Assert.AreEqual(13, result); } 在上面的示例中,我们使用Moq创建了一个IDataProvider的模拟对象,并配置了模拟对象的行为。然后,我们创建了被测试对象Calculator,并将模拟对象传递给它的构造函数。最后,我们执行了AddNumbers方法,并验证了最终的结果。 使用模拟对象可以帮助我们解决以下问题: 1. 解除对外部依赖项(如数据库、网络请求等)的依赖,使得测试更加独立和可控。 2. 模拟复杂的对象和行为,以测试各种边界情况和异常情况。 3. 提供自定义的返回值或异常,以测试不同的路径和条件。 相关问题: 1. 除了Moq之外,还有哪些常用的C#单元测试模拟框架? 2. 在使用模拟对象时,如何验证方法的参数是否被正确调用? 3. 如何配置模拟对象的返回值或抛出异常? 4. 在一些特殊情况下,如何模拟异步方法的行为? 5. 在多个测试中共享模拟对象有什么注意事项?
在C语言中,我们可以使用Test Unit库来创建测试单元。首先,我们需要一个测试框架,例如CUnit,它提供了用于测试C代码的各种功能。 首先,我们需要创建一个测试源文件,例如test.c。在这个文件中,我们可以编写我们的测试代码。可以使用CUnit提供的宏来定义和执行测试。例如,我们可以使用CU_ASSERT_EQUAL宏来比较两个值是否相等。 接下来,我们需要创建一个测试套件。测试套件是一组相关的测试用例,用于测试某个特定的功能。例如,我们可以创建一个名为test_suite的测试套件。 然后,我们需要在测试套件中添加测试用例。测试用例是具体的测试实例,用于测试特定功能的不同方面。例如,在我们的test_suite中,我们可以添加一个测试用例test_canoe_creation,用于测试canoe的创建。 在测试用例中,我们可以使用CUnit提供的各种断言宏来验证我们的代码是否按预期工作。例如,我们可以使用CU_ASSERT_EQUAL宏来验证canoe是否按预期创建。 最后,我们需要为我们的测试代码编写一个main函数来运行测试。在main函数中,我们需要初始化CUnit,并运行我们的测试套件。之后,我们可以生成测试报告,以查看测试结果。 通过使用CUnit的测试单元创建方法,我们可以轻松地编写和运行测试代码,以验证我们的canoe创建的功能是否如预期。这样做可以帮助我们发现和解决潜在的问题,确保我们的代码质量和可靠性。
可以使用FileSystemWatcher类来监控文件夹中的文件变化,使用Timer类来定时执行抓取文件的任务。以下是一个简单的示例: csharp using System; using System.IO; using System.Timers; class Program { static string folderPath = @"C:\test"; // 需要监控的文件夹路径 static string outputPath = @"C:\output"; // 输出文件夹路径 static Timer timer = new Timer(5000); // 定时器,每5秒执行一次 static void Main() { // 初始化定时器 timer.Elapsed += Timer_Elapsed; timer.AutoReset = true; timer.Enabled = true; // 初始化文件监控器 FileSystemWatcher watcher = new FileSystemWatcher(folderPath); watcher.IncludeSubdirectories = true; watcher.NotifyFilter = NotifyFilters.FileName; watcher.Created += Watcher_Created; watcher.EnableRaisingEvents = true; Console.WriteLine("Press any key to exit..."); Console.ReadKey(); } static void Timer_Elapsed(object sender, ElapsedEventArgs e) { // 抓取文件 string[] files = Directory.GetFiles(folderPath, "*.txt", SearchOption.AllDirectories); foreach (string file in files) { // 判断文件是否为只读 FileAttributes attributes = File.GetAttributes(file); if ((attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) { // 在文件头部添加信息 string content = File.ReadAllText(file); content = "This file is read-only.\n" + content; File.WriteAllText(file, content); // 转换为csv格式并保存到输出文件夹 string csvFile = Path.Combine(outputPath, Path.GetFileNameWithoutExtension(file) + ".csv"); // TODO: 实现csv格式转换和保存 } } } static void Watcher_Created(object sender, FileSystemEventArgs e) { Console.WriteLine("New file created: " + e.FullPath); } } 注意:上述代码仅作为示例,还需要根据具体需求进行修改和完善。例如,需要实现csv格式转换和保存的代码。
以下是使用OpenCvSharp实现的Canny多线程计算后找圆心的C#示例代码: csharp using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using OpenCvSharp; namespace CannyCircleDetection { class Program { static void Main(string[] args) { Mat src = Cv2.ImRead("test.png", ImreadModes.Grayscale); // 双边滤波去噪 Mat blurred = new Mat(); Cv2.BilateralFilter(src, blurred, 9, 75, 75); // Canny边缘检测 Mat edges = new Mat(); Cv2.Canny(blurred, edges, 50, 200); // 多线程计算 Point[][] contours; HierarchyIndex[] hierarchy; Cv2.FindContours(edges, out contours, out hierarchy, RetrievalModes.Tree, ContourApproximationModes.ApproxSimple); // 合并所有点 List allPoints = new List(); foreach (var contour in contours) { allPoints.AddRange(contour); } // 从外往内找圆心 Point2f center; float radius; Cv2.MinEnclosingCircle(allPoints.ToArray(), out center, out radius); Console.WriteLine("Center: ({0}, {1}), Radius: {2}", center.X, center.Y, radius); // 从白边起找圆心 Mat whiteEdges = new Mat(); Cv2.Threshold(edges, whiteEdges, 127, 255, ThresholdTypes.BinaryInv); Cv2.FindContours(whiteEdges, out contours, out hierarchy, RetrievalModes.Tree, ContourApproximationModes.ApproxSimple); allPoints.Clear(); foreach (var contour in contours) { allPoints.AddRange(contour); } Cv2.MinEnclosingCircle(allPoints.ToArray(), out center, out radius); Console.WriteLine("Center: ({0}, {1}), Radius: {2}", center.X, center.Y, radius); // 高精度亚像素 Mat gray = new Mat(); Cv2.CvtColor(src, gray, ColorConversionCodes.BGR2GRAY); Cv2.GaussianBlur(gray, gray, new Size(9, 9), 2, 2); Cv2.HoughCircles(gray, HoughMethods.Gradient, 1, 20, 200, 50, 0, 0); foreach (Vec3f circle in circles) { Point center = new Point((int)circle[0], (int)circle[1]); int radius = (int)circle[2]; Cv2.Circle(src, center, radius, Scalar.Green, 2); } Cv2.ImShow("Result", src); Cv2.WaitKey(0); Cv2.DestroyAllWindows(); } } } 这段代码包含了三个不同的圆心计算方法,分别是从外往内找圆心、从白边起找圆心、高精度亚像素。你可以根据需要选择一种或多种方法。
以下是一个基于OpenCVSharp的Canny边缘检测并找圆心的示例代码,其中包括了分块并行计算和高精度亚像素的实现: csharp using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using OpenCvSharp; namespace CannyCircleDetection { class Program { static void Main(string[] args) { Mat src = Cv2.ImRead("test.png"); Mat gray = new Mat(); Cv2.CvtColor(src, gray, ColorConversionCodes.BGR2GRAY); // 分块并行计算Canny边缘 int blockWidth = 100; int blockHeight = 100; int rows = (int)Math.Ceiling((double)gray.Rows / blockHeight); int cols = (int)Math.Ceiling((double)gray.Cols / blockWidth); List<Mat> blocks = new List<Mat>(); for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { int x = j * blockWidth; int y = i * blockHeight; int width = Math.Min(blockWidth, gray.Cols - x); int height = Math.Min(blockHeight, gray.Rows - y); Rect roi = new Rect(x, y, width, height); Mat block = new Mat(gray, roi); Cv2.Canny(block, block, 50, 150); blocks.Add(block); } } // 合并所有找到的点 Mat canny = new Mat(gray.Rows, gray.Cols, MatType.CV_8UC1, Scalar.All(0)); foreach (Mat block in blocks) { for (int i = 0; i < block.Rows; i++) { for (int j = 0; j < block.Cols; j++) { if (block.At<byte>(i, j) > 0) { canny.Set<byte>(i + block.Rows * (int)Math.Floor((double)block.Y / blockHeight), j + block.Cols * (int)Math.Floor((double)block.X / blockWidth), 255); } } } } // 从外往内找圆心 Point2f[] circles = Cv2.HoughCircles(canny, HoughModes.Gradient, 1, 20, param1: 50, param2: 30, minRadius: 0, maxRadius: 0); if (circles.Length > 0) { Point2f center = circles[0]; float radius = circles[0].Z; Cv2.Circle(src, center, (int)radius, Scalar.Red, 2); } // 从白边起找圆心 Point2f[] whiteCircles = Cv2.HoughCircles(canny, HoughModes.Gradient, 1, 20, param1: 50, param2: 30, minRadius: 0, maxRadius: 0); if (whiteCircles.Length > 0) { Point2f center = whiteCircles[0]; float radius = whiteCircles[0].Z; Cv2.Circle(src, center, (int)radius, Scalar.Blue, 2); } // 高精度亚像素 Mat grayFloat = new Mat(); gray.ConvertTo(grayFloat, MatType.CV_32FC1); Point2f[] subpixelCircles = Cv2.HoughCircles(grayFloat, HoughModes.Gradient, 1, 20, param1: 50, param2: 30, minRadius: 0, maxRadius: 0); if (subpixelCircles.Length > 0) { Point2f center = subpixelCircles[0]; float radius = subpixelCircles[0].Z; Cv2.Circle(src, center, (int)radius, Scalar.Green, 2); } Cv2.ImShow("Result", src); Cv2.WaitKey(); } } } 需要注意的是,该代码仅为示例代码,具体实现需要根据实际需求进行调整。

最新推荐

IKM测试攻略_Test(71题)

是否还是为面试而苦恼?最齐全的IKM TEST试题集,包含71到原题及答案,助你撬开500强的大门!

将java程序打成jar包在cmd命令行下执行的方法

主要给大家介绍了关于将java程序打成jar包在cmd命令行下执行的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

学科融合背景下“编程科学”教学活动设计与实践研究.pptx

学科融合背景下“编程科学”教学活动设计与实践研究.pptx

ELECTRA风格跨语言语言模型XLM-E预训练及性能优化

+v:mala2277获取更多论文×XLM-E:通过ELECTRA进行跨语言语言模型预训练ZewenChi,ShaohanHuangg,LiDong,ShumingMaSaksham Singhal,Payal Bajaj,XiaSong,Furu WeiMicrosoft Corporationhttps://github.com/microsoft/unilm摘要在本文中,我们介绍了ELECTRA风格的任务(克拉克等人。,2020b)到跨语言语言模型预训练。具体来说,我们提出了两个预训练任务,即多语言替换标记检测和翻译替换标记检测。此外,我们预训练模型,命名为XLM-E,在多语言和平行语料库。我们的模型在各种跨语言理解任务上的性能优于基线模型,并且计算成本更低。此外,分析表明,XLM-E倾向于获得更好的跨语言迁移性。76.676.476.276.075.875.675.475.275.0XLM-E(125K)加速130倍XLM-R+TLM(1.5M)XLM-R+TLM(1.2M)InfoXLMXLM-R+TLM(0.9M)XLM-E(90K)XLM-AlignXLM-R+TLM(0.6M)XLM-R+TLM(0.3M)XLM-E(45K)XLM-R0 20 40 60 80 100 120触发器(1e20)1介绍使�

docker持续集成的意义

Docker持续集成的意义在于可以通过自动化构建、测试和部署的方式,快速地将应用程序交付到生产环境中。Docker容器可以在任何环境中运行,因此可以确保在开发、测试和生产环境中使用相同的容器镜像,从而避免了由于环境差异导致的问题。此外,Docker还可以帮助开发人员更快地构建和测试应用程序,从而提高了开发效率。最后,Docker还可以帮助运维人员更轻松地管理和部署应用程序,从而降低了维护成本。 举个例子,假设你正在开发一个Web应用程序,并使用Docker进行持续集成。你可以使用Dockerfile定义应用程序的环境,并使用Docker Compose定义应用程序的服务。然后,你可以使用CI

红楼梦解析PPT模板:古典名著的现代解读.pptx

红楼梦解析PPT模板:古典名著的现代解读.pptx

大型语言模型应用于零镜头文本风格转换的方法简介

+v:mala2277获取更多论文一个使用大型语言模型进行任意文本样式转换的方法Emily Reif 1页 达芙妮伊波利托酒店1,2 * 袁安1 克里斯·卡利森-伯奇(Chris Callison-Burch)Jason Wei11Google Research2宾夕法尼亚大学{ereif,annyuan,andycoenen,jasonwei}@google.com{daphnei,ccb}@seas.upenn.edu摘要在本文中,我们利用大型语言模型(LM)进行零镜头文本风格转换。我们提出了一种激励方法,我们称之为增强零激发学习,它将风格迁移框架为句子重写任务,只需要自然语言的指导,而不需要模型微调或目标风格的示例。增强的零触发学习很简单,不仅在标准的风格迁移任务(如情感)上,而且在自然语言转换(如“使这个旋律成为旋律”或“插入隐喻”)上都表现出了1介绍语篇风格转换是指在保持语篇整体语义和结构的前提下,重新编写语篇,使其包含其他或替代的风格元素。虽然�

xpath爬虫亚马逊详情页

以下是使用XPath爬取亚马逊详情页的步骤: 1. 首先,使用requests库获取亚马逊详情页的HTML源代码。 2. 然后,使用lxml库的etree模块解析HTML源代码。 3. 接着,使用XPath表达式提取所需的数据。 4. 最后,将提取的数据保存到本地或者数据库中。 下面是一个简单的示例代码,以提取亚马逊商品名称为例: ```python import requests from lxml import etree # 设置请求头 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x

基于Internet的数据安全上传软件设计.doc

基于Internet的数据安全上传软件设计.doc

无监督视频对象分割的层次特征对齐网络(HFAN)

+v:mala2255获取更多论文用于无监督视频对象分割的裴根生1,沈福民2(),姚亚洲1,谢国森1(),唐振民1,唐金辉11南京理工大学,中国yazhou. njust.edu.cn2电子科技大学,中国https://github.com/NUST-Machine-Intelligence-Laboratory/HFAN抽象的。 光流是一个容易构思和宝贵的线索,为推进无监督视频对象分割(UVOS)。以往的方法大多是在UVOS环境下直接提取和融合运动和外观特征来分割目标对象。然而,光流本质上是连续帧中所有像素的瞬时速度,从而使得运动特征与对应帧中的主要对象为了解决上述挑战,我们提出了一个简洁,实用,高效的外观和运动特征对齐架构,被称为层次特征对齐网络(HFAN)。具体而言,HFAN中的关键优点是顺序特征匹配(FAM)模块和特征匹配(FAT)模块,其用于分层地处理表观和运动特征FAM能够分别将外观和运动特征与主要对象语义表�