ImageSharp图形库学习
一、引言
在当今数字化时代,无论是 Web 应用、桌面程序,还是移动应用,图像处理都扮演着至关重要的角色。从电商平台展示商品图片,到社交媒体分享照片,再到各种软件的图标设计,图像处理无处不在。博主们在内容创作过程中,也常常需要对图片进行裁剪、缩放、添加特效等操作,以提升内容的吸引力和专业性。
ImageSharp 作为一款开源的.NET 图像处理库,为开发者和博主们提供了一套强大且便捷的图像处理解决方案。它不仅功能丰富,能够轻松实现裁剪、缩放、格式转换、滤镜添加等常见操作,而且性能卓越,能够高效处理各种图像任务,无论是小型项目还是大型企业级应用,都能完美胜任。
通过使用 ImageSharp,博主们可以更加灵活地处理和优化图片,为读者呈现出更优质的视觉内容。开发者们也能借助其丰富的功能和高效的性能,提升应用程序的用户体验和竞争力。接下来,就让我们一起深入了解如何使用 ImageSharp 进行图像处理吧。
二、ImageSharp 简介
(一)功能特性
ImageSharp 具备丰富且强大的功能,能够满足各种图像处理需求。在日常使用中,裁剪功能可帮助我们精准地提取图像中关键部分。比如,从一张风景照片中裁剪出特定的建筑或人物,去除不必要的背景,突出主体。缩放功能则让我们可以根据不同的显示需求,调整图像大小,确保图片在各种设备和平台上都能完美展示,如将高分辨率图片缩小用于移动设备的显示。
格式转换功能更是实用,无论是将常见的 JPEG 格式转换为 PNG 格式以获取更好的透明效果,还是转换为 WebP 格式以减小文件大小,提高网页加载速度,ImageSharp 都能轻松实现。同时,它还支持为图像添加各种滤镜,如将彩色图像转换为复古的棕褐色调,或者添加模糊效果,营造出独特的视觉氛围。
在实际项目中,这些功能都发挥着重要作用。例如,在电商项目中,为了展示商品的细节,我们可能需要对商品图片进行裁剪和缩放;为了优化网站性能,会将图片转换为合适的格式。在图像处理工具的开发中,滤镜功能更是为用户提供了丰富的创作空间。
(二)适用场景
ImageSharp 的适用场景广泛,涵盖了多种类型的应用。在 Web 应用中,它可以高效处理用户上传的图片,进行格式转换、缩放等操作,以适应不同的页面布局和设备屏幕尺寸。例如,在社交媒体平台上,用户上传的图片可能具有各种尺寸和格式,ImageSharp 能够将这些图片统一处理,生成适合网页展示的缩略图和高清大图,提升用户体验。
对于桌面应用,ImageSharp 同样表现出色。在图片编辑软件中,它可以提供基础的图像处理功能,如裁剪、旋转、添加滤镜等,让用户能够对图片进行个性化编辑。像一些专业的图像设计软件,借助 ImageSharp 强大的功能,能够实现更复杂的图像处理任务,满足设计师们的高要求。
在移动应用领域,由于移动设备的资源有限,对图像处理的性能和效率要求更高。ImageSharp 的轻量级和高性能特点使其成为移动应用处理图像的理想选择。它可以在不占用过多系统资源的情况下,快速对图片进行处理,如在拍照应用中,对拍摄的照片进行实时滤镜添加、裁剪等操作 。
三、安装 ImageSharp
(一)NuGet 包管理器安装
在 Visual Studio 中使用 NuGet 包管理器安装 ImageSharp,步骤如下:
-
打开 Visual Studio,并加载你的项目。如果是新建项目,先完成项目的创建步骤。
-
在解决方案资源管理器中,找到你的项目名称,右键点击它,在弹出的菜单中选择 “管理 NuGet 程序包”。这一步会打开 NuGet 包管理器窗口。
-
在 NuGet 包管理器窗口中,顶部有一个搜索框。在搜索框中输入 “ImageSharp”,然后按回车键或点击搜索图标。
-
搜索结果会显示出与 “ImageSharp” 相关的包。找到官方的 “SixLabors.ImageSharp” 包,确认其版本号(通常建议选择最新的稳定版本),然后点击 “安装” 按钮。
-
点击 “安装” 后,NuGet 包管理器会开始下载并安装 ImageSharp 及其依赖项。在安装过程中,可能会出现一些提示窗口,例如许可证接受窗口,你需要仔细阅读相关信息并点击 “接受” 按钮,以完成安装。
(二)命令行安装
除了使用 NuGet 包管理器,我们还可以通过命令行来安装 ImageSharp,具体命令如下:
dotnet add package SixLabors.ImageSharp
使用此命令前,请确保你已经安装了.NET SDK,并且已经将项目的目录设置为当前工作目录。在命令行中输入上述命令后,系统会自动从 NuGet 源下载并安装 ImageSharp 包及其依赖项。这种方式对于一些喜欢使用命令行操作的开发者来说,更加快捷和高效,尤其适用于自动化构建脚本中 。
四、基本使用方法
(一)加载图像
使用 ImageSharp 加载图像非常简便,只需指定图像文件的路径即可。以下是具体的代码示例:
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;class Program
{static void Main(){using (var image = Image.Load<Rgba32>("path/to/image.jpg")){// 在这里可以对加载的图像进行各种处理操作}}
}
在上述代码中,Image.Load(“path/to/image.jpg”) 这行代码实现了从指定路径加载图像的功能。其中,Rgba32 表示图像的像素格式,它定义了每个像素的颜色信息,包括红色、绿色、蓝色和透明度(Alpha)通道,每个通道占用 8 位,共 32 位。这种像素格式能够提供丰富的色彩表示,适用于大多数常见的图像处理场景 。
(二)调整图像大小
调整图像大小是图像处理中极为常见的需求,而 ImageSharp 提供的 Resize 方法,能让我们轻松改变图像的尺寸。下面是一个示例代码,展示了如何将图像调整为指定的宽度和高度:
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
using SixLabors.ImageSharp.PixelFormats;class Program
{static void Main(){using (var image = Image.Load<Rgba32>("path/to/image.jpg")){image.Mutate(x => x.Resize(800, 600)); image.Save("resized-image.jpg"); }}
}
在这段代码中,image.Mutate(x => x.Resize(800, 600)) 实现了图像大小的调整。Mutate 方法用于对图像进行一系列的修改操作,这里通过传入一个委托 x => x.Resize(800, 600),指示 ImageSharp 将图像的宽度调整为 800 像素,高度调整为 600 像素。调整后的图像通过 image.Save(“resized-image.jpg”) 保存为新的文件 resized-image.jpg。
除了指定固定的宽度和高度,Resize 方法还支持多种灵活的配置选项。例如,可以通过设置 ResizeOptions 来实现按比例缩放、保持纵横比等功能。下面是一个按比例缩放图像的示例:
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
using SixLabors.ImageSharp.PixelFormats;class Program
{static void Main(){using (var image = Image.Load<Rgba32>("path/to/image.jpg")){var options = new ResizeOptions{Size = new Size(400, 0), Mode = ResizeMode.Max };image.Mutate(x => x.Resize(options));image.Save("resized-proportional-image.jpg");}}
}
在这个示例中,ResizeOptions 的 Size 属性设置为 (400, 0),表示将图像的宽度调整为 400 像素,高度根据原始图像的纵横比自动计算,以确保图像不会被拉伸变形。Mode 属性设置为 ResizeMode.Max,意味着在调整大小时,会尽可能地使图像充满指定的宽度或高度限制,同时保持纵横比 。
(三)裁剪图像
在实际应用中,我们常常需要从原始图像中裁剪出特定的部分,以突出重点或满足特定的布局需求。ImageSharp 的 Crop 方法能够精准地实现这一功能。通过指定一个矩形区域,我们可以轻松裁剪出所需的图像部分。以下是具体的代码示例:
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
using SixLabors.ImageSharp.PixelFormats;class Program
{static void Main(){using (var image = Image.Load<Rgba32>("path/to/image.jpg")){image.Mutate(x => x.Crop(new Rectangle(100, 100, 500, 300))); image.Save("cropped-image.jpg"); }}
}
在上述代码中,image.Mutate(x => x.Crop(new Rectangle(100, 100, 500, 300))) 这行代码实现了图像的裁剪操作。Rectangle(100, 100, 500, 300) 定义了一个矩形区域,其中 (100, 100) 是矩形区域的左上角坐标,500 和 300 分别表示矩形区域的宽度和高度。这意味着从原始图像的左上角开始,向右偏移 100 像素,向下偏移 100 像素,然后选取一个宽度为 500 像素,高度为 300 像素的区域进行裁剪。裁剪后的图像通过 image.Save(“cropped-image.jpg”) 保存为 cropped-image.jpg 文件。
为了更清晰地理解裁剪的原理,我们可以想象一个图像就像一个画布,而 Rectangle 所定义的区域就是我们在画布上绘制的一个矩形框,Crop 方法会将这个矩形框内的图像内容裁剪出来,形成一个新的图像 。
(四)旋转图像
旋转图像也是常见的图像处理需求之一,比如将竖版图片旋转为横版,或者对拍摄角度不正的图片进行矫正。ImageSharp 提供的 Rotate 方法,能够帮助我们轻松实现图像的旋转操作。下面是使用 Rotate 方法将图像顺时针旋转 90 度的代码示例:
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
using SixLabors.ImageSharp.PixelFormats;class Program
{static void Main(){using (var image = Image.Load<Rgba32>("path/to/image.jpg")){image.Mutate(x => x.Rotate(90)); image.Save("rotated-image.jpg"); }}
}
在这段代码中,image.Mutate(x => x.Rotate(90)) 实现了图像的旋转。Mutate 方法用于对图像进行修改,这里通过传入 x => x.Rotate(90),告诉 ImageSharp 将图像以顺时针方向旋转 90 度。旋转后的图像通过 image.Save(“rotated-image.jpg”) 保存为新的文件 rotated-image.jpg。
Rotate 方法的参数是以度数为单位的旋转角度,除了 90 度,我们还可以根据实际需求设置为其他角度,如 180 度、270 度等。此外,ImageSharp 还支持逆时针旋转,只需将旋转角度设置为负数即可。例如,image.Mutate(x => x.Rotate(-90)) 将会使图像逆时针旋转 90 度 。
(五)应用滤镜
ImageSharp 允许我们为图像应用各种滤镜效果,从而为图像增添独特的视觉风格。以将图像转换为灰度图像为例,以下是具体的代码示例:
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
using SixLabors.ImageSharp.PixelFormats;class Program
{static void Main(){using (var image = Image.Load<Rgba32>("path/to/image.jpg")){image.Mutate(x => x.Grayscale()); image.Save("grayscale-image.jpg"); }}
}
在上述代码中,image.Mutate(x => x.Grayscale()) 这行代码实现了将图像转换为灰度图像的功能。Mutate 方法用于对图像进行一系列的修改操作,这里通过传入 x => x.Grayscale(),指示 ImageSharp 将彩色图像转换为灰度图像。转换后的灰度图像通过 image.Save(“grayscale-image.jpg”) 保存为新的文件 grayscale-image.jpg。
除了灰度滤镜,ImageSharp 还提供了多种其他滤镜效果,如高斯模糊、锐化、浮雕等。以高斯模糊滤镜为例,以下是应用高斯模糊滤镜的代码示例:
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
using SixLabors.ImageSharp.PixelFormats;class Program
{static void Main(){using (var image = Image.Load<Rgba32>("path/to/image.jpg")){image.Mutate(x => x.GaussianBlur(5)); image.Save("blurred-image.jpg"); }}
}
在这段代码中,image.Mutate(x => x.GaussianBlur(5)) 实现了为图像应用高斯模糊滤镜的操作。GaussianBlur(5) 中的参数 5 表示模糊的半径,值越大,图像的模糊程度越高。通过调整这个参数,我们可以根据实际需求控制图像的模糊效果 。
(六)转换图像格式
在实际的项目开发中,我们经常需要将图像从一种格式转换为另一种格式,以满足不同的应用场景和需求。例如,将占用空间较大的 JPEG 格式图像转换为支持透明背景的 PNG 格式,或者转换为更适合网络传输的 WebP 格式。ImageSharp 提供了便捷的方法来实现这一功能。以下是将 JPEG 图像转换为 PNG 格式的代码示例:
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;class Program
{static void Main(){using (var image = Image.Load<Rgba32>("path/to/image.jpg")){image.SaveAsPng("converted-image.png"); }}
}
在上述代码中,image.SaveAsPng(“converted-image.png”) 这行代码实现了图像格式的转换。SaveAsPng 方法是 ImageSharp 提供的用于将图像保存为 PNG 格式的方法,它会将加载的 JPEG 图像 image 转换为 PNG 格式,并保存为名为 converted-image.png 的文件。
如果要将图像转换为其他格式,比如 WebP 格式,只需使用对应的保存方法即可。以下是将图像转换为 WebP 格式的代码示例:
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;class Program
{static void Main(){using (var image = Image.Load<Rgba32>("path/to/image.jpg")){image.SaveAsWebp("converted-image.webp"); }}
}
在这段代码中,image.SaveAsWebp(“converted-image.webp”) 实现了将图像转换为 WebP 格式的操作。SaveAsWebp 方法会将图像以 WebP 格式保存,生成 converted-image.webp 文件。WebP 格式具有更好的压缩性能,能够在保持图像质量的同时,有效减小文件大小,特别适合在网络环境中使用 。
五、处理多页图像
ImageSharp 不仅在处理单页图像时表现出色,对于多页图像,如 GIF 动画,同样提供了完善的支持。处理多页图像在许多场景中都非常重要,比如在制作动态表情包、动画演示等应用中。
在处理多页图像时,我们首先要获取图像的帧数,这可以通过访问图像的 Frames 属性的 Count 来实现。以下是一个获取多页图像(以 GIF 动画为例)帧数的示例代码:
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;class Program
{static void Main(){using (var image = Image.Load<Rgba32>("path/to/multi-page-image.gif")){int frameCount = image.Frames.Count;Console.WriteLine($"该GIF动画的帧数为: {frameCount}");}}
}
在上述代码中,image.Frames.Count 用于获取加载的 GIF 动画的帧数,并将其存储在 frameCount 变量中,然后通过 Console.WriteLine 输出帧数。
接下来,如果我们需要对每一帧进行处理,比如调整每一帧的大小、裁剪或应用滤镜等,可以通过遍历 Frames 集合来实现。以下是一个遍历 GIF 动画每一帧,并为每一帧应用灰度滤镜的示例代码:
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
using SixLabors.ImageSharp.PixelFormats;class Program
{static void Main(){using (var image = Image.Load<Rgba32>("path/to/multi-page-image.gif")){foreach (var frame in image.Frames){frame.Mutate(x => x.Grayscale()); }image.Save("grayscale-multi-page-image.gif"); }}
}
在这段代码中,foreach (var frame in image.Frames) 用于遍历 GIF 动画的每一帧。在循环内部,frame.Mutate(x => x.Grayscale()) 对每一帧应用灰度滤镜,将彩色帧转换为灰度帧。最后,通过 image.Save(“grayscale-multi-page-image.gif”) 将处理后的多页图像保存为新的 GIF 文件,文件名是 grayscale-multi-page-image.gif。
通过这种方式,我们可以根据实际需求,对多页图像的每一帧进行灵活且多样化的处理,满足各种复杂的图像处理需求 。
六、保存图像
在完成对图像的各种处理操作后,我们需要将处理后的结果保存下来。ImageSharp 提供了丰富且灵活的保存方法,能够满足不同格式的保存需求。
(一)保存为 JPEG 格式
将图像保存为 JPEG 格式是非常常见的操作,JPEG 格式适用于照片等对色彩丰富度要求较高的图像,并且具有较高的压缩比,能够有效减小文件大小。在 ImageSharp 中,使用 Save 方法并指定保存的文件名,文件扩展名设置为 .jpg 或 .jpeg,即可将图像保存为 JPEG 格式。以下是示例代码:
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;class Program
{static void Main(){using (var image = Image.Load<Rgba32>("path/to/input.jpg")){// 对图像进行处理操作,如调整大小、裁剪等image.Mutate(x => x.Resize(800, 600));image.Save("output.jpg"); }}
}
在上述代码中,image.Save(“output.jpg”) 实现了将处理后的图像保存为 JPEG 格式的文件 output.jpg。如果需要对 JPEG 图像的质量进行设置,可以使用 JpegEncoder 来配置保存选项。例如,将 JPEG 图像的质量设置为 80%,代码如下:
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Formats.Jpeg;
using SixLabors.ImageSharp.PixelFormats;class Program
{static void Main(){using (var image = Image.Load<Rgba32>("path/to/input.jpg")){image.Mutate(x => x.Resize(800, 600));var encoder = new JpegEncoder { Quality = 80 };image.Save("output.jpg", encoder); }}
}
在这个示例中,JpegEncoder { Quality = 80 } 创建了一个 JPEG 编码器实例,并将图像质量设置为 80%。然后通过 image.Save(“output.jpg”, encoder) 将图像以指定的质量设置保存为 JPEG 文件。
(二)保存为 PNG 格式
PNG 格式支持透明背景,常用于图标、图形等需要透明效果的图像。在 ImageSharp 中,保存为 PNG 格式同样很简单,使用 SaveAsPng 方法,并指定保存的文件名,文件扩展名设置为 .png 即可。以下是示例代码:
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;class Program
{static void Main(){using (var image = Image.Load<Rgba32>("path/to/input.jpg")){// 对图像进行处理操作image.Mutate(x => x.Crop(new Rectangle(100, 100, 500, 300)));image.SaveAsPng("output.png"); }}
}
在这段代码中,image.SaveAsPng(“output.png”) 将裁剪后的图像保存为 PNG 格式的文件 output.png。如果需要对 PNG 图像的压缩级别等参数进行设置,可以使用 PngEncoder。例如,设置 PNG 图像的压缩级别为 6(取值范围为 0 - 9,数值越大压缩比越高,但压缩时间也越长),代码如下:
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Formats.Png;
using SixLabors.ImageSharp.PixelFormats;class Program
{static void Main(){using (var image = Image.Load<Rgba32>("path/to/input.jpg")){image.Mutate(x => x.Crop(new Rectangle(100, 100, 500, 300)));var encoder = new PngEncoder { CompressionLevel = 6 };image.Save("output.png", encoder); }}
}
在这个示例中,PngEncoder { CompressionLevel = 6 } 创建了一个 PNG 编码器实例,并将压缩级别设置为 6。通过 image.Save(“output.png”, encoder) 将图像以指定的压缩级别保存为 PNG 文件。
(三)保存为 WebP 格式
WebP 格式是一种新兴的图像格式,具有出色的压缩性能,能够在保证图像质量的前提下,大幅减小文件大小,特别适合在网络环境中使用,如网页加载、移动应用等场景。在 ImageSharp 中,保存为 WebP 格式可以使用 SaveAsWebp 方法,指定保存的文件名,文件扩展名设置为 .webp。以下是示例代码:
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;class Program
{static void Main(){using (var image = Image.Load<Rgba32>("path/to/input.jpg")){// 对图像进行处理操作,如应用滤镜image.Mutate(x => x.Grayscale());image.SaveAsWebp("output.webp"); }}
}
在上述代码中,image.SaveAsWebp(“output.webp”) 将灰度处理后的图像保存为 WebP 格式的文件 output.webp。如果需要对 WebP 图像的质量、压缩模式等参数进行设置,可以使用 WebpEncoder。例如,设置 WebP 图像的质量为 75%,并使用无损压缩模式,代码如下:
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Formats.Webp;
using SixLabors.ImageSharp.PixelFormats;class Program
{static void Main(){using (var image = Image.Load<Rgba32>("path/to/input.jpg")){image.Mutate(x => x.Grayscale());var encoder = new WebpEncoder{Quality = 75,Lossless = true};image.Save("output.webp", encoder); }}
}
在这个示例中,WebpEncoder { Quality = 75, Lossless = true } 创建了一个 WebP 编码器实例,将质量设置为 75%,并开启无损压缩模式。通过 image.Save(“output.webp”, encoder) 将图像以指定的参数设置保存为 WebP 文件。
通过 ImageSharp 提供的这些保存方法,我们可以根据实际需求,灵活地将处理后的图像保存为各种常见的格式,满足不同场景下的应用需求 。
七、完整示例代码
为了让大家更清晰地了解如何综合运用 ImageSharp 的各种功能,以下提供一个完整的示例代码,展示从加载图像开始,依次进行调整大小、裁剪、旋转、应用滤镜以及转换图像格式等一系列操作,并最终保存处理后的图像的全过程。
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Formats;
using SixLabors.ImageSharp.Formats.Jpeg;
using SixLabors.ImageSharp.Formats.Png;
using SixLabors.ImageSharp.Formats.Webp;class Program
{static void Main(){// 加载图像using (var image = Image.Load<Rgba32>("input.jpg")){// 调整图像大小image.Mutate(x => x.Resize(800, 600));// 裁剪图像image.Mutate(x => x.Crop(new Rectangle(100, 100, 400, 300)));// 旋转图像image.Mutate(x => x.Rotate(45));// 应用滤镜 - 高斯模糊image.Mutate(x => x.GaussianBlur(3));// 保存为JPEG格式var jpegEncoder = new JpegEncoder { Quality = 80 };image.Save("output.jpg", jpegEncoder);// 保存为PNG格式var pngEncoder = new PngEncoder { CompressionLevel = 6 };image.Save("output.png", pngEncoder);// 保存为WebP格式var webpEncoder = new WebpEncoder { Quality = 75, Lossless = false };image.Save("output.webp", webpEncoder);}Console.WriteLine("图像处理完成,已保存为不同格式的文件。");}
}
在上述代码中:
-
首先使用 Image.Load(“input.jpg”) 从指定路径加载图像。
-
通过 Mutate 方法结合 Resize 方法将图像大小调整为 800x600 像素。
-
接着使用 Crop 方法从图像中裁剪出一个指定区域,该区域的左上角坐标为 (100, 100),宽度为 400 像素,高度为 300 像素。
-
然后利用 Rotate 方法将图像顺时针旋转 45 度。
-
再使用 GaussianBlur 方法为图像应用高斯模糊滤镜,模糊半径为 3。
-
最后,分别使用 JpegEncoder、PngEncoder 和 WebpEncoder 将处理后的图像保存为 JPEG、PNG 和 WebP 格式,并对每种格式的保存参数进行了设置,如 JPEG 的质量设置为 80%,PNG 的压缩级别设置为 6,WebP 的质量设置为 75% 且使用有损压缩模式 。
八、总结与展望
通过本文的介绍,相信大家对 ImageSharp 这款强大的.NET 图像处理库已经有了较为深入的了解。从其丰富的功能特性,如精准的裁剪、灵活的缩放、多样的滤镜应用,到便捷的安装方式和简单易懂的使用方法,ImageSharp 无疑为我们在图像处理领域提供了高效且优质的解决方案。
在实际项目中,无论是 Web 应用开发中对用户上传图片的处理,还是桌面应用中实现专业的图像编辑功能,亦或是移动应用中对图像资源的优化,ImageSharp 都能发挥重要作用,帮助我们提升应用的质量和用户体验。
展望未来,随着技术的不断发展,图像处理的需求也将日益复杂和多样化。ImageSharp 作为一款活跃的开源项目,有望持续更新和完善,为我们带来更多强大的功能和更卓越的性能。希望各位读者能够在自己的项目中积极尝试使用 ImageSharp,发挥其优势,创造出更加出色的应用。如果在使用过程中有任何心得或问题,欢迎在评论区留言分享,让我们共同探索 ImageSharp 的更多可能性 。
相关文章:
ImageSharp图形库学习
一、引言 在当今数字化时代,无论是 Web 应用、桌面程序,还是移动应用,图像处理都扮演着至关重要的角色。从电商平台展示商品图片,到社交媒体分享照片,再到各种软件的图标设计,图像处理无处不在。博主们在内…...
Android string.xml中特殊字符转义
项目中要在string.xml 中显示特殊符号 空格: (普通的英文半角空格但不换行) 窄空格: (中文全角空格 (一个中文宽度)) (半个中文宽度,但两个空格比一个中文…...
Rust 游戏开发框架指南
Rust 游戏开发框架指南 主流游戏引擎 1. Bevy 最受欢迎的 Rust 游戏引擎之一,基于 ECS(实体组件系统)架构。 特点: 🚀 高性能 ECS 系统📦 热重载支持🎨 现代渲染器🔊 内置音频系…...
SpringBoot3+Vue3开发台球计时系统
项目介绍 台球计时系统可以帮助我们自动计算开台时间(从开始到结束的时间段)、自动计算开台费用、结账后生成订单记录进行留存、也可以导出订单记录。 主要功能包含:球桌管理、开台、结账、查看占用明细、查看球台订单、订单管理、查看订单…...
基于springboot的租房网站系统
作者:学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等 文末获取“源码数据库万字文档PPT”,支持远程部署调试、运行安装。 项目包含: 完整源码数据库功能演示视频万字文档PPT 项目编码࿱…...
静态综合路由实验
实验拓扑 实验要求 1.除R5的环回地址外,整个其他所有网段基于192.168.1.0/24进行合理的IP地址划分 2.R1-R4每个路由器存在两个环回接口,用于模拟pc网段;地址也在192.168.1.0/24这个网络范围内 3.R1-R4上不能直接编写到达5.5.5.0/24的静态路由…...
国产编辑器EverEdit - 扩展脚本:新建同类型文件(避免编程学习者反复新建保存练习文件)
1 扩展脚本:在当前文件目录下新建同类型文件 1.1 应用场景 用户在进行编程语言学习时,比如:Python,经常做完一个小练习后,又需要新建一个文件,在新建文件的时候,不但要选择文件类型,…...
Ubuntu Server 24.04 配置静态IP
Ubuntu Server 24.04 配置静态IP 提示:基于Ubuntu Server 24.04进行配置 文章目录 Ubuntu Server 24.04 配置静态IP一、查看网卡信息二、修改网卡信息三、使网卡配置生效四、测试 一、查看网卡信息 使用命令 ip a lo 为本地回环地址 ens33 真实网卡地址 shanfengubu…...
★3.3 事件处理
★3.3.1 ※MouseArea Item <-- MouseArea 属性 acceptedButtons : Qt::MouseButtons containsMouse : bool 【书】只读属性。表明当前鼠标光标是否在MouseArea上,默认只有鼠标的一个按钮处于按下状态时才可以被检测到。 containsPress : bool curs…...
linux系统监视(centos 7)
一.系统监视 1.安装iostat,sar,sysstat(默认没有,安装过可以跳跃) iostat 和 sar: 同样,iostat 和 sar 是 sysstat 软件包的一部分。使用以下命令安装:sudo yum install sysstat解释…...
Java面试总结(1)
问题1 自我介绍: 面试官您好,我叫xxx,是来自xxxx大学软件工程专业的一名应届生,我这次想应聘的是java开发实习生,在校期间,我热爱编程,能够使用java,C,python的编程语言,…...
晨辉面试抽签和评分管理系统之六:面试答题倒计时
晨辉面试抽签和评分管理系统(下载地址:www.chenhuisoft.cn)是公务员招录面试、教师资格考试面试、企业招录面试等各类面试通用的考生编排、考生入场抽签、候考室倒计时管理、面试考官抽签、面试评分记录和成绩核算的面试全流程信息化管理软件。提供了考生…...
关于H5复制ios没有效果
问题场景:今天遇到这样一个问题,需要从后端接口获取到的值进行复制,且不能提现调用获取值,因为是一个数据列表,每个列表元素需要当场点击调用接口获取值进行复制,本来以为很简单的一个需求,当做…...
Windows 蓝牙驱动开发-安装蓝牙设备
蓝牙配置文件驱动程序有两种安装类型: 客户端安装,在此类安装中,远程设备播发其服务,并且计算机与之连接。 示例包括:鼠标、键盘和打印机;服务器端安装,在此类安装中,计算机播发服务…...
你喜欢用什么编辑器?
电脑工作者和程序员所使用的文本编辑器通常需要具备高效率、易用性以及对代码友好等特点,包括语法高亮、自动完成、多文件同时编辑、查找替换、版本控制集成等功能。以下是几个广受开发者欢迎且实用性较强的文本编辑器: Visual Studio Code(V…...
32_Redis分片集群原理
1.Redis集群分片 1.1 Redis集群分片介绍 Redis集群没有使用一致性hash,而是引入了哈希槽的概念。Redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽。 用于将密钥映射到散列插槽的基本算法如下: HASH_SLOT = CRC16(key) mod 16384 集群的每…...
小米vela系统(基于开源nuttx内核)——openvela开源项目
前言 在 2024 年 12 月 27 日的小米「人车家全生态」合作伙伴大会上,小米宣布全面开源 Vela 操作系统。同时,OpenVela 项目正式上线 GitHub 和 Gitee,采用的是比较宽松的 Apache 2.0 协议,这意味着全球的开发者都可以参与到 Vela…...
【STM32-学习笔记-7-】USART串口通信
文章目录 USART串口通信Ⅰ、硬件电路Ⅱ、常见的电平标准Ⅲ、串口参数及时序Ⅳ、STM32的USART简介数据帧起始位侦测数据采样波特率发生器 Ⅴ、USART函数介绍Ⅵ、USART_InitTypeDef结构体参数1、USART_BaudRate2、USART_WordLength3、USART_StopBits4、USART_Parity5、USART_Mode…...
实现类似Excel的筛选
以下是在 DataGridView 中实现类似 Excel 下拉筛选功能的解决方案: 解决思路 为 DataGridView 的列添加 DataGridViewComboBoxColumn 类型的列,用于显示下拉筛选列表。为 DataGridView 的 ColumnHeaderMouseClick 事件添加处理程序,当用户点…...
【Rust】结构体定义域实例化
目录 思维导图 1. 结构体的定义与实例化 1.1 结构体的基本概念 1.2 定义结构体 1.3 创建结构体实例 1.4 结构体的定义与实例化示例 2. 访问与修改结构体字段 2.1 访问字段 2.2 修改字段 3. 结构体实例的构造函数 3.1 构造函数的定义 3.2 使用字段初始化简写 4. 结…...
VB.NET 正则表达式完全指南
VB.NET 正则表达式完全指南 VB.NET通过 System.Text.RegularExpressions 命名空间提供正则表达式支持。本指南将详细介绍VB.NET中正则表达式的使用方法、性能优化和最佳实践。 1. 基础知识 1.1 导入命名空间 Imports System.Text.RegularExpressions1.2 基本使用 Public C…...
ASP.NET Core - 配置系统之自定义配置提供程序
ASP.NET Core - 配置系统之自定义配置提供程序 4. 自定义配置提供程序IConfigurationSourceIConfigurationProvider 4. 自定义配置提供程序 在 .NET Core 配置系统中封装一个配置提供程序关键在于提供相应的 IconfigurationSource 实现和 IConfigurationProvider 接口实现&…...
大语言模型的稀疏性:提升效率与性能的新方向
大语言模型的稀疏性:提升效率与性能的新方向 大语言模型(LLM, Large Language Model)随着参数规模的不断扩大,其性能得到了显著提升,但也带来了巨大的计算和存储开销。稀疏性(Sparsity)作为一种…...
迅为RK3568开发板篇OpenHarmony配置HDF驱动控制LED-新增 topeet子系统-编写 bundle.json文件
bundle.json 文件内容如下所示: 下面是对各个字段的解释: 1. name: "ohos/demos" - 这是组件或项目的名称,这里表示它属于 OHOS(OpenHarmony OS)生态系统下的一个名为"demos"的组件。 2. descri…...
vulnhub靶场【IA系列】之Tornado
前言 靶机:IA-Tornado,IP地址为192.168.10.11 攻击:kali,IP地址为192.168.10.2 都采用虚拟机,网卡为桥接模式 本文所用靶场、kali镜像以及相关工具,我放置在网盘中,可以复制后面链接查看 htt…...
GB44495-2024 汽车整车信息安全技术要求 - V2X部分前置要求
背景 GB 44495-2024《汽车整车信息安全技术要求》中关于V2X(车与外界通信)的部分,主要关注于通信安全要求,旨在确保车辆在与外部设备进行数据交互时的信息安全。其测试大致可分为消息层(数据无异常)、应用…...
基于mediapipe的手势游戏控制
基于mediapipe的手势游戏控制 玩游戏,那不是有手就行!!! mediapipe介绍 Mediapipe是Google在2019年开发并提出的一款开源的跨平台多媒体处理框架,用于构建基于机器学习的应用程序,特别是涉及到计算机视觉、音频处理、姿势估计等领域。…...
K8S 节点选择器
今天我们来实验 pod 调度的 nodeName 与 nodeSelector。官网描述如下: 假设有如下三个节点的 K8S 集群: k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、镜像准备 1.1、镜像拉取 docker pull tomcat:8.5-jre8…...
IEC103 转 ModbusTCP 网关
一、产品概述 IEC103 转 ModbusTCP 网关型号 SG-TCP-IEC103 ,是三格电子推出的工业级网关(以下简 称网关),主要用于 IEC103 数据采集、 DLT645-1997/2007 数据采集, IEC103 支持遥测和遥 信,可接…...
docker swarm 部署问题 和 指定节点部署服务
问题原因: docker swarm 部署遇到的问题, 先前docker compose部署,分别创建了 cloud 网络; 昨进行swarm 集群部署;只是删了57 机器cloud 网络;在创建swarm集群后创建cloud 58机器 没有删除先前的cloud 网络…...
09.VSCODE:安装 Git for Windows
在 Windows 下安装著名的源代码管理工具:git。 git 工具两大作用: 管理我们自己的源代码获取他人(开源的)源代码 当前我们更需要第2点。 为什么要安装 git 一、 得到更多库 之前课程中我们安装了 msys2,从而可以通…...
基于R计算皮尔逊相关系数
# 基于R计算皮尔逊相关系数 # 函数 基本基本函数 cor.test ## 两组数据读入 xread.csv("1.csv",header T) yread.csv("2.csv",header T) ## 计算 cor.test(1,2,method"pearson") 结果 Pearsons product-moment correlationdata: 1 and 2…...
vue 纯前端导出 Excel
方法一: 1、安装"file-saver" npm i -S file-saver xlsx 2、引入 在需要导出功能的 .vue 文件中引入 import FileSaver from "file-saver"; import XLSX from "xlsx"; 3、简单示例(复制即可食用)&#x…...
APISQL在线一键安装教程
本文档将指导您在 Linux 服务器上使用 Docker 安装 APISQL 软件。提供了两种安装方式:在线安装和离线安装,您可以根据实际环境选择合适的安装方式。 1. 准备工作 1.1 硬件要求 Linux (x86_64) 服务器 1.2 软件要求 Docker Engine 推荐版本ÿ…...
数据结构《MapSet哈希表》
文章目录 一、搜索树1.1 定义1.2 模拟实现搜索 二、Map2.1 定义2.2 Map.Entry2.3 TreeMap的使用2.4 Map的常用方法 三、Set3.1 定义3.2 TreeSet的使用3.3 Set的常用方法 四、哈希表4.1 哈希表的概念4.2 冲突4.2.1 冲突的概念4.2.2 冲突的避免1. 选择合适的哈希函数2. 负载因子调…...
【PCL】sample_consensus 模块—— Random Sample Consensus model(随机样本一致性模型,RANSAC)
1、随机样本一致性模型(RANSAC)简介 在本教程中,我们将学习如何使用带有平面模型的随机样本一致性(RANSAC)来获取适合该模型的点云。 1.1理论背景 RANSAC 是“随机样本一致性”(RANdom SAmple Consensus…...
【MATLAB代码】CV和CA模型组成的IMM(滤波方式为UKF),可复制粘贴源代码
该代码实现了一维无迹卡尔曼滤波器(UKF)与交互式多模型(IMM)结合的状态估计。代码分为多个部分,主要功能包括参数定义、观测数据生成、状态估计、模型更新以及结果可视化。 文章目录 运行结果程序代码主要功能代码结构应用场景注意事项运行结果 程序代码 下方源代码直接粘…...
docker-compose部署kafka 3.3.1 kraft
一、服务器: 节点1:10.1.1.165 节点2:10.1.1.164 节点3:10.1.1.169二、添加环境地址解析 vim /etc/hosts kafka1 10.1.1.165 kafka2 10.1.1.164 kafka3 10.1.1.169三、节点配置 节点1 version: "3" services:kafka1:image: bitnami/kafka:3.3.1contain…...
Linux 串口检查状态的实用方法
在 Linux 系统中,串口通信是非常常见的操作,尤其在嵌入式系统、工业设备以及其他需要串行通信的场景中。为了确保串口设备的正常工作,检查串口的连接状态和配置信息是非常重要的。本篇文章将介绍如何在 Linux 上检查串口的连接状态࿰…...
使用FRP进行内网穿透
一、基本概念 内网穿透:它是一种网络技术或方法,旨在允许外部网络(如互联网)访问位于内部网络(内网)中的设备或服务。由于内部网络通常处于NAT(网络地址转换)、防火墙或其他安全机制…...
Ubuntu打开文件夹不显示文件
1.情况介绍 使用ubuntu打开文件夹不显示文件夹里面的内容,而是直接打开了资源查看器。 2.解决办法 命令行安装nautilus sudo apt-get install nautilus...
HarmonyOS NEXT应用开发边学边玩系列:从零实现一影视APP (三、影视搜索页功能实现)
在HarmonyOS NEXT开发环境中,可以使用nutpi/axios库来简化网络请求的操作。本文将展示如何使用HarmonyOS NEXT框架和nutpi/axios库,从零开始实现一个简单的影视APP,主要关注影视搜索页的功能实现。 为什么选择nutpi/axios? nutpi…...
探秘 JMeter 前置处理器:让性能测试如虎添翼
想象一下,你是一位超级英雄,要对一个庞大的虚拟城市(Web 应用)进行全面的 “健康检查”。JMeter 就是你的神奇工具包,而其中的前置处理器,就像是这个工具包里的各种超级武器,能帮助你轻松应对各…...
如何在gitlab cicd中实现每月10号上午执行
在 GitLab CI/CD 中,可以通过设置定时触发器(Schedules)和脚本中的时间判断逻辑结合,确保任务只在每月 10 号的上午运行。 以下是实现的步骤: 1. 设置定时触发器 GitLab 提供了 Schedules 功能,可以指定每…...
深度学习基础知识
深度学习是人工智能(AI)和机器学习(ML)领域的一个重要分支,以下是对深度学习基础知识的归纳: 一、定义与原理 定义:深度学习是一种使计算机能够从经验中学习并以概念层次结构的方式理解世界的机…...
面试加分项:Android Framework AMS 全面概述和知识要点
第一章:AMS 的架构与组件 1.1 AMS 整体架构 在 Android 系统的庞大体系中,AMS(Activity Manager Service)就如同一个中枢神经系统,是整个系统的核心服务之一,对应用的性能和用户体验有着直接且关键的影响 。它的整体架构由 Client 端和 Service 端两大部分组成,这两端相…...
网安——CSS
一、CSS基础概念 CSS有两个重要的概念,分为样式和布局 CSS的样式分为两种,一种是文字的样式,一种是盒模型的样式 CSS的另一个重要的特质就是辅助页面布局,完成HTML不能完成的功能,比如并排显示或精确定位显示 从HT…...
知识图谱常见的主流图数据库
在知识图谱中,主流使用的图数据库包括以下几种: Neo4j:这是目前全球部署最广泛的图数据库之一,具有强大的查询性能和灵活的数据模型,适用于复杂关系数据的存储和查询。 JanusGraph:JanusGraph是一个开源的…...
阀井可燃气体监测仪,开启地下管网安全新篇章-旭华智能
在城市的脉络中,地下管网犹如隐秘的动脉,支撑着现代生活的运转。而在这庞大网络的关键节点上,阀井扮演着不可或缺的角色。然而,由于其密闭性和复杂性,阀井内部一旦发生可燃气体泄漏,将对公共安全构成严重威…...
【6】Word:海名公司文秘❗
目录 题目 List.docx Word.docx List.docx和Word.docx 题目 List.docx 选中1/4全角空格复制→选中全部文本→开始→替换:粘贴将1/4全角空格 替换成 空格选中全部文本→插入→表格→将文本转化成表格→勾选和布局→自动调整→勾选 选中第一列,单机右键…...