2 GB Üzerindeki Büyük TIFF Dosyaları Yüklenemiyor

Curtis Chau
Curtis Chau
Updated: 29 Haziran 2026

IronOCR, resim girdisini kendi içindeki AnyBitmap türü aracılığıyla tek bir hafıza içi arabelleğe yükler. Bu tampon 32-bit bir tamsayı ile indekslenir, bu nedenle sistem belleğinizde ne kadar olduğundan bağımsız olarak, yaklaşık 2 GB ile sınırlandırılır. 2 GB'den büyük bir TIFF bu sınırı aşar ve yüklenemez.

Loaded pages: 0
Text

OcrInput.LoadImage(filePath) dahili olarak bir AnyBitmap oluşturur ve tüm resmi tek bir arabelleğe materyalize eder. Bu arabelleğin int ile indekslenmesi nedeniyle, kullanılan bellek ne kadar serbest olursa olsun yaklaşık 2 GB ile sınırlıdır, bu yüzden limitin biraz üzerindeki bir TIFF tutulamaz ve yükleme başarısız olur. Bu bir çalışma zamanı kısıtlamasıdır, işletim sistemine özgü değildir, bu yüzden her .NET platformunu eşit şekilde etkiler.

Uyarı: LoadImage(filePath), açık bir istisna atmak yerine şu anda sıfır yüklü sayfa döndürmektedir. Bu sessiz başarısızlık bilinen bir sorundur; daha net bir istisna planlanıyor. Tek tampon tasarımı mimari bir sınırdır ve yerel her sayfa için TIFF akışı henüz mevcut değildir.

Çözüm

Çözüm, TIFF'i 2 GB'ın altında parçalara bölmek ve her parçayı dosya yolu yerine bir bayt dizisi olarak IronOCR'ye iletmektir.

1. Magick.NET Ekleyin

Magick.NET'i kullanarak TIFF'i IronOCR'ye iletmeden önce bölün. Projenizle eşleşen varyantı seçin (Q8/Q16, AnyCPU/x64).

dotnet add package Magick.NET-Q16-AnyCPU
SHELL

2. TIFF'i Bölün ve Her Parçayı Yükleyin

TIFF'i MagickImageCollection olarak açın, 2 GB altında kalan sayfa sayısı parçalarına ayırın, her parçayı byte dizisine dönüştürün ve OcrInput.LoadImage(byte[]) ile yükleyin.

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++;
}

Her parça, her bir arabelleği 2 GB tavanın altında tutarak LoadImage(chunkBytes) içinden ham byte olarak geçer. SetCompression(CompressionMethod.LZW), bir byte dizisine dönüştürülmeden önce her parçayı küçültür.

3. Parça Boyutunu Ayarlayın

Verileriniz için pagesPerChunk ayarlayın. Bir parça 2 GB'a yaklaşıyorsa veya bellek dar ise düşürün; küçük sayfalar için yükü azaltmak üzere artırın.

4. Dağıtımda Magick.NET'i Hesaba Katın

Magick.NET, ImageMagick yerlisi ikili dosyalarını taşır. Dağıttığınızda ek paket boyutu ve doğal bağımlılık ayak izini hesaba katın.

Curtis Chau, Bilgisayar Bilimleri alanında Lisans Derecesine (Carleton Üniversitesi) sahip ve Node.js, TypeScript, JavaScript ve React konularında uzmanlaşmış ön uç geliştirmeyle ilgileniyor. Sezgisel ve estetik açıdan hoş kullanıcı arayüzleri oluşturma tutkunu, Curtis modern çerçevelerle çalışmayı ve iyi yapılandırılmış, görsel olarak çekici kılavuzlar oluşturmayı seviyor.

Daha Fazla Oku

Başlamaya Hazır mısınız?

Nuget Downloads 6,357,159Sürüm:2026.11yeni yayınlandı