WinForm+C#小案例--->美女图像随机展示

CODESYS安装全攻略:从下载到配置的保姆级教程(含常见问题解决) 本文提供了一份详细的CODESYS安装与配置指南,涵盖从系统环境准备、安装包下载、Development System安装到Runtime System配置的全过程。教程重点解决了安装过程中的常见权限、兼容性和连接问题,并指导用户完成第一个PLC程序的创建与调试,帮助工业自动化开发者快速上手这一通用开发平台。 阅读详情
需求如下:
1. 当项目启动后,在窗口中均匀展示六张图片,并开始播放音乐
2. 每间隔一秒钟,随机选取图片库中六张图片进行展示。
效果预览:
创建 Winform 项目并设计界面

编写代码实现切换逻辑
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Media;
using System.Windows.Forms;

namespace 美女图像随机展示
{
    public partial class Form1 : Form
    {

        // 存储图片文件路径的数组:用于缓存所有图片路径
        private string[] imageFiles;
        // 随机数生成器:用于随机选择图片
        private Random random = new Random();
        // 音乐播放器对象:用于播放WAV格式音频
        private readonly SoundPlayer soundPlayer = new SoundPlayer();
        // 图片文件夹路径(可根据实际文件位置修改)
        private const string ImgFolderPath = "E:/桌面/图片";
        // 音乐文件路径(仅支持WAV格式,若需MP3需使用其他库如NAudio)
        private const string MusicFilePath = @"E:\桌面\音乐播放器案例素材\mp3\a七里香.wav";
        // 每次需要显示的不重复图片数量(固定为6,对应6个PictureBox)
        private const int RequiredPicCount = 6;


        public Form1()
        {
            InitializeComponent();
        }

        //窗口加载事件
        private void Form1_Load(object sender, EventArgs e)
        {
            // 1. 初始化图片资源(优先初始化,避免图片加载失败影响其他功能)
            InitImageResources();

            // 2. 初始化音乐播放(次要初始化,音频失败不影响图片功能)
            InitMusicPlayer();

            // 3. 启动时立即加载一次图片(避免窗口启动后PictureBox为空)
            UpdateAllPictures();
        }


        /// <summary>
        /// 初始化图片资源:检查文件夹存在性、读取图片路径、容错处理
        /// </summary>
        private void InitImageResources()
        {
            // 第一步:检查图片文件夹是否存在
            if (!Directory.Exists(ImgFolderPath))
            {
                // 弹出提示框告知用户路径错误,点击确定后关闭窗口
                MessageBox.Show(
                    text: $"图片文件夹不存在!\n请检查路径:{ImgFolderPath}",
                    caption: "错误提示",
                    buttons: MessageBoxButtons.OK,
                    icon: MessageBoxIcon.Error
                );
                this.Close(); // 关闭窗口,避免后续逻辑出错
                return;
            }
            // 第二步:读取文件夹中所有文件(默认读取所有类型,若需筛选图片格式可添加后缀过滤)
            // 若需仅读取图片格式:Directory.GetFiles(ImgFolderPath, "*.jpg|*.png|*.bmp", SearchOption.TopDirectoryOnly)
            imageFiles = Directory.GetFiles(ImgFolderPath);

            // 第三步:检查文件夹中是否有图片文件(避免空数组导致后续随机数报错)
            if (imageFiles.Length == 0)
            {
                MessageBox.Show(
                    text: $"图片文件夹中无可用图片!\n路径:{ImgFolderPath}",
                    caption: "警告提示",
                    buttons: MessageBoxButtons.OK,
                    icon: MessageBoxIcon.Warning
                );
                this.Close();
                return;
            }
        }


        /// <summary>
        /// 初始化音乐播放器:检查文件存在性、设置播放模式
        /// 注意:SoundPlayer仅支持WAV格式,不支持MP3(MP3需使用NAudio等第三方库)
        /// </summary>
        private void InitMusicPlayer()
        {
            // 检查音乐文件是否存在(容错处理,避免文件缺失导致播放失败)
            if (!File.Exists(MusicFilePath))
            {
                MessageBox.Show(
                    text: $"音乐文件不存在!\n请检查路径:{MusicFilePath}",
                    caption: "警告提示",
                    buttons: MessageBoxButtons.OK,
                    icon: MessageBoxIcon.Warning
                );
                return; // 仅提示不关闭窗口,允许图片功能正常使用
            }

            // 设置音频文件路径
            soundPlayer.SoundLocation = MusicFilePath;

            // 循环播放模式(Play():单次播放;PlayLooping():循环播放;PlaySync():同步播放(阻塞UI))
            soundPlayer.PlayLooping();

            // 可选:添加播放状态提示(若需)
            // MessageBox.Show("音乐已开始循环播放!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
        /// <summary>
        /// Timer的Tick事件:每间隔Interval毫秒触发一次,用于更新图片
        /// 作用:实现图片自动切换的核心逻辑
        /// </summary>
        /// <param name="sender">事件触发源(此处为timer1)</param>
        /// <param name="e">事件参数(无额外数据)</param>
        private void timer1_Tick(object sender, EventArgs e)
        {
            // 直接更新图片
            UpdateAllPictures();
        }

        /// <summary>
        /// 批量更新所有PictureBox图片(核心修复:释放旧资源,避免内存泄漏)
        /// </summary>
        private void UpdateAllPictures()
        {
            if (imageFiles == null || imageFiles.Length == 0) { return; }

            // 第一步:获取6个不重复的随机图片路径(核心逻辑)
            List<string> randomUniquePicPaths = GetRandomUniquePicturePaths(RequiredPicCount);

            // 第二步:给每个PictureBox分配不重复的图片(按顺序赋值)
            SetRandomImage(pictureBox1, randomUniquePicPaths[0]);
            SetRandomImage(pictureBox2, randomUniquePicPaths[1]);
            SetRandomImage(pictureBox3, randomUniquePicPaths[2]);
            SetRandomImage(pictureBox4, randomUniquePicPaths[3]);
            SetRandomImage(pictureBox5, randomUniquePicPaths[4]);
            SetRandomImage(pictureBox6, randomUniquePicPaths[5]);
        }

        /// <summary>
        /// 获取指定数量的不重复随机图片路径
        /// </summary>
        /// <param name="count">需要的图片数量</param>
        /// <returns>不重复的图片路径列表</returns>
        private List<string> GetRandomUniquePicturePaths(int count)
        {
            List<string> uniquePaths = new List<string>();
            List<int> usedIndexes = new List<int>(); // 记录已使用的图片索引(避免重复)

            while (uniquePaths.Count < count)
            {
                // 生成随机索引(0 ~ 图片总数-1)
                int randomIndex = random.Next(imageFiles.Length);

                // 若索引未使用过,则添加到结果列表
                if (!usedIndexes.Contains(randomIndex))
                {
                    usedIndexes.Add(randomIndex);
                    uniquePaths.Add(imageFiles[randomIndex]);
                }
            }
            return uniquePaths;
        }

        /// <summary>
        /// 给单个PictureBox设置图片(保留资源释放逻辑)
        /// </summary>
        /// <param name="pb">目标PictureBox</param>
        /// <param name="picPath">图片路径</param>
        private void SetRandomImage(PictureBox pb, string picPath)
        {
            try
            {
                // 释放旧图片资源(避免内存泄漏)
                if (pb.Image != null)
                {
                    pb.Image.Dispose();
                    pb.Image = null;
                }

                // 加载并设置新图片
                pb.Image = Image.FromFile(picPath);
                pb.SizeMode = PictureBoxSizeMode.StretchImage; // 自适应大小
            }
            catch (Exception ex)
            {
                MessageBox.Show($"加载图片失败:{ex.Message}", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        /// <summary>
        /// 窗口关闭时触发:释放所有资源(避免程序退出后内存残留)
        /// </summary>
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            // 1. 停止音乐并释放播放器资源
            soundPlayer.Stop();
            soundPlayer.Dispose();

            // 2. 释放所有PictureBox的图片资源
            ReleasePictureResource(pictureBox1);
            ReleasePictureResource(pictureBox2);
            ReleasePictureResource(pictureBox3);
            ReleasePictureResource(pictureBox4);
            ReleasePictureResource(pictureBox5);
            ReleasePictureResource(pictureBox6);

            // 3. 释放Timer资源
            timer1.Dispose();
        }

        /// <summary>
        /// 辅助方法:释放单个PictureBox的图片资源
        /// </summary>
        /// <param name="pb">要释放资源的PictureBox</param>
        private void ReleasePictureResource(PictureBox pb)
        {
            if (pb != null && pb.Image != null)
            {
                pb.Image.Dispose();
                pb.Image = null;
            }
        }
    }
}
效果演示

《HiVT: Hierarchical Vector Transformer for Multi-Agent Motion Prediction》论文阅读之HiVT 目录摘要1.介绍2.相关工作3.方法3.1. 总体框架3.2 场景表示 3.3 分层向量Transformer3.3.1 局部编码器3.3.2 全局交互模块3.3.3 多模态未来解码器3.4 训练4.实验4.1 实验设置4.2 消融研究 4.3. 结果5.结论 准确预测周围交通参与者的未来运动对于自动驾驶车辆的安全至关重要。最近,矢量化方法由于能够捕捉交通场景中的复杂交互而在运动预测领域占据主导地位。然而,现有的方法忽略了问题的对称性并且受到昂贵的计算成本的影响,面临着在不牺牲预测性能的情况 阅读详情

相关推荐

墨刀原型设计工具操作使用指南及实践操作

该指南通过异常场景处理、像素级参数说明、复杂交互示例,覆盖了墨刀操作的全细节,适合从新手到资深用户的进阶学习。结合 PlantUML 思维导图的层级化展示,可快速定位具体功能的操作要点与问题解决方法,真正实现 “照指南即可操作” 的实用价值。

hy行者勇哥的博客 4951

第6章第4节:自定义分词器

本节详解Elasticsearch自定义分词器,解析analyzer三段式结构(char_filter→tokenizer→filter),掌握常用组件如ik_max_word、synonym_graph、ngram等。通过_analyze API调试分词效果,实现“索引时扩展同义词、搜索时不带”的生产级方案,提升中文搜索与智能提示体验。

啊渊的专栏 777

【k8s面试】超详细kubernetes面试题总结,面试必问!(附200道K8s Docker面试真题+答案详解

最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!

2401_83620959的博客 1465

C#使用opencv和Yolo模型识别车牌号

本文基于OpenCVSharp与OnnxRuntime,结合YoloV8n-pose_plate模型(检测车牌位置)和OCR模型(识别车牌文字),实现高效车牌识别。通过预处理、目标检测、NMS筛选及文字识别流程,最终输出车牌框位置与识别文本。代码封装良好,支持自定义路径与置信度阈值,具备实际应用价值。

lweiyue的专栏 180

Android System Slice应用加载分析,及启用Slice后,锁屏日期第一次开机正常显示,但后面锁屏不显示问题分析

最近发现Android P上锁屏界面,日期不显示,发现从P开始后,出现了Slice来允许应用以模块化,可交互的方式,插入多个使用场景。Android P的system UI 也使用到了这一特性,表现为锁屏时间,日期,勿扰图标,闹钟等。 如何使用Slice 以System UI中KeyguardSliceView.java来说明它的使用方法 首先,我们打开System UI 的mk 文件,可以看到以...

qq_33595823的博客 3035

模仿学习与强化学习结合(IL+RL)有没有代表性论文?未来发展趋势如何?

IL与RL的结合正成为AI研究热点,尤其在机器人控制、复杂博弈等需要边学边练的场景。经典方法如Dagger(2010)和GAIL(2016)开创了先用模仿学习预热、再用强化学习微调的模式。近期工作如IN-RIL(2024)提出交替训练策略,显著提升样本效率。开源项目RoboSchool和StableBaselines3为相关研究提供支持。未来趋势包括:1)混合式智能体结合人类经验与自主探索;2)突破小样本学习、自然语言交互等方向;3)提升安全性、样本效率和可解释性。

CyberSoma的博客 2249

C# NAFNet 图片去模糊

基于NAFNet与ONNX Runtime的C# WinForms图片去模糊工具,支持DirectML GPU加速与CPU回退,实现一键去模糊、大图分块处理、并排对比及拖拽打开。具备高DPI适配、自绘圆角界面、命令行批量处理等功能,适用于Windows 10/11系统,可灵活配置模型路径与分块大小,解决显存不足与边缘接缝问题。

hixiong123的博客 262

《遥感大模型生产级实战:从数据到决策的端到端AI工程》系列第三部分:城市洪涝灾害应急响应与评估平台实战-文章 14:项目二启动与多源异构数据对齐

我们将系统性地梳理城市洪涝场景下的所有关键数据源,从天上的卫星(光学与SAR)、空中的无人机,到地面的物联网传感器和社交媒体信息流,深入剖析每种数据在洪涝响应中的独特价值、获取方式与内在局限性。本章的核心将是一个详尽的、生产级的数据对齐技术全景,我们将分步解决三大核心对齐难题:空间对齐(将所有数据投影到统一的地理坐标系)、时间对齐(处理不同采样频率的时间序列)以及最困难的语义对齐(将文本描述与物理观测相关联)。

panshengwu的博客 2003

使用C#代码提取、修改或删除 Excel 中的超链接

通过 C# 和 VB.NET,可以方便地管理 Excel 文件中的超链接,包括提取、修改和删除等操作。提取超链接: 获取工作表中的超链接集合,读取每个超链接的地址和类型,并将相关信息保存到文本文件中。修改超链接: 更新超链接的显示文本和目标地址,确保链接信息准确。删除超链接: 移除指定的超链接,同时可以选择保留单元格中的原有显示文本,或清除单元格的全部内容。这些操作可以帮助开发人员更高效地管理 Excel 文档中的链接信息,减少重复的手动操作,也便于在数据迁移、文档维护和自动化报表处理等场景中使用。

2501_93070778的博客 236

【STM32系统】基于STM32设计的锂电池电量/电压检测报警器系统

本设计旨在研究一个基于STM32F103C8T6微控制器的锂电池电量/电压检测报警器系统,应用于便携式电子设备电池管理。系统通过STM32的ADC模块对18650锂电池电压进行采集,利用LCD1602显示模块实时显示电池电压,当检测到电池电量不足或电压异常时,蜂鸣器报警模块会发出警报提醒用户。系统采用简单的硬件结构和优化的软件架构,通过对实际电池电压数据的检测、处理和显示,实现了低功耗、实时监测的锂电池管理功能。本文将介绍系统的设计原理、硬件电路、软件实现以及调试测试过程。

嵌入式阿齐Archie 1万+

rk3576 适配摄像头 (mipi 五摄)

在RK3576上实现五路CSI摄像头方案,核心思路是充分复用其视频输入接口,并通过巧妙的软件配置来实现。

weixin_35723192的博客 183

C#: 控件不支持透明的背景色

把透明度固定为255。

海天鹰 46

智能硬件产品 App 全球发布 第 1 章:全球 App 发布战略设计

本章阐述智能硬件 App 全球发布战略,涵盖市场分析、竞争格局、用户画像及资源配置。通过制定可执行的全球化推广路径,整合地区法规合规、渠道分发策略与营销活动设计,助力团队快速进入主流商店并确立品牌影响力。同时构建可量化的 KPI 监控体系,指导项目进度追踪与效果复盘,确保产品迭代持续优化,降低运营总成本。

moton2017的博客 156

基于 OPC UA 的半导体工厂化学气体传输 SCADA 监控系统:架构设计与 C# MVVM 实现

本文提出一套面向半导体化学气体传输的可演进SCADA系统,基于OPCUA统一信息模型与C#+WPF+MVVM技术栈,实现从气源到机台的全链路实时监控、安全联锁与追溯。通过资产树建模、分层解耦架构与标准对齐(SEMI E30/E95/S2),确保系统可扩展、可维护、可审计,满足高安全、高可靠要求,支持快速落地与持续演进。

ponygame的博客 336

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

如何使用C#代码清理 Excel 表格中的空白行与空白列

通过 C# 代码,可以自动检查并删除 Excel 工作表中的空白行和空白列。利用IsBlank属性判断行或列是否为空,再分别调用和方法,即可完成清理操作。与手动逐行、逐列检查相比,这种方式更适合处理包含大量数据的 Excel 文件,能够减少重复操作,提高数据整理效率,使工作表保持整洁、清晰。在实际使用中,建议从工作表的末尾向前遍历并删除空白行和空白列,避免删除操作改变索引位置,影响后续检查。

2501_93070778的博客 201

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

使用C#代码在 Word 中设置行距和段落间距

通过 C# 代码,可以灵活调整 Word 文档中的行间距和段落间距,从而改善文档的整体排版效果。设置段前间距: 使用属性调整段落前方的空白距离。设置段后间距: 使用属性调整段落后方的空白距离。设置行间距: 使用属性控制同一段落中各行文本之间的距离。合理设置这些间距,不仅可以提高 Word 文档的可读性,还能优化页面空间利用率。这种方式适用于批量格式调整、自动化文档生成以及统一文档排版等场景。

2501_93070778的博客 185

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Avalonia 设备监测实战设计|高频采样怎么接到实时曲线、热力图和 3D 视图?

设备每秒推来的采样批次和页面刷新的节奏通常不同。把每条采样直接推给 UI,会让绘制次数跟着输入速率增长。用做 Avalonia 监测页面时,可以把采集、显示窗口和视图更新拆开,再用测点 ID 把三个视图串起来。

2501_91602431的博客 49

04 · Diagram —— 示意图与接线图

CCDiagramDiagramDiagrams把一组"节点 + 连线"画出来:机车各柜体之间的连线关系、系统拓扑、信号流向。节点是矩形框(可带标题),连线可以带箭头。

hdjsjb的博客 470

C#: (float) RegistryKey.GetValue() 报错 System.InvalidCastException: 指定的转换无效

RegistryKey.GetValue() 类型是 object,首先要转为 string,再 float.Parse(string)。

海天鹰 38

C# 14 实战三连:field 关键字、extension 成员与 null 条件赋值

NET 10 带来的 C# 14 不是一场 syntax earthquake,但里面藏着三件日常写码频率极高的改进。这篇不讲新闻稿,只讲用起来什么感觉、编译器在背后做了什么、以及哪里会静默踩坑。

dotnethello的博客 187

OnlyOffice+poi-tl:把 Word 模板变成可填写、可生成的合同系统

合同表单已经填过主体、金额和日期,为什么还要在Word里再改一遍?以RuoYi Office的真实教学案例,拆解七个字段从模板配置到正文生成、在线编辑和回存的过程,说明poi-tl与OnlyOffice如何分工,以及字段取值、文件缓存和模板版本中的关键设计。

RuoYi Office是基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue3 + Vben Admin + Uniapp 构建的中小企业全业务办公一体化平台,涵盖OA 协同 506

C# 编译器前端深入(二):词法、语法、红绿树与错误恢复

章节编号沿用原单篇文档(如 §3.6 在第二篇、§7.3 在第三篇);roslyn-src本篇承接第一篇:如果还没读过第 0–2 章(概念最小集、csc→语法树的数据流),建议先读。

大坡3D软件开发 155

C#标准程序

包含所有界面的控件。

备忘 275

dnSpy 命令行反编译 C# DLL(实测可用)

均反编译成功,退出码 0,类型与成员签名还原正常。)崩溃,暂不可用,优先使用上述 dnSpy 方式。,但运行即触发 CET 断言(

大坡3D软件开发 205

Java 批量提取 Word 文档中的图片并保存到本地

使用 Java 提取 Word 文档中的图片,可以省去逐张复制、保存的操作,尤其适合处理包含大量插图的报告、产品手册和技术文档。本文通过遍历 Word 文档对象,定位图片并获取其字节数据,再将图片批量保存到本地。整个过程不需要 Microsoft Word,也不涉及图片格式转换,适合用于文档图片整理和自动化处理。

SunnyDays1011的博客 257

C# 15 类型系统补完:Union Types 与 Closed Hierarchies 让编译器替你数清分支

针对 switch 漏分支与跨程序集继承破坏封闭性的问题,给出 union 声明、closed 封闭层级与编译期穷尽校验的组合方案,附 AST 求值落地示例与排错清单。

2301_78967866的博客 391
上一篇: C#小案例-->交替吃苹果线程同步案例
下一篇: WinForm+C#小案例--->实现年月日三级平铺形式展示
MM_MS
博客等级 码龄1年 58粉丝 100原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MM_MS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值