前言
图像处理已成为软件开发中的高频需求。然而,传统方案如System.Drawing受限于格式支持少、跨平台兼容性差,而开源库ImageMagick虽强大却需复杂环境配置。
Magick.NET 它无缝融合了ImageMagick的底层能力与.NET的便捷性,支持超过100种图像格式(如JPEG、PNG、GIF、PDF、SVG等)的读写与操作,且无需安装额外依赖,能够满足各种图像处理需求。
项目介绍
基于.NET Standard开发的开源项目,支持100的图片格式,可以在C#/VB.NET/.NET Core直接使用。
如果需要操作AI/EPS/PDF/PS、Video 格式,需要额外安装插件。
系统功能
1、读取:读取、图片信息、支持多层/帧、Exif数据、颜色。
2、调整:调整动画gif大小、指定图片大小。
3、转换:100多中格式互相转换、CMYK转换为RGB、CR2转换为JPG。
4、合并:图片合并、创建动画gif。
5、PDF:PDF转为一个/多个图片、一个/多个图片转为PDF。
6、压缩:无损压缩。
7、文本:添加文本、添加水印。
项目特点
1、跨平台与高性能
全栈兼容:支持Windows、Linux、macOS,兼容.NET Framework、.NET Core/5+,覆盖x64、arm64等多种架构,满足企业级应用的部署需求。
量子深度优化:提供Q8、Q16、Q16-HDRI三种量子深度的NuGet包,适应不同场景的精度与性能平衡。
开源生态:基于Apache 2.0协议开源,社区活跃,可自由扩展功能或贡献代码。
2、核心优势
零环境依赖:无需本地安装ImageMagick,通过NuGet一键集成。
功能全覆盖:从基础操作(缩放、裁剪)到高级特效(模糊、颜色矩阵变换),均通过直观API实现。
企业级扩展:支持与System.Drawing、System.Windows.Media交互,便于与现有图形库整合。
项目示例
1、图片格式转换
using ImageMagick;
using System.IO;
class Program
{
static void Main(string[] args)
{
// GIF 转 PNG
using (var image = new MagickImage(@"c:\path\to\Snakeware.gif"))
{
image.Format = MagickFormat.Png;
image.Write(@"c:\path\to\Snakeware.png");
}
// 创建并保存 PNG 图像(紫色背景)
var settings = new MagickReadSettings
{
Width = 800,
Height = 600
};
using (var memStream = new MemoryStream())
{
using (var image = new MagickImage("xc:purple", settings))
{
image.Format = MagickFormat.Png;
image.Write(memStream);
// 如果需要保存到文件
File.WriteAllBytes(@"c:\path\to\output.png", memStream.ToArray());
}
}
// PNG 转 JPEG
using (var image = new MagickImage(@"c:\path\to\Snakeware.png"))
{
image.Format = MagickFormat.Jpeg;
// 保存为文件
image.Write(@"c:\path\to\Snakeware.jpg");
// 或者转换为字节数组
byte[] data = image.ToByteArray();
}
}
}
2、尺寸调整与裁剪
智能缩放算法保留画质,支持等比例或强制拉伸
image.Resize(new MagickGeometry(800, 600));
// 调整尺寸
image.Crop(400, 300, Gravity.Center); // 居中裁剪
3、将 PDF 转换为图片
可以使用 Magick.NET 实现以下功能:
将 PDF 文件转换为多个图像文件(如 PNG 和 TIF)。
// 设置密度为 300 dpi 将创建更高品质的图像
var settings = new MagickReadSettings
{
Density = new Density(300, 300)
};
using var images = new MagickImageCollection();
// 将 PDF 文件的所有页面添加到集合中
images.Read(SampleFiles.SnakewarePdf, settings);
var page = 1;
foreach (var image in images)
{
// 将每一页写入包含页码的文件
image.Write("Snakeware.Page" + page + ".png");
// 写入特定格式的操作与单个图像相同
image.Format = MagickFormat.Ptif;
image.Write("Snakeware.Page" + page + ".tif");
page++;
}
将 PDF 文件转换为一张图像文件(水平或垂直拼接)。
// 设置密度为 300 dpi 将创建更高品质的图像
var settings = new MagickReadSettings
{
Density = new Density(300)
};
using var images = new MagickImageCollection();
// 将 PDF 文件的所有页面添加到集合中
images.Read(SampleFiles.SnakewarePdf, settings);
// 创建一个水平拼接所有页面的新图像
using var horizontal = images.AppendHorizontally();
// 将结果保存为 PNG 格式
horizontal.Write("Snakeware.horizontal.png");
// 创建一个垂直拼接所有页面的新图像
using var vertical = images.AppendVertically();
// 将结果保存为 PNG 格式
vertical.Write("Snakeware.vertical.png");
多张图像创建 PDF 文件。
using var images = new MagickImageCollection();
// 添加第一页
images.Add(new MagickImage(SampleFiles.SnakewareJpg));
// 添加第二页
images.Add(new MagickImage(SampleFiles.SnakewareJpg));
// 创建一个包含两页的 PDF 文件
images.Write("Snakeware.pdf");
单张图像创建 PDF 文件。
// 从文件读取图像
using var image = new MagickImage(SampleFiles.SnakewareJpg);
// 创建一个包含单页的 PDF 文件
image.Write("Snakeware.pdf");
PDF 文件中读取特定页面。
var settings = new MagickReadSettings
{
FrameIndex = 0, // 第一页
FrameCount = 1 // 页面数量
};
using var images = new MagickImageCollection();
// 只读取 PDF 文件的第一页
images.Read(SampleFiles.SnakewarePdf, settings);
// 清空集合
images.Clear();
settings.FrameCount = 2; // 页面数量
// 读取 PDF 文件的前两页
images.Read(SampleFiles.SnakewarePdf, settings);
4、高级功能
滤镜与特效
内置高斯模糊、锐化、颜色反转等滤镜,支持自定义卷积矩阵实现边缘检测。
image.Filter(FilterType.GaussianBlur, 5);
// 高斯模糊
image.Convolve(new ConvolveMatrix(3, new double[] {0,1,0,1,0,1,0,1,0})); // 自定义卷积
PDF与矢量处理
需配合Ghostscript将PDF转为图片,支持分页提取与高分辨率渲染。
var settings = new MagickReadSettings { Density = new Density(900) };
using (var images = new MagickImageCollection("doc.pdf", settings)) {
foreach (var page in images) page.Write($"page-{index}.png");
}
项目地址
GitHub:github.com/dlemstra/Ma…
Gitee:gitee.com/hubo/Magick…
总结
以上仅展示了 Magick.NET 的部分功能。更多实用特性和详细信息,请大家访问项目地址。
希望通过本文能为 .NET 图形库开发方面提供有价值的参考。欢迎在评论区留言交流,分享您的宝贵经验和建议。
最后
如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。
也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!
优秀是一种习惯,欢迎大家留言学习!