WPF之Image控件详解
文章目录
- 1. 概述
- 2. Image控件的基本属性
- 2.1 Source属性
- 2.2 Stretch属性
- 2.3 StretchDirection属性
- 3. 在XAML中使用Image控件
- 3.1 基本用法
- 3.2 设置拉伸模式
- 3.3 设置图像对齐方式
- 4. 在代码中操作Image控件
- 4.1 加载本地图像
- 4.2 异步加载图像
- 4.3 从流中加载图像
- 4.4 控制图像的解码尺寸
- 5. 图像源类型详解
- 5.1 BitmapImage类
- 5.2 WriteableBitmap类
- 5.3 DrawingImage类
- 6. 处理SVG图像
- 7. 性能优化技巧
- 7.1 使用DecodePixelWidth/DecodePixelHeight
- 7.2 冻结图像以便跨线程使用
- 7.3 使用BitmapCacheOption.OnLoad关闭文件流
- 7.4 实现图像缓存
- 7.5 使用虚拟化容器
- 8. 常见问题与解决方案
- 8.1 内存泄漏问题
- 8.2 UI线程阻塞问题
- 8.3 图像质量问题
- 9. 高级使用场景
- 9.1 图像转换与滤镜
- 9.2 实现图像裁剪
- 9.3 图像旋转与变换
- 9.4 响应式图像容器
- 10. 实用示例
- 10.1 图像浏览器
- 10.2 图像缩略图生成器
- 11. 总结
- 12. 相关资源
可以根据Github拉取示例程序运行
GitHub程序演示地址(点击直达)
也可以在本文资源中下载
1. 概述
Image控件是WPF(Windows Presentation Foundation)中用于显示图像的基本控件。它支持多种图像格式,包括BMP、JPG、PNG、GIF、TIFF等,还支持矢量图形格式SVG(通过额外的库)。作为WPF视觉系统的一部分,Image控件提供了丰富的图像处理功能,如拉伸、裁剪、旋转和转换等。
本文将详细介绍Image控件的属性、用法、性能优化技巧以及常见问题的解决方案,帮助开发者更好地在WPF应用中处理图像。
2. Image控件的基本属性
Image控件继承自FrameworkElement,具有以下重要属性:
属性名 | 类型 | 说明 |
---|---|---|
Source | ImageSource | 指定图像的源,可以是BitmapSource、DrawingImage等 |
Stretch | Stretch | 控制图像如何拉伸以填充分配的空间 |
StretchDirection | StretchDirection | 定义图像拉伸的方向 |
NineGrid | Thickness | 定义一个矩形区域,用于控制图像拉伸的方式 |
2.1 Source属性
Source属性是Image控件最基本的属性,用于指定要显示的图像源。它的类型是ImageSource,这是一个抽象基类,实际使用时通常使用它的子类:
- BitmapSource: 位图图像的基类
- BitmapImage: 最常用的图像源,支持加载各种图像格式
- RenderTargetBitmap: 从视觉对象渲染位图
- WriteableBitmap: 可以被修改像素的位图
- DrawingImage: 矢量图形的图像源
2.2 Stretch属性
Stretch属性决定了图像如何适应其容器空间。它有以下几个可选值:
2.3 StretchDirection属性
StretchDirection属性控制图像的拉伸方向,可选值有:
- Both: 图像可以被放大或缩小
- UpOnly: 图像只能被放大
- DownOnly: 图像只能被缩小
3. 在XAML中使用Image控件
3.1 基本用法
最简单的Image控件使用方式如下:
<Image Source="Images/logo.png" Width="200" Height="100"/>
3.2 设置拉伸模式
<Image Source="Images/background.jpg" Stretch="Uniform" StretchDirection="DownOnly"/>
3.3 设置图像对齐方式
<Image Source="Images/icon.png" Width="300" Height="200" HorizontalAlignment="Center" VerticalAlignment="Center"/>
4. 在代码中操作Image控件
4.1 加载本地图像
// 从本地文件加载图像
BitmapImage bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.UriSource = new Uri("pack://application:,,,/Images/photo.jpg", UriKind.Absolute);
// CacheOption用于控制图像数据的缓存行为
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.EndInit();// 将图像分配给Image控件
myImage.Source = bitmap;
4.2 异步加载图像
public async Task LoadImageAsync(string imagePath)
{// 使用Task.Run将IO操作移至后台线程await Task.Run(() =>{BitmapImage bitmap = new BitmapImage();bitmap.BeginInit();bitmap.UriSource = new Uri(imagePath);bitmap.CacheOption = BitmapCacheOption.OnLoad; // 加载完成后关闭流bitmap.EndInit();bitmap.Freeze(); // 使图像可以跨线程访问// 切换回UI线程设置图像Dispatcher.Invoke(() =>{myImage.Source = bitmap;});});
}
4.3 从流中加载图像
// 从流中加载图像(例如从数据库或网络)
public void LoadImageFromStream(Stream imageStream)
{BitmapImage bitmap = new BitmapImage();bitmap.BeginInit();bitmap.StreamSource = imageStream;bitmap.CacheOption = BitmapCacheOption.OnLoad; // 图像加载后关闭流bitmap.EndInit();myImage.Source = bitmap;
}
4.4 控制图像的解码尺寸
// 控制解码尺寸可以大大提高内存效率,特别是对于大图像
BitmapImage bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.UriSource = new Uri(imagePath);
bitmap.DecodePixelWidth = 300; // 只设置宽度,高度按比例缩放
// 或者同时设置宽度和高度
// bitmap.DecodePixelHeight = 200;
bitmap.EndInit();myImage.Source = bitmap;
5. 图像源类型详解
5.1 BitmapImage类
BitmapImage是最常用的图像源类型,它支持从文件、Uri或流中加载图像。
// 从Uri创建BitmapImage的简便方法
BitmapImage bitmap = new BitmapImage(new Uri("pack://application:,,,/Images/photo.jpg"));// 使用BeginInit()/EndInit()方法可以设置更多选项
BitmapImage bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.UriSource = new Uri("pack://application:,,,/Images/photo.jpg");
bitmap.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.EndInit();
5.2 WriteableBitmap类
WriteableBitmap允许直接修改位图的像素数据。
// 创建一个可写位图
WriteableBitmap writeableBitmap = new WriteableBitmap(100, // 宽度100, // 高度96, // DPI X96, // DPI YPixelFormats.Bgr32, // 像素格式null // 调色板
);// 修改像素数据
writeableBitmap.Lock();
try
{// 获取后备缓冲区IntPtr backBuffer = writeableBitmap.BackBuffer;int stride = writeableBitmap.BackBufferStride;// 例如,将所有像素设置为红色unsafe{for (int y = 0; y < writeableBitmap.Height; y++){for (int x = 0; x < writeableBitmap.Width; x++){int offset = y * stride + x * 4;*(byte*)(backBuffer + offset) = 0; // B*(byte*)(backBuffer + offset + 1) = 0; // G*(byte*)(backBuffer + offset + 2) = 255; // R*(byte*)(backBuffer + offset + 3) = 255; // A}}}// 通知位图已修改writeableBitmap.AddDirtyRect(new Int32Rect(0, 0, (int)writeableBitmap.Width, (int)writeableBitmap.Height));
}
finally
{writeableBitmap.Unlock();
}myImage.Source = writeableBitmap;
5.3 DrawingImage类
DrawingImage用于将矢量图形显示在Image控件中。
// 创建一个DrawingImage
DrawingImage drawingImage = new DrawingImage();// 创建一个DrawingGroup
DrawingGroup drawingGroup = new DrawingGroup();// 添加几何图形
using (DrawingContext drawingContext = drawingGroup.Open())
{// 绘制一个矩形drawingContext.DrawRectangle(Brushes.LightBlue, // 填充画刷new Pen(Brushes.Blue, 2), // 线条画刷new Rect(10, 10, 80, 60) // 矩形大小);// 绘制一个椭圆drawingContext.DrawEllipse(Brushes.LightGreen,new Pen(Brushes.Green, 2),new Point(50, 40), // 中心点30, // X半径20 // Y半径);
}// 设置DrawingImage的Drawing属性
drawingImage.Drawing = drawingGroup;// 设置Image控件的Source
myImage.Source = drawingImage;
6. 处理SVG图像
WPF原生不支持SVG格式,但可以通过第三方库来实现。以下是使用SharpVectors库的示例:
// 需要先安装SharpVectors NuGet包
// Install-Package DotNetProjects.SVGImage// XAML中的使用方式
// <svgc:SVGImage Source="/Resources/icon.svg"/>// 在代码中使用
SVGImage svgImage = new SVGImage();
svgImage.Source = new Uri("pack://application:,,,/Resources/icon.svg");
7. 性能优化技巧
7.1 使用DecodePixelWidth/DecodePixelHeight
当只需要显示较小尺寸的图像时,应该使用DecodePixelWidth或DecodePixelHeight属性来减少内存使用。
BitmapImage bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.UriSource = new Uri(imagePath);
// 只加载需要的大小,而不是原始大小
bitmap.DecodePixelWidth = 300;
bitmap.EndInit();
7.2 冻结图像以便跨线程使用
使用Freeze()方法可以使图像变为不可变对象,从而可以在多个线程间共享,避免了线程同步问题。
BitmapImage bitmap = new BitmapImage(new Uri(imagePath));
bitmap.Freeze(); // 冻结图像,使其可以跨线程访问// 现在可以在任何线程上使用此bitmap
7.3 使用BitmapCacheOption.OnLoad关闭文件流
使用CacheOption设置为OnLoad可以在图像加载完成后立即关闭文件流,避免文件锁定问题。
BitmapImage bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.UriSource = new Uri(imagePath);
bitmap.CacheOption = BitmapCacheOption.OnLoad; // 加载后关闭流
bitmap.EndInit();
7.4 实现图像缓存
对于需要重复显示的图像,可以实现简单的缓存机制:
// 简单的图像缓存类
public class ImageCache
{private static Dictionary<string, BitmapImage> _cache = new Dictionary<string, BitmapImage>();public static BitmapImage GetImage(string path){if (_cache.ContainsKey(path))return _cache[path];BitmapImage bitmap = new BitmapImage();bitmap.BeginInit();bitmap.UriSource = new Uri(path);bitmap.CacheOption = BitmapCacheOption.OnLoad;bitmap.EndInit();bitmap.Freeze(); // 使图像可以跨线程访问_cache[path] = bitmap;return bitmap;}public static void ClearCache(){_cache.Clear();}
}
7.5 使用虚拟化容器
当在列表控件中显示大量图像时,应该启用UI虚拟化,只加载当前可见的项目:
<ListBox ItemsSource="{Binding Images}"><ListBox.ItemsPanel><ItemsPanelTemplate><VirtualizingStackPanel VirtualizingPanel.IsVirtualizing="True"VirtualizingPanel.VirtualizationMode="Recycling"/></ItemsPanelTemplate></ListBox.ItemsPanel><ListBox.ItemTemplate><DataTemplate><Image Source="{Binding ImageSource}" Width="100" Height="100"/></DataTemplate></ListBox.ItemTemplate>
</ListBox>
8. 常见问题与解决方案
8.1 内存泄漏问题
在WPF应用中使用大量图像时,常常会遇到内存泄漏问题。以下是避免内存泄漏的关键点:
// 问题: 加载大量图像导致内存持续增长
// 解决方案1: 确保在窗口关闭时清除图像源
protected override void OnClosing(CancelEventArgs e)
{base.OnClosing(e);// 清除图像源myImage.Source = null;// 如果使用了列表控件imageListBox.ItemsSource = null;imageListBox.Items.Clear();// 手动触发垃圾收集(在实际应用中应谨慎使用)GC.Collect();
}
8.2 UI线程阻塞问题
// 问题: 加载大图像会阻塞UI线程
// 解决方案: 使用异步方法加载图像
public async void LoadImageAsync()
{Progress.Visibility = Visibility.Visible; // 显示加载指示器try{BitmapImage bitmap = await Task.Run(() => {BitmapImage bmp = new BitmapImage();bmp.BeginInit();bmp.UriSource = new Uri(imagePath);bmp.CacheOption = BitmapCacheOption.OnLoad;bmp.EndInit();bmp.Freeze(); // 重要: 使位图可以跨线程访问return bmp;});myImage.Source = bitmap;}catch (Exception ex){MessageBox.Show("加载图像失败: " + ex.Message);}finally{Progress.Visibility = Visibility.Collapsed; // 隐藏加载指示器}
}
8.3 图像质量问题
// 问题: 图像显示质量不佳
// 解决方案: 设置RenderOptions附加属性
<Image Source="Images/photo.jpg"RenderOptions.BitmapScalingMode="HighQuality"/>
9. 高级使用场景
9.1 图像转换与滤镜
WPF提供了多种图像效果,可以应用于Image控件:
<Image Source="Images/photo.jpg"><Image.Effect><BlurEffect Radius="10"/></Image.Effect>
</Image>
在代码中应用效果:
// 应用模糊效果
BlurEffect blurEffect = new BlurEffect();
blurEffect.Radius = 10;
myImage.Effect = blurEffect;// 应用灰度效果
myImage.Effect = new FormsControls.Effects.GrayscaleEffect();
9.2 实现图像裁剪
// 使用Clip属性裁剪图像
RectangleGeometry clipGeometry = new RectangleGeometry();
clipGeometry.Rect = new Rect(50, 50, 200, 150); // 从图像的(50,50)位置裁剪200x150的区域
myImage.Clip = clipGeometry;
9.3 图像旋转与变换
<Image Source="Images/photo.jpg"><Image.RenderTransform><TransformGroup><RotateTransform Angle="45"/><ScaleTransform ScaleX="0.8" ScaleY="0.8"/></TransformGroup></Image.RenderTransform>
</Image>
9.4 响应式图像容器
创建一个能够保持图像比例且响应窗口大小变化的容器:
<Viewbox Stretch="Uniform"><Image Source="Images/photo.jpg"/>
</Viewbox>
10. 实用示例
10.1 图像浏览器
下面是一个简单的图像浏览器示例,支持基本的图像浏览功能:
public class ImageBrowser : Window
{private Image _imageControl;private List<string> _imagePaths;private int _currentIndex = 0;public ImageBrowser(List<string> imagePaths){_imagePaths = imagePaths;// 初始化界面Title = "图像浏览器";Width = 800;Height = 600;// 创建主布局Grid grid = new Grid();// 添加按钮和图像控件StackPanel buttonPanel = new StackPanel();buttonPanel.Orientation = Orientation.Horizontal;buttonPanel.HorizontalAlignment = HorizontalAlignment.Center;Button prevButton = new Button { Content = "上一张", Margin = new Thickness(5) };Button nextButton = new Button { Content = "下一张", Margin = new Thickness(5) };prevButton.Click += (s, e) => ShowPreviousImage();nextButton.Click += (s, e) => ShowNextImage();buttonPanel.Children.Add(prevButton);buttonPanel.Children.Add(nextButton);// 创建可滚动的图像容器ScrollViewer scrollViewer = new ScrollViewer();scrollViewer.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto;scrollViewer.VerticalScrollBarVisibility = ScrollBarVisibility.Auto;_imageControl = new Image();_imageControl.Stretch = Stretch.None; // 使用原始大小scrollViewer.Content = _imageControl;// 设置布局grid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) });grid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto });Grid.SetRow(scrollViewer, 0);Grid.SetRow(buttonPanel, 1);grid.Children.Add(scrollViewer);grid.Children.Add(buttonPanel);Content = grid;// 加载第一张图像LoadCurrentImage();}private void ShowPreviousImage(){if (_currentIndex > 0){_currentIndex--;LoadCurrentImage();}}private void ShowNextImage(){if (_currentIndex < _imagePaths.Count - 1){_currentIndex++;LoadCurrentImage();}}private async void LoadCurrentImage(){try{Title = $"图像浏览器 - {System.IO.Path.GetFileName(_imagePaths[_currentIndex])} ({_currentIndex + 1}/{_imagePaths.Count})";BitmapImage bitmap = await Task.Run(() =>{BitmapImage bmp = new BitmapImage();bmp.BeginInit();bmp.UriSource = new Uri(_imagePaths[_currentIndex]);bmp.CacheOption = BitmapCacheOption.OnLoad;bmp.EndInit();bmp.Freeze();return bmp;});_imageControl.Source = bitmap;}catch (Exception ex){MessageBox.Show($"加载图像失败: {ex.Message}");}}
}
10.2 图像缩略图生成器
/// <summary>
/// 生成图像的缩略图
/// </summary>
/// <param name="originalImagePath">原始图像路径</param>
/// <param name="thumbnailSize">缩略图尺寸</param>
/// <returns>缩略图的BitmapSource</returns>
public static BitmapSource GenerateThumbnail(string originalImagePath, int thumbnailSize)
{BitmapImage originalImage = new BitmapImage();originalImage.BeginInit();originalImage.UriSource = new Uri(originalImagePath);originalImage.DecodePixelWidth = thumbnailSize; // 只需设置宽度,高度会按比例缩放originalImage.CacheOption = BitmapCacheOption.OnLoad;originalImage.EndInit();// 如果需要将缩略图保存为文件// SaveThumbnailToFile(originalImage, "thumbnail.jpg");return originalImage;
}/// <summary>
/// 将缩略图保存为文件
/// </summary>
/// <param name="image">图像源</param>
/// <param name="filePath">保存路径</param>
public static void SaveThumbnailToFile(BitmapSource image, string filePath)
{using (FileStream stream = new FileStream(filePath, FileMode.Create)){JpegBitmapEncoder encoder = new JpegBitmapEncoder();encoder.QualityLevel = 80; // 控制JPEG质量级别encoder.Frames.Add(BitmapFrame.Create(image));encoder.Save(stream);}
}
11. 总结
本文详细介绍了WPF中Image控件的使用方法、属性、性能优化技巧以及常见问题的解决方案。通过正确使用Image控件,开发者可以在WPF应用中高效地处理和显示图像,同时避免内存泄漏和性能问题。
关键要点包括:
- 使用适当的图像源类型(BitmapImage, DrawingImage等)
- 利用DecodePixelWidth/Height属性优化内存使用
- 通过异步加载避免UI线程阻塞
- 使用Freeze()方法使图像可以跨线程访问
- 合理设置BitmapCacheOption避免文件锁定问题
- 实现图像缓存机制提高性能
- 在列表控件中启用虚拟化以处理大量图像
12. 相关资源
- WPF官方文档 - Image类
- SharpVectors - WPF的SVG支持库
- WPF图像处理性能优化
- WPF Image控件性能优化技巧
相关文章:
WPF之Image控件详解
文章目录 1. 概述2. Image控件的基本属性2.1 Source属性2.2 Stretch属性2.3 StretchDirection属性 3. 在XAML中使用Image控件3.1 基本用法3.2 设置拉伸模式3.3 设置图像对齐方式 4. 在代码中操作Image控件4.1 加载本地图像4.2 异步加载图像4.3 从流中加载图像4.4 控制图像的解码…...
如何将 VS Code 与 Linux 系统高效连接:从入门到进阶
引言 无论是开发服务器应用、管理远程主机,还是在本地 Linux 环境中提升开发效率,Visual Studio Code(VS Code) 凭借其强大的扩展能力,成为连接 Linux 系统的利器。本文将详细介绍 三种主流方法,助你无缝对…...
Matlab/Simulink - BLDC直流无刷电机仿真基础教程(五) - animateRotorPosition脚本讲解与使用
Matlab/Simulink - BLDC直流无刷电机仿真基础教程(五) - animateRotorPosition脚本讲解与使用 前言一、animateRotorPosition脚本内容二、脚本功能讲解三、脚本修改与模型配置四、可视化效果展示五、修改后脚本内容文章相关模型文件下载链接参考链接 前言…...
安川机器人常见故障报警及解决办法
机器人权限设置 操作权限设置(如果密码不对,就证明密码被人修改) 编辑模式密码:无(一把钥匙,默认) 管理模式密码:999999999(9个9,二把钥匙) 安全模式密码:555555555(9个5,三把钥匙,权限最高,有的型号机器人,没有此模式,但最高密码为安全模式密码) 示教器…...
【Quest开发】极简版!透视环境下抠出身体并能遮挡身体上的服装
前两天发了一个很复杂的版本,又鼓捣了一下发现完全没有必要。我之前的理解有点偏(不是错误的但用法错了),但是有一些小伙伴收藏了,害怕里面的某些东西对谁有用,所以写了一篇新的,前两步配置环境…...
【Github仓库】Learn-Vim随笔
一、前言 学习vim的过程中发现了很多很好的资源,其中不乏bilibili上up主的精品教程。也在YouTube上看过很多教程。但Learn-Vim这个Github仓库实在让我受益良多。 本笔记便是出于此仓库: 仓库地址 附上个人.vimrc配置文件: syntax on " 开启语法高…...
【2025五一数学建模竞赛C题】社交媒体平台用户分析问题|建模过程+完整代码论文全解全析
你是否在寻找数学建模比赛的突破点?数学建模进阶思路! 作为经验丰富的美赛O奖、国赛国一的数学建模团队,我们将为你带来本次数学建模竞赛的全面解析。这个解决方案包不仅包括完整的代码实现,还有详尽的建模过程和解析,…...
Wireshark抓取SMTP协议报文
文章目录 1. 实验:网络仿真软件使用及网络分析2. SMTP协议2.1 SMTP协议简介2.2 SMTP协议的核心功能2.3 SMTP的相关命令和作用 3. Wireshark抓取报文3.1 抓取SMTP协议报文流程3.1.1 Email邮件服务器背景3.1.2 具体实现流程 3.2 过滤SMTP协议相关报文 4. 协议时序图4.…...
PS学习笔记(一)
课程地址:【B站第一!】央美大佬198小时讲完的PS教程,全程干货无废话!学完秒变大神!还学不会,我不教设计了!!_哔哩哔哩_bilibili 第一章:基础知识 1.PS认识 一、PS应用领…...
部署.NET6.0 Web API项目到Docker
文章目录 介绍创建.NET WebAPI项目项目打包项目部署文件准备部署命令可能的问题与解决 介绍 使用VS2022创建一个.NET6的Web API项目,将其打包,并部署到Linux服务器上的Docker中。 Linux和Docker环境已经备好,本文不再赘述,主要记…...
前端函数防抖(Debounce)完整讲解 - 从原理、应用到完整实现
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Micro麦可乐的博客 🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战 🌺《RabbitMQ》…...
React Redux 与 Zustand
Redux 一、Redux 核心概念 1. 为什么需要 Redux? 解决的问题:在大型 React 应用中,跨组件共享状态、管理复杂数据流。 优势: 单一数据源:全局状态集中存储在 Store 中。 可预测性:通过严格的规则&#…...
Webug4.0靶场通关笔记07- 第9关反射XSS和第10关存储XSS
目录 第09关 反射型XSS 1.打开靶场 2.源码分析 3.渗透实战 第10关 存储型XSS 1.打开靶场 2.源码分析 3.渗透实战 本系列为通过《Webug4.0靶场通关笔记》的渗透集合,本文为反射型和存储型XSS漏洞关卡的渗透部分,通过对XSS关卡源码的代码审计找到漏…...
react学习笔记4——React UI组件库与redux
流行的开源React UI组件库 material-ui(国外) 官网: http://www.material-ui.com/#/github: GitHub - mui/material-ui: Material UI: Comprehensive React component library that implements Googles Material Design. Free forever. ant-design(国内蚂蚁金服) 官网: Ant…...
Java学习手册:Spring 事务管理
一、事务管理的概念 事务是一组操作的集合,这些操作要么全部成功,要么全部失败。事务管理的目的是保证数据的一致性和完整性。在数据库操作中,事务管理尤为重要,例如银行转账、订单支付等场景都需要事务管理来确保数据的正确性。…...
SpringBoot研究生双选系统开发实现
概述 SpringBoot研究生双选信息发布系统,该系统实现了研究生与导师双向选择的全流程管理,采用主流SpringBoot框架开发,是学习企业级教育管理系统开发的优质资源。适合作为计算机专业设计项目或高校信息化建设参考,完整实现…...
springboot中异步接口实现所有方式_20250501
几种异步接口实现demo package org.dromara.controller.app;// 导入必要的依赖库import cn.dev33.satoken.annotation.SaIgnore; import lombok.extern.slf4j.Slf4j; import org.springframework.core.io.Resource; import org.springframework.core.io.UrlResource; import o…...
【Linux网络】I/O多路转接技术 - epoll
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...
机器学习经典算法:用决策树原理优化新能源汽车续航能力
🔥 “用决策树重构新能源车能量大脑!算法推导代码实战全解,续航暴增15%” 决策树算法就像我们生活中做决策的 “流程指南”,通过层层判断得出最终结论。比如你去超市买水果,站在琳琅满目的货架前,就不自觉地…...
深入探讨宾馆一次性牙刷价格,市场价格区间差异大
在我们日常出行、住宿的时候,宾馆的一次性牙刷是常见的、标配的物品。许多人或许都会感到好奇,这些一次性牙刷到底值多少钱。下面就来深入探讨一下宾馆一次性牙刷价格方面的问题。 市场价格区间 宾馆一次性牙刷价格差距大,便宜的一支可能只…...
深入解析 .NET Kestrel:高性能 Web 服务器的架构与最佳实践
Kestrel 是 .NET 中用于处理 HTTP 请求的高性能 Web 服务器。作为 ASP.NET Core 的默认服务器,Kestrel 被设计为在高并发、高吞吐量的环境下表现优异,并且能够支持多种协议和跨平台操作。本文将深入探讨 Kestrel 的架构设计、工作原理、配置方式、性能优…...
ZYNQ 纯PL端逻辑资源程序固化流程
ZYNQ 纯PL端逻辑资源程序固化 ZYNQ的程序固化流程比传统的FPGA固化流程复杂很多,Vivado生成的bit文件无法直接固化在ZYNQ芯片中。因为ZYNQ 非易失性存储器的引脚(如 SD 卡、QSPI Flash)是 ZYNQ PS 部分的专用引脚。这些非易失性存储器由 PS …...
【树莓派Pico FreeRTOS】-FreeRTOS-SMP移植
FreeRTOS-SMP移植 文章目录 FreeRTOS-SMP移植1、Raspberry Pi Pico SDK准备2、下载最新FreeRTOS-Kernel源码3、Raspberry Pi Pico的开发环境搭建4、编译配置5、FreeRTOSConfig.h文件设置6、演示代码RP2040 由 Raspberry Pi 设计,具有双核 Arm Cortex-M0+ 处理器和 264KB 内部 …...
数字智慧方案5961丨智慧能源与运维云平台解决方案(52页PPT)(文末有下载方式)
详细资料请看本解读文章的最后内容。 资料解读:智慧能源与运维云平台解决方案 在当今数字化时代,能源管理与设备运维的智能化、高效化成为企业发展的关键。智慧能源与运维云平台解决方案应运而生,为企业提供了全面且先进的能源管理和运维手段…...
2025东三省C题深圳杯C题数学建模挑战赛数模思路代码文章教学: 分布式能源接入配电网的风险分析
完整内容请看文章最下面的推广群 数据整理与分析 表1:有源配电网62节点系统负荷参数 内容:列出了62个节点的有功负荷(单位:kW)。 特点: 负荷范围:24 kW(节点19)到420 …...
腾讯云BI VS quickbi 企业选型(从企业实际功能使用和费用对比)
腾讯云BI VS quickbi 选型 一、总结 前段时间领导让调研腾讯云BI,用来做BI选型,现根据公司实际使用功能做如下总结。 建议继续使用quickbi,不选择腾讯云BI 原因: 腾讯云BI专业版,官方价格最低101996元。并且只能选…...
WebDeveloper 流量分析、sudo提权,靶场通关WP
一、信息收集 1、主机探测 arp-scan -l netdiscover -i eth0 -r 192.168.33.0/24 nmap -sP 192.168.66.0/24 2、端口扫描 nmap -sS -sV 192.168.66.141 PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4 (Ubuntu Linux; protocol 2.0) 80/tcp op…...
编写教育网站后端页面笔记
callbacktitle.html 对应表: 对应的功能: 控制器层数据: 页面没有写内容 chapter.html 对应表: questionbank ,intofloortime,questionBank,title,didtitles,option,answer,analyse 对应的功能:问题反馈页面 控制器层数据(控制器类): ChapterQuestionbankTitle c…...
C++漫溯键值的长河:map set
文章目录 1.关联式容器2.set2.1 find2.2 lower_bound、upper_bound 3.multiset3.1 count3.2 equal_range 4.map4.1 insert4.2 operate->4.3 operate[ ]4.4 map的应用实践:随机链表的复制 5.multimap希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动…...
西门子数字化研发设计制造一体化规划案例P87(87页PPT)(文末有下载方式)
资料解读:《西门子数字化研发设计制造一体化规划案例》 详细资料请看本解读文章的最后内容。 该文档围绕西门子为企业打造的智能化制造研发工艺生产一体化平台规划方案展开,全面阐述了从业务现状分析到项目实施及案例分享的整个过程。 业务现状与需求分析…...
Rust多线程性能优化:打破Arc+锁的瓶颈,效率提升10倍
一、引言 在 Rust 开发中,多线程编程是提升程序性能的重要手段。Arc(原子引用计数)和锁的组合是实现多线程数据共享的常见方式。然而,很多程序员在使用 Arc 和锁时会遇到性能瓶颈,导致程序运行效率低下。本文将深入剖…...
基于python的人工智能应用简述
基于Python的人工智能应用简述 Python已成为人工智能(AI)开发的首选语言,凭借其简洁性、丰富的库生态系统和强大的社区支持,广泛应用于各类AI应用场景。以下是Python在人工智能领域的主要应用领域和技术实现。 1. 机器学习(Machine Learning) Python通过Scikit-learn、Ten…...
《Android 应用开发基础教程》——第十章:使用 Gson 实现网络 JSON 数据解析与对象映射
目录 第十章:使用 Gson 实现网络 JSON 数据解析与对象映射 🔹 10.1 什么是 Gson? 🔸 10.2 添加依赖 🔸 10.3 基础使用 ✦ 示例 JSON 字符串: ✦ 定义对应的 Java 类: ✦ JSON ➜ 对象&am…...
【Android】四大组件之BroadcastReceiver
目录 一、什么是BroadcastReceiver 二、创建和使用BroadcastReceiver 三、跨应用广播接收权限 四、广播方式 五、广播类型与特性 六、BroadcasReceiver注册方式 七、BroadcasReceiver工作流程 你可以把广播接收器想象成一个“收音机”。它的作用是监听系统或应用发出的“…...
[UVM]寄存器模型的镜像值和期望值定义是什么?他们会保持一致吗?
寄存器模型的镜像值和期望值定义是什么?他们会保持一致吗? 摘要:在 UVM (Universal Verification Methodology) 寄存器模型中,镜像值 (mirrored value) 和期望值 (desired value) 是两个非常重要的概念,用于管理寄存器…...
OpenGL-ES 学习(12) ---- VBO EBO VAO
目录 VBO 定义VBO 创建统一VertexData使用 VBO 绘制VAO VBO 定义 VBO(Vertex Buffer Object) 是指顶点缓冲区对象,而 EBO(Element Buffer Object)是指图元索引缓冲区对象,VBO 和 EBO实际上是同一类 buffer 按照用途的不同称呼 OpenGL-ES2.0 编程中&…...
【Redis分布式】主从复制
🔥个人主页: 中草药 🔥专栏:【中间件】企业级中间件剖析 一、主从复制 在分布式系统之中为了解决单点问题(1、可用性问题,该机器挂掉服务会停止2、性能支持的并发量是有限的)通常会把数据复制多…...
Node.js心得笔记
npm init 可用npm 来调试node项目 浏览器中的顶级对象时window <ref *1> Object [global] { global: [Circular *1], clearImmediate: [Function: clearImmediate], setImmediate: [Function: setImmediate] { [Symbol(nodejs.util.promisify.custom)]: [Getter] }, cl…...
多智能体空域协同中的伦理博弈与系统调停
在多智能体系统(MAS)广泛应用于低空飞行调度、应急响应与城市管理的背景下,AI之间的“协同”不仅是算法效率问题,更是伦理角色之间的权责动态博弈。尤其在高频互动、任务冲突、资源抢占等复杂场景中,智能体不再是“工具…...
面试中系统化地解答系统设计题:通用方法论
目录 一、明确需求(Clarify Requirements) (一)理解业务背景 (二)功能性需求(Functional Requirements) 1. 分析目标 2. 功能需求分类 A. 用户交互类功能 B. 数据处理类功能 C. 管理与运维类功能 D. 外部系统交互类功能 示例场景详解 3. 捕捉隐藏需求的技巧…...
kotlin中 热流 vs 冷流 的本质区别
🔥 冷流(Cold Flow) vs 热流(Hot Flow)区别 特性冷流(Cold Flow)热流(Hot Flow)数据生产时机每次 collect 才开始执行启动时就开始生产、始终运行生命周期与 collect 者…...
机器视觉开发-打开摄像头
以下是使用Python和OpenCV打开摄像头的最简单实现: import cv2# 打开默认摄像头(通常是0) cap cv2.VideoCapture(0)# 检查摄像头是否成功打开 if not cap.isOpened():print("无法打开摄像头")exit()print("摄像头已打开 - 按…...
Rerank详解
疑惑一 我对rag的流程理解是。后端首先建立embedding后的向量数据库,用户提问使用相同的embedding模型进行向量化,使用阈值控制相似度找出前topk个数据。然后rerank,将rerank的结果打包成prompt返回给大模型进行解答。我对于rerank的过程不是…...
深度探索DeepSeek:从架构设计到性能优化的实战指南
深度解码DeepSeek:从架构设计到工业级部署的全链路优化实践 引言:大模型时代的工程挑战 在人工智能技术进入工业化落地阶段的今天,大模型训练与推理的工程化能力已成为衡量企业技术实力的重要标尺。DeepSeek作为当前业界领先的超大规模语言…...
d202551
目录 一、175. 组合两个表 - 力扣(LeetCode) 二、511. 游戏玩法分析 I - 力扣(LeetCode) 三、1204. 最后一个能进入巴士的人 - 力扣(LeetCode) 一、175. 组合两个表 - 力扣(LeetCode…...
(C题|社交媒体平台用户分析问题)2025年第二十二届五一数学建模竞赛(五一杯/五一赛)解题思路|完整代码论文集合
我是Tina表姐,毕业于中国人民大学,对数学建模的热爱让我在这一领域深耕多年。我的建模思路已经帮助了百余位学习者和参赛者在数学建模的道路上取得了显著的进步和成就。现在,我将这份宝贵的经验和知识凝练成一份全面的解题思路与代码论文集合…...
计网_PPP协议
2024.10.15:beokayy计算机网络学习笔记 PPP协议 PPP协议的特点PPP协议应满足的需求(了解)PPP协议的组成(PPP协议有三个组成部分) PPP协议的帧格式PPP协议的工作状态 ISP指的是运营商,比如中国联通、中国电信…...
Mem0.ai研究团队开发的全新记忆架构系统“Mem0”正式发布
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
二叉树删除结点详细代码
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h>typedef int data_t; typedef struct _node {data_t data;struct _node* left;struct _node* right; }node_t;int bst_create(node_t**, data_t);//函数声明BST创建 int bst…...
PyTorch线性代数操作详解:点积、矩阵乘法、范数与轴求和
本文通过代码示例详细讲解PyTorch中常用的线性代数操作,包括点积、矩阵乘法、范数计算以及按轴求和等操作,帮助读者掌握张量运算的核心方法。 1. 点积运算 点积(Dot Product)是两个向量对应元素相乘后求和的结果。 实现代码&…...