PowerShell에서 화면의 임의의 위치에 대한 RGB 값 가져오기(컬러 선택기)

개요



PowerShell에서 마우스 커서 위치의 RGB 값을 얻는 스크립트를 만들었습니다 (컬러 피커, 스포이드 도구).

사용법


  • 스크립트를 시작합니다.
  • 스크린상의 RGB 치를 취득하고 싶은 부분에, 마우스 커서를 3 초 이내에 가져간다.
  • (스크립트를 시작한 후 3 초 후) 마우스 커서 위치의 RGB 값이 콘솔에 출력됩니다.

  • 옵션 기능


  • 픽한 색을 클립보드에 세트 할 수 있도록(듯이) 했다.
  • 스크립트의 마지막에 「C」키를 누르는 것으로, 이 기능이 동작한다.
  • 16x16 크기의 단색 이미지로 설정합니다.


  • 코드



    ColorPikcer.ps1
    Add-Type -AssemblyName System.Drawing, System.Windows.Forms
    
    # Bitmap と Graphics オブジェクトを用意しておく (1x1 ピクセル)
    $bitmap = New-Object System.Drawing.Bitmap(1, 1)
    $graphics = [System.Drawing.Graphics]::FromImage($bitmap)
    
    # 3 秒間の猶予を与える
    Write-Host "Move the cursor to the targt position in 3 seconds..."
    Start-Sleep 3
    
    # カーソルの位置 (X, Y 座標) を取得
    $dpiScaling = 1.0
    $positionX = [System.Windows.Forms.Cursor]::Position.X * $dpiScaling
    $positionY = [System.Windows.Forms.Cursor]::Position.Y * $dpiScaling
    
    # カーソルの位置のスクリーンの RGB 値を取得
    $graphics.CopyFromScreen($positionX, $positionY, 0, 0, $bitmap.Size)
    $pixel = $bitmap.GetPixel(0, 0)
    
    # RGB 値をコンソールに表示
    $decValue = "RGB({0}, {1}, {2})" -f $pixel.R, $pixel.G, $pixel.B
    $hexValue = "#{0:X2}{1:X2}{2:X2}" -f $pixel.R, $pixel.G, $pixel.B
    Write-Host "$decValue, $hexValue"
    
    # 「C」キー押下で、取得した色をクリップボードにセット
    Write-Host "Press 'C' to copy the color to the clipboard..." -NoNewLine
    if ([Console]::ReadKey().KeyChar -eq 'c')
    {
        $bitmap16x16 = New-Object System.Drawing.Bitmap(16, 16)
        $graphics16x16 = [System.Drawing.Graphics]::FromImage($bitmap16x16)
        $graphics16x16.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::NearestNeighbor
        $graphics16x16.DrawImage($bitmap, 0, 0, 16*2, 16*2)
        [Windows.Forms.Clipboard]::SetImage($bitmap16x16)
    }
    

    실행 결과




    Move the cursor to the targt position in 3 seconds...
    RGB(89, 187, 12), #59BB0C
    Press 'C' to copy the color to the clipboard...C
    

    클립보드에 설정된 이미지: ( #59BB0C )

    메모



  • 작동 상태:
  • 멀티 디스플레이 환경에서도 작동했습니다.

  • DPI 의 스케일링치를 100% 보다 큰 값으로 설정하고 있으면, [System.Windows.Forms.Cursor]::Position 의 위치가 어긋나 버린다.

  • 스크립트에서 변수 $dpiScaling의 값을 변경하여이 편차를 수정할 수 있습니다.

  • 예. 스케일링 값을 150%로 설정한 경우 다음과 같이 변경합니다.
    $dpiScaling = 1.5
    

  • WinAPI 로부터 이 스케일링치를 취득할 수도 있는 것 같다 (하지만, 귀찮을 것 같기 때문에 이번은 패스……).

  • "멀티 디스플레이 환경"과 "DPI의 스케일링 값이 디스플레이간에 다른 환경"이면 잘 작동하지 않습니다 (스케일링 값이 맞지 않는 디스플레이에서 오정렬이 발생합니다).


  • 단점:
  • 「마우스 오버로 동적으로 표시가 전환되는 부분」에서 「전환하기 전의 색」을 픽할 수 없다.


  • 기타:
  • (대량의 메모리량은 되지 않는다고는 생각 이번은 생략했지만,) Bitmap 나 Graphics 의 Dispose() 은 제대로 쓰는 편이 좋을지도 모른다.
  • Write-Host-BackgroundColor 옵션을 사용해, 색의 견본이 콘솔에 표시할 수 있으면 편리했지만, 이 옵션으로 지정할 수 있는 것은 "magenta" 이나 "yellow" 등의 고정 16 색 뿐이었다.

  • 좋은 웹페이지 즐겨찾기