Como enviar a imagem na área de transferência para a cama figura apenas por Powershell

2

Eu quero usar o Powershell para enviar a imagem na área de transferência para a cama de figuras (como http://stackoverflow.com/upload/image ). Se eu estiver no Mathematica , eu posso a imagem na área de transferência e, em seguida, use este código para enviar a imagem para a cama de imagens

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

Mas esse método é de baixa eficiência. Então, espero fazer isso apenas por Powershell .

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

Mas isso não funciona..e um resultado de markdown como ![](imagelink) é esperado.Qualquer coisa pode me ajudar?

    
por yode 17.07.2017 / 00:57

2 respostas

2

Eu escrevi este script para você:

$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]))"

Primeiro, ele converte a imagem na área de transferência para PNG. Em seguida, ele aproveita algumas classes de utilitário da Web do .NET para obter as multipart/form-data estrutura montada corretamente - esta seção é adaptada de Publicação do blog de Mario Majčica . Uma vez que tudo é finagled, faz o pedido POST. Finalmente, ele usa o regex para analisar o pequeno documento HTML resultante para extrair o URL da imagem recém-carregada, que é impressa no console. Se você quiser copiar o fragmento Markdown diretamente para a área de transferência, coloque | scb na última linha.

Para executar o script, salve-o como um arquivo .ps1 , por exemplo %código%. Se ainda não o fez, siga as instruções na seção Habilitando Scripts do wiki de tags do PowerShell . Em seguida, você pode abrir um prompt do PowerShell na pasta que o contém e executá-lo:

.\seimage.ps1
    
por 20.09.2017 / 22:12
1

Eu apenas compilo o código aqui para leitura depois de um pouco de orientação de Ben N

$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]))"
    }
}
    
por 21.09.2017 / 08:05