位置: 文档库 > C#(.NET) > 文档下载预览

《C#图片处理示例(裁剪,缩放,清晰度,水印).doc》

1. 下载的文档为doc格式,下载后可用word或者wps进行编辑;

2. 将本文以doc文档格式下载到电脑,方便收藏和打印;

3. 下载后的文档,内容与下面显示的完全一致,下载之前请确认下面内容是否您想要的,是否完整.

点击下载文档

C#图片处理示例(裁剪,缩放,清晰度,水印).doc

《C#图片处理示例(裁剪,缩放,清晰度,水印)》

在.NET开发中,图片处理是常见的业务需求,无论是Web应用中的缩略图生成,还是桌面程序中的图像编辑,都需要对图片进行裁剪、缩放、清晰度调整和水印添加等操作。本文将通过完整的C#示例代码,结合System.Drawing命名空间(Windows平台)和ImageSharp库(跨平台方案),详细讲解如何实现这些核心功能,并提供跨平台兼容的解决方案。

一、基础环境准备

在Windows平台下,可直接使用System.Drawing.Common NuGet包(需注意.NET Core 3.1+和.NET 5+的兼容性)。对于跨平台需求,推荐使用SixLabors.ImageSharp库,该库不依赖系统GDI+,支持Linux/macOS。

安装NuGet包命令:


# Windows传统方案
Install-Package System.Drawing.Common

# 跨平台方案
Install-Package SixLabors.ImageSharp
Install-Package SixLabors.ImageSharp.Drawing

二、图片裁剪实现

裁剪操作需要指定裁剪区域的起始坐标(x,y)和宽高(width,height)。以下是两种实现方式:

1. System.Drawing方案


using System.Drawing;
using System.Drawing.Imaging;

public static void CropImageSystemDrawing(string inputPath, string outputPath, 
    int x, int y, int width, int height)
{
    using (var original = Image.FromFile(inputPath))
    {
        // 验证裁剪区域是否有效
        if (x  original.Width || 
            y + height > original.Height)
        {
            throw new ArgumentException("裁剪区域超出图片边界");
        }

        var cropRect = new Rectangle(x, y, width, height);
        using (var cropped = new Bitmap(width, height))
        {
            using (var g = Graphics.FromImage(cropped))
            {
                g.DrawImage(original, 
                    new Rectangle(0, 0, cropped.Width, cropped.Height),
                    cropRect, 
                    GraphicsUnit.Pixel);
            }
            cropped.Save(outputPath, original.RawFormat);
        }
    }
}

2. ImageSharp方案


using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;

public static void CropImageImageSharp(string inputPath, string outputPath, 
    int x, int y, int width, int height)
{
    using (var image = Image.Load(inputPath))
    {
        // 验证参数
        if (x  image.Width || 
            y + height > image.Height)
        {
            throw new ArgumentException("裁剪区域超出图片边界");
        }

        image.Mutate(x => x.Crop(new Rectangle(x, y, width, height)));
        image.Save(outputPath);
    }
}

三、图片缩放实现

缩放操作需要保持宽高比或强制指定尺寸,同时可选择不同的插值算法影响质量。

1. 保持宽高比的缩放


public static void ResizeWithAspectRatio(string inputPath, string outputPath, 
    int maxWidth, int maxHeight)
{
    using (var image = Image.Load(inputPath))
    {
        // 计算保持宽高比的新尺寸
        double ratioX = (double)maxWidth / image.Width;
        double ratioY = (double)maxHeight / image.Height;
        double ratio = Math.Min(ratioX, ratioY);

        int newWidth = (int)(image.Width * ratio);
        int newHeight = (int)(image.Height * ratio);

        image.Mutate(x => x.Resize(newWidth, newHeight));
        image.Save(outputPath);
    }
}

2. 强制指定尺寸的缩放


public static void ResizeForceSize(string inputPath, string outputPath, 
    int width, int height)
{
    using (var image = Image.Load(inputPath))
    {
        // 使用Lanczos3重采样算法获得更高质量
        image.Mutate(x => x.Resize(new ResizeOptions
        {
            Size = new Size(width, height),
            Mode = ResizeMode.Max,
            Sampler = KnownResamplers.Lanczos3
        }));
        image.Save(outputPath);
    }
}

四、图片清晰度调整

清晰度调整主要通过卷积运算实现,包括锐化和模糊两种常见效果。

1. 锐化处理(增强边缘)


using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing.Processors.Convolution;

public static void SharpenImage(string inputPath, string outputPath, float intensity = 1.0f)
{
    using (var image = Image.Load(inputPath))
    {
        // 锐化卷积核(3x3)
        var kernel = new float[]
        {
            0, -intensity, 0,
            -intensity, 1 + 4 * intensity, -intensity,
            0, -intensity, 0
        };

        image.Mutate(x => x.Apply(new Convolution(
            new Kernel(3, 3, kernel), 
            normalize: true)));
        
        image.Save(outputPath);
    }
}

2. 高斯模糊处理


public static void GaussianBlur(string inputPath, string outputPath, 
    int radius = 3, float sigma = 1.0f)
{
    using (var image = Image.Load(inputPath))
    {
        image.Mutate(x => x.GaussianBlur(radius, sigma));
        image.Save(outputPath);
    }
}

五、水印添加实现

水印分为文字水印和图片水印两种类型,需要考虑位置、透明度、旋转角度等参数。

1. 文字水印实现


using SixLabors.Fonts;
using SixLabors.ImageSharp.Drawing.Processing;

public static void AddTextWatermark(string inputPath, string outputPath, 
    string watermarkText, Font font, Color color, 
    Point position, float opacity = 0.5f)
{
    using (var image = Image.Load(inputPath))
    {
        // 创建半透明画笔
        var brush = new Color(
            (byte)(color.R * opacity),
            (byte)(color.G * opacity),
            (byte)(color.B * opacity));

        image.Mutate(x => x.DrawText(
            watermarkText, 
            font, 
            brush, 
            new PointF(position.X, position.Y)));
        
        image.Save(outputPath);
    }
}

// 使用示例
var fontCollection = new FontCollection();
fontCollection.Install("arial.ttf"); // 或使用系统默认字体
var font = fontCollection.CreateFont("Arial", 24, FontStyle.Bold);
AddTextWatermark("input.jpg", "output.jpg", 
    "Sample Watermark", font, Color.Red, new Point(50, 50), 0.7f);

2. 图片水印实现


public static void AddImageWatermark(string inputPath, string watermarkPath, 
    string outputPath, Point position, float opacity = 0.5f)
{
    using (var image = Image.Load(inputPath))
    using (var watermark = Image.Load(watermarkPath))
    {
        // 调整水印透明度
        watermark.Mutate(x => x.Opacity(opacity));
        
        image.Mutate(x => x.DrawImage(
            watermark, 
            new Point(position.X, position.Y), 
            1f)); // 1f表示不缩放水印
        
        image.Save(outputPath);
    }
}

六、完整处理流程示例

以下是一个组合操作的完整示例,包含裁剪、缩放、锐化和水印添加:


public static void CompleteImageProcessing(string inputPath, string outputPath)
{
    // 1. 裁剪图片中心区域
    using (var image = Image.Load(inputPath))
    {
        int cropSize = Math.Min(image.Width, image.Height) / 2;
        int x = (image.Width - cropSize) / 2;
        int y = (image.Height - cropSize) / 2;
        
        image.Mutate(x => x.Crop(new Rectangle(x, y, cropSize, cropSize)));

        // 2. 缩放到指定尺寸
        image.Mutate(x => x.Resize(800, 600));

        // 3. 锐化处理
        var sharpenKernel = new float[]
        {
            0, -0.5f, 0,
            -0.5f, 3, -0.5f,
            0, -0.5f, 0
        };
        image.Mutate(x => x.Apply(new Convolution(
            new Kernel(3, 3, sharpenKernel), 
            normalize: true)));

        // 4. 添加文字水印
        var font = SystemFonts.CreateFont("Arial", 32, FontStyle.Bold);
        image.Mutate(x => x.DrawText(
            "Processed by C#", 
            font, 
            Color.FromRgba(255, 255, 255, 128), // 半透明白色
            new PointF(20, image.Height - 50)));

        image.Save(outputPath);
    }
}

七、性能优化建议

1. 批量处理时使用并行编程(Parallel.ForEach)

2. 复用Bitmap对象和Graphics对象减少内存分配

3. 对于Web应用,考虑使用内存流(MemoryStream)避免磁盘IO

4. 根据输出需求选择合适的编码质量参数

八、跨平台注意事项

1. System.Drawing在Linux上需要安装libgdiplus

2. ImageSharp默认不支持EXIF信息处理,需额外库

3. 字体渲染在不同平台可能有差异,建议测试目标环境

关键词:C#图片处理、System.Drawing、ImageSharp、图片裁剪、图片缩放、清晰度调整、图片水印、跨平台图像处理、.NET图像处理

简介:本文详细介绍了使用C#进行图片处理的完整方案,涵盖裁剪、缩放、清晰度调整和水印添加四大核心功能。提供System.Drawing(Windows)和ImageSharp(跨平台)两种实现方式,包含完整代码示例和性能优化建议,适合.NET开发者快速实现图像处理需求。

《C#图片处理示例(裁剪,缩放,清晰度,水印).doc》
将本文以doc文档格式下载到电脑,方便收藏和打印
推荐度:
点击下载文档