当前位置:   article > 正文

c#的面向AI编程-批量处理JPG图片为固定宽度--【InsCodeAI编程】_c# ai

c# ai

InsCodeAI的面向AI编程系列文章目录

本系列校训

互相伤害互相卷,玩命学习要你管,天生我才必有用,我命由我不由天!
有了AI牛翻天,作业难度全一般,发财小手动一动,关注收藏点一点。
文章末有批量处理JPG的小工具,还比较好用

毕设(作业)的技术铺垫

环境及工具:

本系列环境

环境win7
工具visual studio 2017
项目导入方式打开目录
使用AIInsCode

作业说明

AI一般不能生成一大堆的文件,做项目,但是在某个算法,某个方法的处理上,那基本上就是完爆初学者了。甚至我发现,对于我一个编程20多年的老手,我也依赖上这个东西了。毕竟老程序员多的只是经验,百度找东西快,知道过滤网上搬的那些一眼就看出完全不能运行的文章的代码,但是AI完全不用担心这些。
现在不是研究AI给初学者带来了多大的冲击,而是怎么用AI更好的完成自己的工作。
甚至现在看到了这样的文章
《AI在招聘领域有哪些应用场景?》
《精通“微表情&面相学“AI面试官已就位 请接招》
HR都开始玩AI了,那你做为程序员或准程序员,你还不会AI你怎么破局呢?
会不会发展到面试官只管问问题,天南海北的问就行了,屋子里安有摄像头,然后,面试完直接问AI,这个应试者技术打多少分,素质打多少分?反应能力打多少分,抗压能力打多少分?
AI可以一票否决应试者。会不会在不远的将来就真的实现?

总体功能

好了,我来说一下这个作业的功能。
就是我对C#差不多就是会安装。然后呢,我碰到了一个问题,就是要写软件手册,或者是论文里图片大大小小的很难看,因为一般的文章都是要图片居中的,如果图片不是等宽的。那领导看了之后会很生气,后果很严重。
在这里插入图片描述
当然了,网上也有不少的工具,但是大多数都是让你用PS工具,还要啥啥的录制宏?我的天。要是有几十张,基本上就放挺了。如果有几百张?啥还有子目录?
在这里插入图片描述
这个功能要是不开发出来,那还敢到底显摆?
好了,直接上界面,话说,我好歹也是做了三个C# 的人了,应该不算初学者了。

上来计划一个界面。
在这里插入图片描述
操作嘛,就是上来先选一张图片,总得看看是不是选错了目录。
勾带子目录的,就是把这个目录及子目录的所有JPG全改成统一宽度。PNG的可以通过另一个小工具去改成JPG图片。《c#的面向AI编程-批量转PNG文件为JPG过滤掉小图标–【InsCodeAI编程】

现在的网上的小工具好多都不能下载。所以我也不想去找了,直接自己制作就是了。自己能做还用别人?

向AI发招

在这里插入图片描述

在这里插入图片描述


                FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();
                if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
                {
                    string folderPath = folderBrowserDialog.SelectedPath;
                    // 使用获取到的文件夹路径进行操作
                }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述

private void button1_Click(object sender, EventArgs e)
{
    FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();
    if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
    {
        string folderPath = folderBrowserDialog.SelectedPath;
        Clipboard.SetText(folderPath); // 将路径复制到剪贴板
        MessageBox.Show("文件夹路径已复制到剪贴板。");
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

我换了一个说法:
在这里插入图片描述

private void button1_Click(object sender, EventArgs e)
{
    OpenFileDialog openFileDialog = new OpenFileDialog();
    if (openFileDialog.ShowDialog() == DialogResult.OK)
    {
        string filePath = openFileDialog.FileName;
        MessageBox.Show("你选择的文件是:" + filePath);
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

在这里插入图片描述

string directoryPath = Path.GetDirectoryName(filePath);

  • 1
  • 2

在这里插入图片描述

// 使用单反斜杠并使用转义字符
pictureBox1.Image = Image.FromFile("C:\\Images\\aa.jpg");

// 使用双反斜杠
pictureBox1.Image = Image.FromFile("C:/Images/aa.jpg");

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

这里还是要过滤一下,测试了一下,选的文件太乱。
在这里插入图片描述

using System;
using System.Windows.Forms;

// ...

private void button1_Click(object sender, EventArgs e)
{
    using (OpenFileDialog openFileDialog = new OpenFileDialog())
    {
        // 设置文件类型筛选
        openFileDialog.Filter = "JPEG 图像文件|*.jpg";

        // 显示对话框
        if (openFileDialog.ShowDialog() == DialogResult.OK)
        {
            // 获取选中文件的完整路径
            string filePath = openFileDialog.FileName;

            // 处理文件
            pictureBox1.Image = Image.FromFile(filePath);
        }
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

然后,再用文件名,得到目录
在这里插入图片描述

string fullPath = "C:\\Users\\UserName\\Documents\\file.txt";
string directoryPath = Path.GetDirectoryName(fullPath);
Console.WriteLine(directoryPath);

  • 1
  • 2
  • 3
  • 4

第一阶段 选择目录

在这里插入图片描述
预期目录,选择一个文件夹里的图片,
上面显示的目录,这个正确了
下面的要显示图片,这个也显示了,但是,它并没有缩放一下,显示的不全呀。

在这里插入图片描述
我去跟AI“商量”了一下,结果AI 体贴如初恋女友…

private void button1_Click(object sender, EventArgs e)
{
    using (OpenFileDialog openFileDialog = new OpenFileDialog())
    {
        // 设置文件类型筛选
        openFileDialog.Filter = "JPEG 图像文件|*.jpg";

        // 显示对话框
        if (openFileDialog.ShowDialog() == DialogResult.OK)
        {
            // 获取选中文件的完整路径
            string filePath = openFileDialog.FileName;

            // 处理文件
            pictureBox1.SizeMode = PictureBoxSizeMode.Zoom;
            pictureBox1.Image = Image.FromFile(filePath);
        }
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

第一阶段,成了。
在这里插入图片描述

第二阶段,批量处理

在这里插入图片描述

using System;
using System.Drawing;
using System.IO;

namespace ImageResize
{
    class Program
    {
        static void Main(string[] args)
        {
            // 获取目标文件夹路径
            string directory = @"C:\Test";

            // 遍历目录及子目录下的所有 JPG 文件
            foreach (string file in Directory.GetFiles(directory, "*.jpg", SearchOption.AllDirectories))
            {
                // 加载图片
                Image image = Image.FromFile(file);

                // 如果宽度超过600,则调整图片大小
                if (image.Width > 600)
                {
                    double ratio = (double)600 / image.Width;
                    int newHeight = (int)(image.Height * ratio);
                    Image newImage = image.GetThumbnailImage(600, newHeight, null, IntPtr.Zero);
                    image.Dispose();

                    // 保存调整后的图片
                    FileInfo fileInfo = new FileInfo(file);
                    string newName = Path.Combine(fileInfo.DirectoryName, $"{fileInfo.Name}-600.jpg");
                    newImage.Save(newName, System.Drawing.Imaging.ImageFormat.Jpeg);
                    newImage.Dispose();

                    // 删除原文件
                    File.Delete(file);
                }
            }

            Console.WriteLine("处理完成!");
        }
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

得,这一大堆的,完全搞不懂。
在这里插入图片描述

using System;
using System.Drawing;
using System.IO;

namespace ImageResize
{
    class Program
    {
        static void Main(string[] args)
        {
            // 获取目标文件夹路径
            string directory = @"C:\Test";
            // 调用函数
            ResizeJpgFiles(directory, 600);

            Console.WriteLine("处理完成!");
        }

        static void ResizeJpgFiles(string directory, int width)
        {
            // 遍历目录及子目录下的所有 JPG 文件
            foreach (string file in Directory.GetFiles(directory, "*.jpg", SearchOption.AllDirectories))
            {
                // 加载图片
                Image image = Image.FromFile(file);

                // 如果宽度超过指定宽度,则调整图片大小
                if (image.Width > width)
                {
                    double ratio = (double)width / image.Width;
                    int newHeight = (int)(image.Height * ratio);
                    Image newImage = image.GetThumbnailImage(width, newHeight, null, IntPtr.Zero);
                    image.Dispose();

                    // 保存调整后的图片
                    FileInfo fileInfo = new FileInfo(file);
                    string newName = Path.Combine(fileInfo.DirectoryName, $"{fileInfo.Name}-{width}.jpg");
                    newImage.Save(newName, System.Drawing.Imaging.ImageFormat.Jpeg);
                    newImage.Dispose();

                    // 删除原文件
                    File.Delete(file);
                }
            }
        }
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

在这里插入图片描述

结果翻车了
在这里插入图片描述
结果AI连着生成的几个版本都不能解决问题。

在这里插入图片描述
生成了好多次。

using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

// 修改指定目录下的所有 JPG 图片
static void ResizeJpg(string directoryPath, int width)
{
    // 获取目录下的所有 JPEG 文件
    var jpgFiles = Directory.GetFiles(directoryPath, "*.jpg", SearchOption.AllDirectories);

    foreach (var jpgFile in jpgFiles)
    {
        lock (jpgFile) // 使用 lock 关键字来保证同一时间只有一个线程在处理同一个文件
        {
            try
            {
                // 等待占用文件的程序释放文件
                var retryTimes = 10;
                while (retryTimes > 0)
                {
                    try
                    {
                        using (var stream = new FileStream(jpgFile, FileMode.Open, FileAccess.ReadWrite))
                        {
                            stream.ReadByte();
                            break;
                        }
                    }
                    catch (IOException)
                    {
                        // 等待 100 毫秒后重试
                        Thread.Sleep(100);
                        retryTimes--;
                    }
                }

                // 如果尝试了多次仍然无法释放文件,则输出错误信息并跳过该文件
                if (retryTimes <= 0)
                {
                    Console.WriteLine($"文件 {jpgFile} 正在被占用,无法处理。");
                    continue;
                }

                // 使用 Image.FromFile 方法读取 JPEG 图片
                using (var image = Image.FromFile(jpgFile))
                {
                    // 计算等比缩放后的高度
                    int height = image.Height * width / image.Width;

                    // 创建用于存储缩放后图片的 Bitmap 对象
                    // 使用 PixelFormat.Format24bppRgb 像素格式可以避免出现带透明度的黑色背景
                    using (var bitmap = new Bitmap(width, height, PixelFormat.Format24bppRgb))
                    {
                        // 创建 Graphics 对象,用于执行图形操作
                        using (var graphics = Graphics.FromImage(bitmap))
                        {
                            // 设置绘图质量为高质量
                            graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                            graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

                            // 绘制缩放后的图片
                            graphics.DrawImage(image, new Rectangle(0, 0, width, height));
                        }

                        // 替换原始文件
                        var tempFile = jpgFile + ".temp";
                        File.Delete(tempFile);
                        File.Move(jpgFile, tempFile);
                        bitmap.Save(jpgFile, ImageFormat.Jpeg);
                        File.Delete(tempFile);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"处理文件 {jpgFile} 时出错:{ex.Message}");
            }
        }
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81

这一次我是真的怀疑这个AI,可能真的是懵了。

第三阶段 摸索阶段

只能是按着自己的经验问AI了。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
经过多次的调试。

在这里插入图片描述
明白了这个转换。好象跟JPG的图像质量有关,确确实实是转的时候,要花时间。然后,这个占用时间也就不一致了。
在这里插入图片描述
好在经过一段时间的调试,现要终于是可以用了。
在这里插入图片描述

给大家共享了,还开源的!!0.1版本

什么是核心代码:

这个是给写论文的人堆字数的,其实本文的代码不多,但是调试的时间不短。

应用软件的核心代码是指这个程序最关键部分的代码。例如WinRAR,它的核心代码就是压缩算法部分,而诸如用户界面、操作系统移植等部分就无足轻重了。
商城类的核心代码是指业务层的代码,比如你商城的核心代码就是:商品、购物车、创建订单、支付这些代码就是核心代码。

作为程序员,我们经常需要看懂别人的代码。特别是在开源社区中,我们需要理解许多优秀的开源项目的代码。而在Gitee这样的代码托管平台上,我们如何快速有效地看懂别人的代码呢?本文将为大家介绍一些方法。

1.阅读README和项目介绍

在Gitee上,许多开源项目都会有自己的README文件或项目介绍。这些文件一般会介绍项目的背景、功能、使用方法等内容,可以帮助我们快速了解这个开源项目的基本情况。如果我们能够从这些文件中找到与自己相关的内容,就可以快速入手这个开源项目的代码。

2.了解项目结构和代码组织

在阅读代码之前,我们需要先了解这个开源项目的代码结构和代码组织方式。通常,开源项目会将不同的功能模块封装到不同的代码文件中,并按照一定的目录结构组织起来。如果我们能够了解这个开源项目的代码组织方式,就能更加快速地找到所需的代码。

3.利用IDE和工具

IDE和一些代码阅读工具可以帮助我们更快速、更高效地阅读代码。例如,Java开发者可以使用Eclipse或IntelliJ IDEA这样的IDE,可以快速打开代码文件、查看类、方法和变量等信息。另外,一些代码阅读工具,如Source Insight、CodeCompare等,可以帮助我们更方便地查看代码的结构和关系,以及快速跳转到相关代码。

4.关注代码注释和文档

良好的代码注释和文档可以帮助我们更快速地理解代码。因此,在阅读别人的代码时,我们可以将注意力放在代码注释和文档上。有些开源项目会提供详细的文档,有些则注重代码注释。如果我们能够针对代码注释和文档有一个系统的阅读和理解,就能更快速地掌握别人的代码。

5.跑通测试和运行项目

如果我们想更深入地了解别人的代码,可以试着跑通相关的测试,或者直接运行这个开源项目。通过跑测试和运行项目,我们可以更加直观地了解代码的实现细节和具体的业务逻辑。

总结:

以上就是在Gitee上快速理解他人代码的一些方法,希望对大家有所帮助。当然,阅读代码是一件需要耐心和细心的事情,需要我们多花一点时间和心思。只有沉下心来,慢慢阅读每一行代码,才能真正理解它们的含义和作用。

总结

就一句,AI太强了,真的太强了。
但是当这个需求有点长之后,有很多的地方,AI可能并不理解你的文字的意思,从AI生成的代码上看,不是AI“不会” ,他也把下一行的代码单独的分离了出来。只是AI不知道一下行要怎么处理,于是造成了AI与人的需求有了一定的差异。不过不得不说,AI还是强。
就算你不会写代码会看也能用AI,但是你看了那么多的视频,用AI这么好玩的事情,还不赶紧试一试?

论文参考
基于jsp的塞北村镇旅游网站的设计与实现–【毕业论文】
https://blog.csdn.net/dearmite/article/details/131962993

配套资源

c#的面向AI编程-批量处理JPG图片为固定宽度–【InsCodeAI编程】
https://download.csdn.net/download/dearmite/88242672

重命名文件夹内所有文件的功能加入PNG转JPG 第三版
https://download.csdn.net/download/dearmite/88250580

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号