8

I am trying to save image from clipboard to the file path. I have tried below script and it is returning "clipboard does not contain image data".

Add-Type -AssemblyName System.Windows.Forms
if ($([System.Windows.Forms.Clipboard]::ContainsImage())) {
    $image = [System.Windows.Forms.Clipboard]::GetImage()
    $filename='e:\test\test.png'         

    [System.Drawing.Bitmap]$image.Save($filename, [System.Drawing.Imaging.ImageFormat]::Png)
    Write-Output "clipboard content saved as $filename"
} else {
    Write-Output "clipboarsd does not contains image data"
}

As the Clipboard class can only be used in threads set to single thread apartment (STA) mode.

I have tried to run the script in

powershell -NoProfile -Sta -File $file

Also, I have tried to relaunch if runspace is not STA, this didn't help.

Add-Type -AssemblyName System.Windows.Forms
if ($host.Runspace.ApartmentState -ne "STA") {
    "Relaunching"
    $file = "./saveImage.ps1"
    powershell -NoProfile -Sta -File $file 
    return
}
Carson
  • 6,105
  • 2
  • 37
  • 45
Programator
  • 81
  • 1
  • 3

1 Answers1

8

In PowerShell 5.1 you can use Get-clipboard

 get-clipboard -format image
 $img = get-clipboard -format image
 $img.save("c:\temp\temp.jpg")

this should work too:

Add-Type -AssemblyName System.Windows.Forms
$clipboard = [System.Windows.Forms.Clipboard]::GetDataObject()
if ($clipboard.ContainsImage()) {
    $filename='c:\temp\test3.png'         
    [System.Drawing.Bitmap]$clipboard.getimage().Save($filename, [System.Drawing.Imaging.ImageFormat]::Png)
    Write-Output "clipboard content saved as $filename"
} else {
    Write-Output "clipboard does not contains image data"
}
Thom Schumacher
  • 1,469
  • 13
  • 24
  • the second snippet is not working, it throw an error, see: https://imgur.com/nPDy1Sx – Willis Aug 25 '19 at 16:01
  • 2
    Small optimization for the first snippet: > $img = Get-Clipboard -format image if(!$img) { Write-Host "No File in clipboard." return } $img.save("D:\Temp\temp.jpg") – pungggi Dec 05 '20 at 15:04
  • $img.save("c:\temp\temp.jpg") # It will not be a .jpg file. It will be .png in really. – Garric Aug 27 '23 at 13:15