2

Я хочу использовать Powershell, чтобы отправить изображение в буфер обмена в ложе (например, http://stackoverflow.com/upload/image). Если я нахожусь в Mathematica, я могу получить изображение в буфер обмена, а затем использовать этот код отправить изображение в картинную кровать

URLRead[HTTPRequest["http://stackoverflow.com/upload/image", <|
   "Body" -> {"image" -> imageInClipboard}|>], "Body"]

Но этот метод имеет низкую эффективность. Поэтому я надеюсь сделать это только с помощью Powershell.

$img=Get-Clipboard -Format image
Invoke-RestMethod -Uri http://stackoverflow.com/upload/image -ContentType "image/png" -Body $img

Но это не работает ..И результат уценки, как ![](imagelink) ожидается.Анидодий может мне помочь?

2 ответа2

2

Я написал этот скрипт для вас:

$img = Get-Clipboard -Format Image
If (-not $img) {Throw 'No image on the clipboard'}
$ms = New-Object System.IO.MemoryStream
$img.Save($ms, [System.Drawing.Imaging.ImageFormat]::Png)
$ms.Position = 0
Add-Type -AssemblyName System.Net.Http
$httpClientHandler = New-Object System.Net.Http.HttpClientHandler
$httpClient = New-Object System.Net.Http.HttpClient $httpClientHandler
$contentDispositionHeaderValue = New-Object System.Net.Http.Headers.ContentDispositionHeaderValue "form-data"
$contentDispositionHeaderValue.Name = "file"
$contentDispositionHeaderValue.FileName = 'image.png'
$streamContent = New-Object System.Net.Http.StreamContent $ms
$streamContent.Headers.ContentDisposition = $contentDispositionHeaderValue
$streamContent.Headers.ContentType = New-Object System.Net.Http.Headers.MediaTypeHeaderValue 'image/png'
$content = New-Object System.Net.Http.MultipartFormDataContent
$content.Add($streamContent)
$response = $httpClient.PostAsync('https://stackoverflow.com/upload/image?https=true', $content).Result
$response.Content.ReadAsStringAsync().Result -match '"(.*)"' | Out-Null
"![]($($matches[1]))"

Сначала он преобразует изображение из буфера обмена в формат PNG. Затем используются некоторые классы веб-утилит .NET для правильной настройки структуры multipart/form-data - этот раздел адаптирован из сообщения в блоге Марио Майчицы. Как только это все решено, это делает запрос POST. Наконец, он использует регулярное выражение для анализа небольшого итогового HTML-документа, чтобы извлечь URL вновь загруженного изображения, которое он выводит на консоль. Если вы хотите скопировать фрагмент Markdown непосредственно в буфер обмена, нажмите на | scb до последней строки.

Чтобы запустить скрипт, сохраните его как файл .ps1 , например, seimage.ps1 . Если вы этого еще не сделали, следуйте инструкциям в разделе «Включение сценариев» вики-тега PowerShell . Затем вы можете открыть приглашение PowerShell в содержащей папке и выполнить его:

.\seimage.ps1
1

Я просто скомпилировал здесь код для чтения после некоторой подсказки от Бена Н

$img = Get-Clipboard -Format Image
If (-not $img) {
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$objNotifyIcon = New-Object System.Windows.Forms.NotifyIcon 
$objNotifyIcon.Icon = [System.Drawing.SystemIcons]::Warning
$objNotifyIcon.BalloonTipIcon = "Error" 
$objNotifyIcon.BalloonTipText = 'No image on the clipboard' 
$objNotifyIcon.BalloonTipTitle = "File Not Found"
$objNotifyIcon.Visible = $True 
$objNotifyIcon.ShowBalloonTip(10000)
}
Else{
    $ms = New-Object System.IO.MemoryStream
    $img.Save($ms, [System.Drawing.Imaging.ImageFormat]::Png)
    $ms.Position = 0
    Add-Type -AssemblyName System.Net.Http
    $httpClientHandler = New-Object System.Net.Http.HttpClientHandler
    $httpClient = New-Object System.Net.Http.HttpClient $httpClientHandler
    $contentDispositionHeaderValue = New-Object System.Net.Http.Headers.ContentDispositionHeaderValue "form-data"
    $contentDispositionHeaderValue.Name = "file"
    $contentDispositionHeaderValue.FileName = 'image.png'
    $streamContent = New-Object System.Net.Http.StreamContent $ms
    $streamContent.Headers.ContentDisposition = $contentDispositionHeaderValue
    $streamContent.Headers.ContentType = New-Object System.Net.Http.Headers.MediaTypeHeaderValue 'image/png'
    $content = New-Object System.Net.Http.MultipartFormDataContent
    $content.Add($streamContent)
    $response = $httpClient.PostAsync('https://stackoverflow.com/upload/image?https=true', $content).Result
    $response.Content.ReadAsStringAsync().Result -match '"(.*)"' | Out-Null
    if ($args -eq "linkonly"){
        Set-Clipboard $matches[1]   
        }
    else{
        Set-Clipboard "![]($($matches[1]))"
    }
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .