powershell - 如何将此值获取到变量中以供以后操作?
问题描述
我在网上找到了这段代码,一切正常,但我不知道如何获取执行中给出的输出值,这个脚本用于获取图像的文本,它确实给了我文本,但显示了类似这样的“文本图像的...”,我不知道是图像中的所有文字还是缺少某些东西
我试过 |Out-file “文件路径”,但它显示的文本与上面提到的相同:/
谢谢您的帮助!
using namespace Windows.Storage
using namespace Windows.Graphics.Imaging
<#
.Synopsis
Runs Windows 10 OCR on an image.
.DESCRIPTION
Takes a path to an image file, with some text on it.
Runs Windows 10 OCR against the image.
Returns an [OcrResult], hopefully with a .Text property containing the text
.EXAMPLE
$result = .\Get-Win10OcrTextFromImage.ps1 -Path 'c:\test.bmp'
$result.Text
#>
[CmdletBinding()]
Param
(
# Path to an image file
[Parameter(Mandatory=$true,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true,
Position=0,
HelpMessage='Path to an image file, to run OCR on')]
[ValidateNotNullOrEmpty()]
$Path
)
Begin {
# Add the WinRT assembly, and load the appropriate WinRT types
Add-Type -AssemblyName System.Runtime.WindowsRuntime
$null = [Windows.Storage.StorageFile, Windows.Storage, ContentType = WindowsRuntime]
$null = [Windows.Media.Ocr.OcrEngine, Windows.Foundation, ContentType = WindowsRuntime]
$null = [Windows.Foundation.IAsyncOperation`1, Windows.Foundation, ContentType = WindowsRuntime]
$null = [Windows.Graphics.Imaging.SoftwareBitmap, Windows.Foundation, ContentType = WindowsRuntime]
$null = [Windows.Storage.Streams.RandomAccessStream, Windows.Storage.Streams, ContentType = WindowsRuntime]
# [Windows.Media.Ocr.OcrEngine]::AvailableRecognizerLanguages
$ocrEngine = [Windows.Media.Ocr.OcrEngine]::TryCreateFromUserProfileLanguages()
# PowerShell doesn't have built-in support for Async operations,
# but all the WinRT methods are Async.
# This function wraps a way to call those methods, and wait for their results.
$getAwaiterBaseMethod = [WindowsRuntimeSystemExtensions].GetMember('GetAwaiter').
Where({
$PSItem.GetParameters()[0].ParameterType.Name -eq 'IAsyncOperation`1'
}, 'First')[0]
Function Await {
param($AsyncTask, $ResultType)
$getAwaiterBaseMethod.
MakeGenericMethod($ResultType).
Invoke($null, @($AsyncTask)).
GetResult()
}
}
Process
{
foreach ($p in $Path)
{
# From MSDN, the necessary steps to load an image are:
# Call the OpenAsync method of the StorageFile object to get a random access stream containing the image data.
# Call the static method BitmapDecoder.CreateAsync to get an instance of the BitmapDecoder class for the specified stream.
# Call GetSoftwareBitmapAsync to get a SoftwareBitmap object containing the image.
#
# https://docs.microsoft.com/en-us/windows/uwp/audio-video-camera/imaging#save-a-softwarebitmap-to-a-file-with-bitmapencoder
# .Net method needs a full path, or at least might not have the same relative path root as PowerShell
$p = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($p)
$params = @{
AsyncTask = [StorageFile]::GetFileFromPathAsync($p)
ResultType = [StorageFile]
}
$storageFile = Await @params
$params = @{
AsyncTask = $storageFile.OpenAsync([FileAccessMode]::Read)
ResultType = [Streams.IRandomAccessStream]
}
$fileStream = Await @params
$params = @{
AsyncTask = [BitmapDecoder]::CreateAsync($fileStream)
ResultType = [BitmapDecoder]
}
$bitmapDecoder = Await @params
$params = @{
AsyncTask = $bitmapDecoder.GetSoftwareBitmapAsync()
ResultType = [SoftwareBitmap]
}
$softwareBitmap = Await @params
# Run the OCR
Await $ocrEngine.RecognizeAsync($softwareBitmap) ([Windows.Media.Ocr.OcrResult])
}
}
解决方案
更改此行
Await $ocrEngine.RecognizeAsync($softwareBitmap) ([Windows.Media.Ocr.OcrResult])
至
$result = Await $ocrEngine.RecognizeAsync($softwareBitmap) ([Windows.Media.Ocr.OcrResult])
[PSCustomObject]@{
File = $Path
Lines = $result.lines.text
Words = $result.lines.words.text
Text = $result | select -ExpandProperty text
}
你最终会得到一个对象,其成员包含文件名、所有文本、所有行和所有单词
推荐阅读
- c# - 在c#中将Rtsp数据包转换为位图
- linux - 如何在vesta cpanel上安装laravel
- javascript - 在导航点击时限制页面滚动区域
- image-processing - 机器学习框架 caffe 是否支持不同的数据类型精度?
- chef-infra - 在 Ohai 插件中访问 Chef 客户端/节点名称
- amazon-web-services - 不使用特定标签 KeyValue 时,明确拒绝用户在 AWS 中运行实例
- python - Appengine:“URLFetch 在此环境中不可用。”
- java - 在多个线程中调用多个 rest/soap 服务并等待它们的响应
- angular - 如何在for循环中显示数组的长度?
- module - 未找到带有 Saas 模块的 Angular 6:错误