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包。
分块高度可根据实际需求调整,以适应打印或显示需求。
通过以上方法,可将长图按指定高度分块保存为多个图像文件,便于后续处理或打印





