????????C#處理非常大的圖像(如 32043x32043 像素)時,確實需要采取分塊化處理的方法來避免內存不足的問題。分塊化處理可以將大圖像分割成多個較小的塊,分別進行處理和保存,最后再合并這些塊以形成完整的圖像。以下是一個詳細的示例,展示如何在C#中使用 System.Drawing 和 Bitmap 類來實現這一目標。
-
步驟
????????定義塊大小:選擇合適的塊大小,確保每個塊可以在內存中處理。
????????創建和處理塊:遍歷整個圖像區域,逐塊創建、處理并保存每個塊。
????????合并塊:如果需要,可以將這些塊合并成一個完整的圖像文件。
-
示例代碼
????????以下是一個完整的示例代碼,展示了如何將大圖像分塊化處理:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;class Program
{static void Main(){int width = 32043;int height = 32043;int chunkSize = 8192; // 每個塊的大小,可以根據內存情況調整string outputFolder = "./chunks";string outputFile = "./output/large_image.png";// 創建輸出文件夾Directory.CreateDirectory(outputFolder);// 分塊處理圖像ProcessImageInChunks(width, height, chunkSize, outputFolder);// 合并塊(可選)MergeChunksIntoSingleImage(width, height, chunkSize, outputFolder, outputFile);}static void ProcessImageInChunks(int width, int height, int chunkSize, string outputFolder){for (int y = 0; y < height; y += chunkSize){for (int x = 0; x < width; x += chunkSize){int chunkWidth = Math.Min(chunkSize, width - x);int chunkHeight = Math.Min(chunkSize, height - y);using (Bitmap chunk = new Bitmap(chunkWidth, chunkHeight, PixelFormat.Format32bppArgb)){// 處理每個塊(例如,填充顏色)using (Graphics g = Graphics.FromImage(chunk)){g.Clear(Color.White); // 設置背景顏色// 可以在這里添加更多的圖像處理邏輯}// 保存塊到文件string chunkFileName = $"{outputFolder}/chunk_{x}_{y}.png";chunk.Save(chunkFileName, ImageFormat.Png);Console.WriteLine($"Saved chunk: {chunkFileName}");}}}}static void MergeChunksIntoSingleImage(int width, int height, int chunkSize, string inputFolder, string outputFile){using (Bitmap finalImage = new Bitmap(width, height, PixelFormat.Format32bppArgb)){for (int y = 0; y < height; y += chunkSize){for (int x = 0; x < width; x += chunkSize){int chunkWidth = Math.Min(chunkSize, width - x);int chunkHeight = Math.Min(chunkSize, height - y);string chunkFileName = $"{inputFolder}/chunk_{x}_{y}.png";using (Bitmap chunk = new Bitmap(chunkFileName)){using (Graphics g = Graphics.FromImage(finalImage)){g.DrawImage(chunk, new Rectangle(x, y, chunkWidth, chunkHeight));}}}}// 保存最終圖像finalImage.Save(outputFile, ImageFormat.Png);Console.WriteLine($"Merged image saved to {outputFile}");}}
}
解釋
- 定義參數:
????????width 和 height:圖像的總尺寸。
????????chunkSize:每個塊的大小,可以根據可用內存調整。
????????outputFolder:保存塊的文件夾。
????????outputFile:合并后的完整圖像文件路徑。
- 創建輸出文件夾:
????????使用 Directory.CreateDirectory(outputFolder) 創建保存塊的文件夾。
- 分塊處理圖像:
????????ProcessImageInChunks 方法遍歷整個圖像區域,逐塊創建、處理并保存每個塊。
????????每個塊的寬度和高度根據剩余的圖像尺寸計算。
????????使用 Graphics 對象處理每個塊(例如,填充顏色)。
????????將每個塊保存為單獨的 PNG 文件。
- 合并塊:
????????MergeChunksIntoSingleImage 方法遍歷所有塊,并將它們合并成一個完整的圖像。
????????使用 Graphics 對象將每個塊繪制到最終圖像上。
????????保存合并后的完整圖像。