当前位置:编程学习 > C#/ASP.NET >>

c# 长图大图分块处理

在C#中进行长图分块处理,可以使用System.Drawing或ImageSharp等库来实现。以下是两种常见的方法及示例代码:

方法一:使用System.Drawing库
csharp
using System.Drawing;
using System.Drawing.Imaging;

public class ImageSplitter
{
    public static void SplitImage(string inputPath, string outputFolder, int chunkHeight)
    {
        // 加载原始图像
        using (Bitmap bitmap = new Bitmap(inputPath))
        {
            int imageWidth = bitmap.Width;
            int imageHeight = bitmap.Height;
            int chunksCount = (int)Math.Ceiling((double)imageHeight / chunkHeight);

            for (int i = 0; i < chunksCount; i++)
            {
                int startY = i * chunkHeight;
                int endY = Math.Min(startY + chunkHeight, imageHeight);
                int chunkHeightActual = endY - startY;

                // 创建新的位图来保存分块图像
                using (Bitmap chunk = new Bitmap(imageWidth, chunkHeightActual))
                {
                    using (Graphics g = Graphics.FromImage(chunk))
                    {
                        // 将原始图像的对应区域绘制到分块图像中
                        g.DrawImage(bitmap, new Rectangle(0, 0, imageWidth, chunkHeightActual),
                                   new Rectangle(0, startY, imageWidth, chunkHeightActual),
                                   GraphicsUnit.Pixel);
                    }

                    // 保存分块图像
                    string outputPath = $"{outputFolder}/chunk_{i + 1}.png";
                    chunk.Save(outputPath, ImageFormat.Png);
                }
            }
        }
    }
}
方法二:使用ImageSharp库(跨平台、高性能)
csharp
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing;

public class ImageSplitterImageSharp
{
    public static void SplitImage(string inputPath, string outputFolder, int chunkHeight)
    {
        // 加载原始图像
        using (Image<Rgba32> image = Image.Load<Rgba32>(inputPath))
        {
            int imageWidth = image.Width;
            int imageHeight = image.Height;
            int chunksCount = (int)Math.Ceiling((double)imageHeight / chunkHeight);

            for (int i = 0; i < chunksCount; i++)
            {
                int startY = i * chunkHeight;
                int endY = Math.Min(startY + chunkHeight, imageHeight);
                int chunkHeightActual = endY - startY;

                // 裁剪分块图像
                Image<Rgba32> chunk = image.Clone(x => x.Crop(new Rectangle(0, startY, imageWidth, chunkHeightActual)));

                // 保存分块图像
                string outputPath = $"{outputFolder}/chunkImageSharp_{i + 1}.png";
                chunk.Save(outputPath);
            }
        }
    }

}


使用示例
csharp
class Program
{
    static void Main()
    {
        string inputImagePath = "upload/yizuotu.jpg";
        string outputFolder = "output";
        int chunkHeight = 1000; // 每个分块的高度

        // 确保输出文件夹存在
        if (!Directory.Exists(outputFolder))
        {
            Directory.CreateDirectory(outputFolder);
        }

        // 使用System.Drawing库进行分块
        ImageSplitter.SplitImage(inputImagePath, outputFolder, chunkHeight);

        // 使用ImageSharp库进行分块
        // ImageSplitterImageSharp.SplitImage(inputImagePath, outputFolder, chunkHeight);
    }
}
说明
参数说明:

inputPath:原始长图的路径。
outputFolder:保存分块图像的文件夹路径。
chunkHeight:每个分块图像的高度(可根据需求调整)。
注意事项:

若使用System.Drawing,需确保目标平台支持GDI+(如Windows)。
若使用ImageSharp,需通过NuGet安装SixLabors.ImageSharp包。
分块高度可根据实际需求调整,以适应打印或显示需求。
通过以上方法,可将长图按指定高度分块保存为多个图像文件,便于后续处理或打印
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,