Magick.NET 支持100多种格式的强大 .NET 图片处理库

560 阅读5分钟

前言

图像处理已成为软件开发中的高频需求。然而,传统方案如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技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!

优秀是一种习惯,欢迎大家留言学习!