Powershell Pass Memory Stream Image непосредственно для Tesseract OCR (Windows) [закрыто]C#

Место общения программистов C#
Гость
Powershell Pass Memory Stream Image непосредственно для Tesseract OCR (Windows) [закрыто]

Сообщение Гость »


Проблема:

У меня есть рабочее решение, которое использует C# PrintWindow() для захвата окна игры и помещения изображения в поток памяти. Затем я хочу взять тот же образ потока памяти и передать его непосредственно в Tesseract без необходимости иметь физический путь к образу на машине. Созданная мною утилита берет текст/значения с игрового экрана и добавляет их в «счетчик», чтобы пользователи могли его видеть.

Я нашел следующие ссылки ниже, но не знаю, как их полностью реализовать в PowerShell.

Как передать файловый поток в Tesseract

Как передать изображение в Tesseract из памяти

https://github.com/jourdant/powershell- ... ctlib.psm1

Цель:
[*]Чтение изображения потока памяти PrintWindow() непосредственно в вызове Tesseract OCR (без пути к изображению) [*]Все зависимости должны находиться в папке моей программы по соображениям переносимости (без системных каталогов) [*]Любое решение в PowerShell, поскольку это мой основной язык программирования.
Текущий код:
# Загружает метод PrintWindow() $PrintWindowCode = @' использование системы; использование System.IO; использование System.Runtime.InteropServices; использование System.Drawing; использование System.Drawing.Imaging; открытый класс ScreenCapture { [DllImport("user32.dll")] public static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect); [DllImport("user32.dll")] public static extern bool PrintWindow(IntPtr hWnd, IntPtr hdcBlt, int nFlags); общедоступный MemoryStream PrintWindow (IntPtr hwnd) { интервал PW_CLIENTONLY = 0x1; интервал PW_RENDERFULLCONTENT = 0x2; ПРЯМОЙ rc; GetWindowRect (hwnd, out rc); используя (Растровое изображение bmp = новое растровое изображение(rc.Width, rc.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)) { используя (Графика gfxBmp = Graphics.FromImage(bmp)) { IntPtr hdcBitmap = gfxBmp.GetHdc(); пытаться { PrintWindow(hwnd, hdcBitmap, PW_CLIENTONLY | PW_RENDERFULLCONTENT); } окончательно { gfxBmp.ReleaseHdc(hdcBitmap); } } MemoryStream мс = новый MemoryStream(); bmp.Save(ms, ImageFormat.Png); вернуть мс; } } [StructLayout(LayoutKind.Sequential)] общественная структура RECT { частный int _Left; частный int _Top; частный ИНТ _Right; частный int _Bottom; public RECT(RECT Rectangle): this(Rectangle.Left, Rectangle.Top, Rectangle.Right, Rectangle.Bottom) { } public RECT(int Left, int Top, int Right, int Bottom) { _Left = Левый; _Верх = Верх; _Право = Право; _Низ = Низ; } общественный интервал X { получить {вернуться _Left; } установить { _Left = значение; } } общественный интервал Y { получить {вернуться _Top; } установить { _Top = значение; } } общественный интервал слева { получить {вернуться _Left; } установить { _Left = значение; } } public int Топ { получить {вернуться _Top; } установить { _Top = значение; } } public int Right { получить {вернуться _Right; } установить { _Right = значение; } } public int внизу { получить {вернуться _Bottom; } установить { _Bottom = значение; } } общественный int Высота { получить {возврат _Bottom - _Top; } set { _Bottom = значение + _Top; } } общественная ширина int { получить {возврат _Right - _Left; } установить { _Right = значение + _Left; } } Местоположение общедоступной точки { get { return new Point(Left, Top); } набор { _Left = значение.X; _Top = значение.Y; } } общедоступный размер Размер { получить {вернуть новый размер (ширина, высота); } набор { _Right = значение.Ширина + _Left; _Bottom = значение.Высота + _Top; } } публичный статический неявный оператор Rectangle(RECT Rectangle) { вернуть новый Rectangle(Rectangle.Left, Rectangle.Top, Rectangle.Width, Rectangle.Height); } публичный статический неявный оператор RECT(Rectangle Rectangle) { вернуть новый RECT(Rectangle.Left, Rectangle.Top, Rectangle.Right, Rectangle.Bottom); } публичный статический логический оператор ==(RECT Rectangle1, RECT Rectangle2) { вернуть Rectangle1.Equals(Rectangle2); } общедоступный статический логический оператор !=(RECT Rectangle1, RECT Rectangle2) { return !Rectangle1.Equals(Rectangle2); } общедоступная строка переопределения ToString() { return "{Слева: " + _Left + "; " + "Сверху: " + _Top + "; Справа: " + _Right + "; Снизу: " + _Bottom + "}"; } публичное переопределение int GetHashCode() { вернуть ToString().GetHashCode(); } public bool Equals (прямоугольник RECT) { return Rectangle.Left == _Left && Rectangle.Top == _Top && Rectangle.Right == _Right && Rectangle.Bottom == _Bottom; } публичное переопределение bool Equals (объект Object) { if (Объект — RECT) { вернуть Equals((RECT)Object); } else if (Объект — прямоугольник) { return Equals(new RECT((Rectangle)Object)); } вернуть ложь; } } } '@ # Загружает/добавляет пользовательский тип надстройки (с правильными сборками) + Создает объект для функции (ScreenShotAC.ScreenCapture) Тип добавления $PrintWindowCode -ReferencedAssemblies 'System.Windows.Forms','System.Drawing'; $ScreenCapture = ScreenCapture нового объекта # Установите дескриптор имени класса PokeMMO в переменную $hwnd = [Game]::FindWindow('GLFW30', [IntPtr]::Zero) # Захватывает поток памяти и превращает его в растровое изображение $PrintWindowStreamBitmap = [System.Drawing.Image]::FromStream($ScreenCapture.PrintWindow($hwnd)) # У меня есть возможность выводить изображение, если это необходимо #$PrintWindowStreamBitmap.Save(".\Desktop\test.png") # Устанавливает каталог рабочего счетчика в Tesseract Set-Location "C:\Program Files (x86)\\Tesseract-OCR-5.3.2x64\bin" # Запускает Tesseract OCR (надеюсь, на изображении из потока памяти) ./tesseract.exe $PrintWindowStreamBitmap stdout -l eng

Вернуться в «C#»