Windows 11 C#中TesseractOCR 5.3隐藏控制台输出及TIFF加白边框求助
解决方案:Tesseract OCR 5.3 隐藏Leptonica输出及多页TIFF添加白边框
一、隐藏Leptonica 1.8.3的控制台输出
你之前尝试的Console.SetOut(null)对原生Leptonica库的输出无效,因为它直接调用Win32控制台API,而非托管的Console类。以下两种方法可解决:
方法1:通过Tesseract变量禁用调试输出
初始化Tesseract引擎时,设置Leptonica的调试开关为关闭状态:
using var engine = new TesseractEngine(@"tessdata", "eng", EngineMode.Default); // 禁用Leptonica调试输出 engine.SetVariable("leptonica:debug", "0"); // 同时屏蔽Tesseract自身非必要输出 engine.SetVariable("debug_file", "NUL");
方法2:临时重定向Win32控制台输出
如果方法1无效,用Win32 API将标准输出/错误重定向到空设备:
using System.Runtime.InteropServices; [DllImport("kernel32.dll", SetLastError = true)] private static extern IntPtr GetStdHandle(int nStdHandle); [DllImport("kernel32.dll", SetLastError = true)] private static extern bool SetStdHandle(int nStdHandle, IntPtr hHandle); [DllImport("kernel32.dll", SetLastError = true)] private static extern IntPtr CreateFile(string lpFileName, uint dwDesiredAccess, uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile); private const int STD_OUTPUT_HANDLE = -11; private const int STD_ERROR_HANDLE = -12; private const uint GENERIC_WRITE = 0x40000000; private const uint FILE_SHARE_WRITE = 0x2; private const uint CREATE_ALWAYS = 2; private static IntPtr _originalStdOut; private static IntPtr _originalStdErr; public static void RedirectConsoleToNull() { _originalStdOut = GetStdHandle(STD_OUTPUT_HANDLE); _originalStdErr = GetStdHandle(STD_ERROR_HANDLE); IntPtr nullHandle = CreateFile("NUL", GENERIC_WRITE, FILE_SHARE_WRITE, IntPtr.Zero, CREATE_ALWAYS, 0, IntPtr.Zero); if (nullHandle != IntPtr.Zero) { SetStdHandle(STD_OUTPUT_HANDLE, nullHandle); SetStdHandle(STD_ERROR_HANDLE, nullHandle); } } public static void RestoreConsole() { SetStdHandle(STD_OUTPUT_HANDLE, _originalStdOut); SetStdHandle(STD_ERROR_HANDLE, _originalStdErr); }
使用方式:
RedirectConsoleToNull(); // 执行OCR处理逻辑 using var engine = new TesseractEngine(...); // ...图像识别操作... RestoreConsole();
二、为多页TIFF添加白边框
需要遍历TIFF每一页,添加边框后重新组合为多页文件,以下两种实现方式:
方法1:使用System.Drawing处理(需安装System.Drawing.Common包)
using System.Drawing; using System.Drawing.Imaging; public static void AddWhiteBorderToMultiPageTiff(string inputPath, string outputPath, int borderSize) { using (var inputImage = Image.FromFile(inputPath)) { int pageCount = inputImage.GetFrameCount(FrameDimension.Page); using (var outputImage = new Bitmap(inputImage.Width + 2 * borderSize, inputImage.Height + 2 * borderSize)) { using (var graphics = Graphics.FromImage(outputImage)) { graphics.Clear(Color.White); var encoderParams = new EncoderParameters(1); encoderParams.Param[0] = new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.MultiFrame); // 处理第一页 inputImage.SelectActiveFrame(FrameDimension.Page, 0); graphics.DrawImage(inputImage, borderSize, borderSize); outputImage.Save(outputPath, ImageFormat.Tiff, encoderParams); // 处理剩余页 encoderParams.Param[0] = new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.FrameDimensionPage); for (int i = 1; i < pageCount; i++) { inputImage.SelectActiveFrame(FrameDimension.Page, i); using (var pageBitmap = new Bitmap(inputImage.Width + 2 * borderSize, inputImage.Height + 2 * borderSize)) { using (var pageGraphics = Graphics.FromImage(pageBitmap)) { pageGraphics.Clear(Color.White); pageGraphics.DrawImage(inputImage, borderSize, borderSize); } outputImage.SaveAdd(pageBitmap, encoderParams); } } // 完成多页保存 encoderParams.Param[0] = new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.Flush); outputImage.SaveAdd(encoderParams); } } } }
调用示例:
AddWhiteBorderToMultiPageTiff(@"input.tiff", @"output_with_border.tiff", 10); // 10像素白边框
方法2:使用Leptonica原生API处理
直接依赖Leptonica库操作图像:
using Leptonica; public static Pix AddWhiteBorderToPix(Pix pix, int borderSize) { var borderPix = pix.CreatePix(pix.Width + 2 * borderSize, pix.Height + 2 * borderSize, pix.Depth); borderPix.Fill(Color.White); borderPix.DrawPix(pix, borderSize, borderSize); return borderPix; } public static void ProcessMultiPageTiffWithBorder(string inputPath, string outputPath, int borderSize) { var pixs = Pix.ReadMultipageTiff(inputPath); var processedPixs = new List<Pix>(); foreach (var pix in pixs) { var borderedPix = AddWhiteBorderToPix(pix, borderSize); processedPixs.Add(borderedPix); pix.Dispose(); } Pix.WriteMultipageTiff(outputPath, processedPixs.ToArray()); foreach (var pix in processedPixs) pix.Dispose(); }
内容的提问来源于stack exchange,提问作者HEENA DESAI
相关产品推荐
相关产品推荐

