雷达智富

首页 > 内容 > 程序笔记 > 正文

程序笔记

.NET Core c#使用SkiaSharp压缩裁切图片去除水印

2024-10-12 27

在.NET 6中,微软官方建议使用SkiaSharp库进行图片操作。本文主要介绍使用SkiaSharp库压缩裁切图片去除水印。

做图片压缩和去除水印,主要是为了在网站中使用图片。比如抓取某网站的文章和图片发布到自己的网站中。但是图片很大,而且还有水印就需要处理一下。

压缩图片的思路是缩放图片尺寸,适当降低图片质量。压缩效果可以参考这篇文章:。.NET Core c#使用SkiaSharp压缩图片

去除水印的话,很难从代码层面真实去除水印。一般水印在图片的边缘,上方或者下方,所以可以采取截掉部分高度来达到效果。

下面是实现的c#代码:

/// <summary>
/// 压缩并裁切图片去除上下水印
/// </summary>
/// <param name="source">原文件位置</param>
/// <param name="target">生成目标文件位置</param>
/// <param name="maxWidth">最大宽度,根据此宽度计算是否需要缩放,计算新高度</param>
/// <param name="top">顶部裁切高度,单位px</param>
/// <param name="bottom">底部裁切高度,单位px</param>
/// <param name="quality">图片质量,范围0-100</param>
public static void CompressAndCut(string source, string target, decimal maxWidth, int top, int bottom, int quality)
{
    using (var file = File.OpenRead(source))
    using (var fileStream = new SKManagedStream(file))
    using (var bitmap = SKBitmap.Decode(fileStream))
    {
        var width = (decimal)bitmap.Width;
        var height = (decimal)bitmap.Height;
        var newWidth = width;
        var newHeight = height;
        if (width > maxWidth)
        {
            newWidth = maxWidth;
            newHeight = height / width * maxWidth;
        }
        using (var resized = bitmap.Resize(new SKImageInfo((int)newWidth, (int)newHeight), SKFilterQuality.Medium))
        {
            if (resized != null)
            {
                using (var surface = SKSurface.Create(new SKImageInfo((int)newWidth, (int)newHeight - top - bottom))) {
                    var canvas = surface.Canvas;
                    canvas.DrawBitmap(resized, 0, 0 - top);
                    using (var image = surface.Snapshot()) {
                        using (var writeStream = File.OpenWrite(target)) {
                            image.Encode(SKEncodedImageFormat.Jpeg, quality).SaveTo(writeStream);
                        }
                    }
                }
            }
        }
    }
}

主要是把图片通过bitmap.Resize方法缩放大小,然后使用SKSurface对象的Create方法创建一个Canvas然后重新绘制图片后压缩保存。

接下来我们使用一张1000x704的jpg图片做测试,我故意在图片上下加了字作为水印。测试图片如下:

测试代码:

string source = "D:\\Images\\source.jpg";
//实验1 不改变尺寸,图片质量改为80,上下截去25px
ImageTools.CompressAndCut(source, "D:\\Images\\target-cut-1.jpg", 1000, 25, 25, 80);
//实验2 尺寸缩放到宽度800,图片质量改为80,上下截去25px
ImageTools.CompressAndCut(source, "D:\\Images\\target-cut-2.jpg", 800, 25, 25, 80);

测试结果:

可以看到图片分别被压缩到58KB和40KB,大小减少了一大半。

下面是两张实验图片,可以看到水印已经被截掉了。大家可以右键另存为后仔细对比一下,肉眼看不出区别。

实验1

实验2

更新于:6天前
赞一波!

文章评论

评论问答