超過2GB的大型TIFF文件載入失敗

This article was translated from English: Does it need improvement?
Translated
View the article in English

IronOCR透過其內部AnyBitmap型別將影像輸入載入到單一的記憶體緩衝區中。 該緩衝區由32位整數索引,因此無論有多少系統記憶體都會限制在大約2GB。 大於2GB的TIFF超過此限制而無法載入。

Loaded pages: 0

AnyBitmap,並將整個影像材質化到一個緩衝區中。 由於該緩衝區由int索引,因此無論記憶體多麼充裕,都有效地限制在約2 GB,因此稍微超出限制的TIFF不能被持有且載入失敗。 這是一個運行時約束,而不是操作系統特有的,因此它對每個.NET平台都同樣影響。

警告LoadImage(filePath)當前返回零頁數而不是拋出明確的例外。 這種無聲失敗是一個已知問題; 計劃提供更清晰的異常。 單一緩衝區設計是一個架構限制,目前尚不支持本地每頁TIFF流。)]

解決方案

解決方法是將TIFF分割成小於2 GB的塊,並將每個塊作為位元組陣列傳遞給IronOCR,而不是文件路徑。

1. 新增Magick.NET

使用Magick.NET在將TIFF交給IronOCR之前進行分割。 選擇與您的專案匹配的變體(Q8/Q16,AnyCPU/x64)。

dotnet add package Magick.NET-Q16-AnyCPU
dotnet add package Magick.NET-Q16-AnyCPU
SHELL

2. 分割TIFF並載入每個塊

將TIFF打開為MagickImageCollection,分解為每個保持在2 GB以下的頁面數塊,將每個塊轉換為位元組陣列,並使用OcrInput.LoadImage(byte[])載入它。

var inputPath = "input.tiff";
var pagesPerChunk = 100;
using var allPages = new MagickImageCollection(inputPath);
int chunkNumber = 1;
for (int i = 0; i < allPages.Count; i += pagesPerChunk)
{
    using var chunk = new MagickImageCollection();
    for (int j = i; j < Math.Min(i + pagesPerChunk, allPages.Count); j++)
    {
        chunk.Add(allPages[j].Clone());
    }
    foreach (var image in chunk)
    {
        image.SetCompression(CompressionMethod.LZW);
    }
    var chunkBytes = chunk.ToByteArray();
    using (var ocrInput = new OcrInput())
    {
        ocrInput.LoadImage(chunkBytes);
        var pages = ocrInput.GetPages().ToList();
        Console.WriteLine($"Loaded pages: {pages.Count}");
        var result = new IronTesseract().Read(ocrInput);
        Console.WriteLine("OCR Text Length: " + (result.Text?.Length ?? 0));
    }
    Console.WriteLine($"Chunk {chunkNumber} processed");
    chunkNumber++;
}
var inputPath = "input.tiff";
var pagesPerChunk = 100;
using var allPages = new MagickImageCollection(inputPath);
int chunkNumber = 1;
for (int i = 0; i < allPages.Count; i += pagesPerChunk)
{
    using var chunk = new MagickImageCollection();
    for (int j = i; j < Math.Min(i + pagesPerChunk, allPages.Count); j++)
    {
        chunk.Add(allPages[j].Clone());
    }
    foreach (var image in chunk)
    {
        image.SetCompression(CompressionMethod.LZW);
    }
    var chunkBytes = chunk.ToByteArray();
    using (var ocrInput = new OcrInput())
    {
        ocrInput.LoadImage(chunkBytes);
        var pages = ocrInput.GetPages().ToList();
        Console.WriteLine($"Loaded pages: {pages.Count}");
        var result = new IronTesseract().Read(ocrInput);
        Console.WriteLine("OCR Text Length: " + (result.Text?.Length ?? 0));
    }
    Console.WriteLine($"Chunk {chunkNumber} processed");
    chunkNumber++;
}
Imports System
Imports System.Linq
Imports ImageMagick

Dim inputPath As String = "input.tiff"
Dim pagesPerChunk As Integer = 100
Using allPages As New MagickImageCollection(inputPath)
    Dim chunkNumber As Integer = 1
    For i As Integer = 0 To allPages.Count - 1 Step pagesPerChunk
        Using chunk As New MagickImageCollection()
            For j As Integer = i To Math.Min(i + pagesPerChunk, allPages.Count) - 1
                chunk.Add(allPages(j).Clone())
            Next
            For Each image In chunk
                image.SetCompression(CompressionMethod.LZW)
            Next
            Dim chunkBytes = chunk.ToByteArray()
            Using ocrInput As New OcrInput()
                ocrInput.LoadImage(chunkBytes)
                Dim pages = ocrInput.GetPages().ToList()
                Console.WriteLine($"Loaded pages: {pages.Count}")
                Dim result = New IronTesseract().Read(ocrInput)
                Console.WriteLine("OCR Text Length: " & If(result.Text?.Length, 0))
            End Using
        End Using
        Console.WriteLine($"Chunk {chunkNumber} processed")
        chunkNumber += 1
    Next
End Using
$vbLabelText   $csharpLabel

每個塊都作為原始位元組通過LoadImage(chunkBytes),保持每個緩衝區低於2 GB上限。 SetCompression(CompressionMethod.LZW)在轉換為位元組陣列之前縮小每個塊。

3. 調整塊大小

調整pagesPerChunk以適合您的資料。 如果某塊接近2 GB或記憶體緊張,請降低它; 對於較小的頁面提高它以減少開銷。

4. 部署中考慮Magick.NET

Magick.NET隨附ImageMagick本地二進位檔。 部署時,請考慮增加的包大小和本機依賴性佔用空間。

Curtis Chau
技術作家

Curtis Chau擁有Carleton大學的電腦科學學士學位,專精於前端開發,擁有Node.js、TypeScript、JavaScript和React的專業知識。Curtis熱衷於建立直觀且美觀的使用者介面,喜愛使用現代框架並建立結構良好、視覺吸引力的手冊。

除了開發,Curtis對物聯網(IoT)有濃厚的興趣,探索創新的方法來整合硬體和軟體。在空閒時間,他喜歡玩遊戲和建立Discord機器人,結合他對技術的熱愛與創造力。

準備開始了嗎?
Nuget 下載 6,136,090 | 版本: 2026.7 剛剛發布
Still Scrolling Icon

還在滾動?

想要快速證明? PM > Install-Package IronOcr
執行範例 觀看您的圖像轉變為可搜尋文字。