AHKで画面の領域からピクセルデータを(はるかに)速く取得するにはどうすればよいですか?

user5536767

いくつかのことについてはC ++で書く方が良いことを理解していますが、AHKでこれを実行できるようにしたいと思っています。

画面の100x300の領域からピクセルデータを取得できるようにしたいのですが、PixelGetColor遅すぎます。これは、ピクセルあたり約0.02秒かかることを示すテストです。これは、1920 x1080の画面全体からピクセルデータを取得するのに約11.5時間かかります。

テストでは、画面の15 x 15の領域からピクセルデータを取得するだけで、4〜5秒かかります。

width := 15 ; 1920
height := 15 ; 1080
searchResolution := 1 ; 3
columns := width / searchResolution
rows := height / searchResolution
resultRows := {}
columnCounter := 0
rowCounter := 0
resultCounter := 0

start := getTimestamp()
loop, %columns%
{
    resultRows[columnCounter] := {}
    loop, %rows%
    {
        PixelGetColor, pixelColor, columnCounter, rowCounter
        resultRows[columnCounter][rowCounter] := pixelColor
        rowCounter += searchResolution
        resultCounter += 1
    }
    columnCounter += searchResolution
    rowCounter := 0
}
end := getTimestamp()

MsgBox % "Finished! It took " . (end - start) / 1000 . 
" seconds to record pixel data from a " . 
width . " x " . height . " area of the screen (" . resultCounter . " pixels)."

getTimestamp()
{
    DllCall("QueryPerformanceCounter", "Int64*", timestamp)
    DllCall("QueryPerformanceFrequency", "Int64*", frequency)
    return Round(timestamp * 1000 / frequency)
}

デバッグログと検査のためのXMLファイルへのデータのエクスポートを含むバージョンが必要な場合は、ここにあります

画面の一部からピクセルデータを取得するより速い方法はありますか?

PixelSearch画面の非常に広い領域を非常にすばやく検索しますが、なぜPixelGetColorこれほど遅いのかわかりませんこれ.dllよりもはるかに高速に画面の小さな領域からピクセルデータを取得するために使用できる関数がいくつかあるはずです。

user5536767

Forivinのソリューションより103倍速くそれを行う方法を見つけました:D

SetBatchLines, -1
CoordMode, Pixel, screen

FileDelete, Log.txt

searchSpace := 400
jumpSize := 1 ; how many units to skip each interval
total := Round(((searchSpace * searchSpace) / jumpSize), 0)
startTimer := getTimestamp()
getPixelMapSlow(searchSpace, jumpSize)
endTimer := getTimestamp()
duration := endTimer - startTimer
rate := total / duration
FileAppend, % "[getPixelMapSlow] Retrieved " . total . " pixels from bitmap, duration: " . duration . "ms at at a rate of " . rate . " pixels/ms.`n", Log.txt

searchSpace := 400
jumpSize := 1 ; how many units to skip each interval
total := Round(((searchSpace * searchSpace) / jumpSize), 0)
startTimer := getTimestamp()
getPixelMapFast(searchSpace, jumpSize)
endTimer := getTimestamp()
duration := endTimer - startTimer
rate := total / duration
FileAppend, % "[getPixelMapFast] Retrieved " . total . " pixels from bitmap, duration: " . duration . "ms at at a rate of " . rate . " pixels/ms.`n", Log.txt


getPixelMapFast(searchSpace, jumpSize){
    width := 1920
    height := 1080
    centerX := width / 2
    centerY := height / 2
    searchSpacehalf := searchSpace / 2
    searchCounterX := 0
    searchCounterY := 0
    pixelMap := {}
    pBitmap := Gdip_BitmapFromScreen((centerX - searchSpacehalf) . "|" . (centerY - searchSpacehalf) . "|" . searchSpace . "|" . searchSpace)
    E1 := Gdip_LockBits(pBitmap, 0, 0, Gdip_GetImageWidth(pBitmap), Gdip_GetImageHeight(pBitmap), Stride, Scan0, BitmapData)
    Loop, %searchSpace%
    {
        tick := A_Index * jumpSize
        if (tick < searchSpace) {
            New_Index_X := tick
            Loop, %searchSpace%
            {
                tick := A_Index * jumpSize
                if (tick < searchSpace) {
                    New_Index_Y := tick
                    color1ARGB := Gdip_GetLockBitPixel(Scan0, New_Index_X, New_Index_Y, Stride)
                    SetFormat, Integer, H
                    color1RGB := 0x00ffffff & color1ARGB
                    SetFormat, Integer, D
                    if (!pixelMap[New_Index_X]){
                        pixelMap[New_Index_X] := {}
                    }
                    pixelMap[New_Index_X][New_Index_Y] := color1RGB
                }
            }
        }
    }
    Gdip_UnlockBits(pBitmap, BitmapData)
    Gdip_DisposeImage(pBitmap)
    return pixelMap
}

getPixelMapSlow(searchSpace, jumpSize){
    width := 1920
    height := 1080
    centerX := width / 2
    centerY := height / 2
    searchSpacehalf := searchSpace / 2
    searchCounterX := 0
    searchCounterY := 0
    pixelMap := {}
    pBitmap := Gdip_BitmapFromScreen((centerX - searchSpacehalf) . "|" . (centerY - searchSpacehalf) . "|" . searchSpace . "|" . searchSpace)
    Loop, %searchSpace%
    {
        tick := A_Index * jumpSize
        if (tick < searchSpace) {
            New_Index_X := tick
            Loop, %searchSpace%
            {
                tick := A_Index * jumpSize
                if (tick < searchSpace) {
                    New_Index_Y := tick
                    color1ARGB := Gdip_GetPixel(pBitmap, New_Index_X, New_Index_Y)
                    if (!pixelMap[New_Index_X]){
                        pixelMap[New_Index_X] := {}
                    }
                    color1RGB := ARGBtoRGB(color1ARGB)
                    pixelMap[New_Index_X][New_Index_Y] := color1RGB
                }
            }
        }
    }
    Gdip_DisposeImage(pBitmap)
    return pixelMap
}

ARGBtoRGB( ARGB ) {
    VarSetCapacity( RGB,6,0 )
    DllCall( "msvcrt.dll\sprintf", Str,RGB, Str,"%06X", UInt,ARGB<<8 )
    Return "0x" RGB
}

getTimestamp()
{
    DllCall("QueryPerformanceCounter", "Int64*", timestamp)
    DllCall("QueryPerformanceFrequency", "Int64*", frequency)
    return Round(timestamp * 1000 / frequency)
}

もちろん、これが機能するように、コードにAHK Gdipライブラリ(Githubにあります)の関連関数を含めます。

ログ:

[getPixelMapSlow] Retrieved 160000 pixels from bitmap, duration: 33161ms at at a rate of 4.824945 pixels/ms.
[getPixelMapFast] Retrieved 160000 pixels from bitmap, duration: 321ms at at a rate of 498.442368 pixels/ms.

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

.PNGからピクセルデータを取得するにはどうすればよいですか?

分類Dev

VBA:フィルタリングされたデータから現在の領域を取得するにはどうすればよいですか?

分類Dev

ピクセルのクラスターの周りに閉じた領域を作成するにはどうすればよいですか?

分類Dev

2つのベクトル間でデータをより速くコピーするにはどうすればよいですか?

分類Dev

ADBを介して画面ピクセルの色を取得するにはどうすればよいですか?

分類Dev

UITableViewの最初のセルからデータを取得するにはどうすればよいですか?

分類Dev

HTML Canvasでピクセルパーフェクトなクリッピング領域を作成するにはどうすればよいですか?

分類Dev

RのgeoTIFFからピクセルの値を取得するにはどうすればよいですか?

分類Dev

ステージング領域からではなく、作業ディレクトリからすべてのファイルをリセットするにはどうすればよいですか?

分類Dev

分類されたデータフレームのスタック領域プロットを取得するにはどうすればよいですか?

分類Dev

画像からピクセルの色を取得するにはどうすればよいですか?

分類Dev

Windowsコンピューターの領域にプログラムでアクセスするにはどうすればよいですか?

分類Dev

Windowsコンピューターの領域にプログラムでアクセスするにはどうすればよいですか?

分類Dev

UIImage(Cocoa Touch)またはCGImage(Core Graphics)からピクセルデータを取得するにはどうすればよいですか?

分類Dev

所有していないキャンバスからピクセルデータを取得するにはどうすればよいですか?

分類Dev

コントロールの配列から最小限の領域でコントロールを取得するにはどうすればよいですか?

分類Dev

PythonでopenCVから取得した色検出結果領域から画面座標を取得するにはどうすればよいですか?

分類Dev

ajax呼び出しからimgデータ(ピクセルなど)を取得するにはどうすればよいですか?

分類Dev

いくつかの値が一致したExcelからセルデータを取得するにはどうすればよいですか?

分類Dev

ピクセルの生の配列を画面に表示するにはどうすればよいですか?

分類Dev

選択したUICollectionViewセルからデータを取得するにはどうすればよいですか?

分類Dev

Visual C ++の出力クライアント領域で.csvファイルデータを確認するにはどうすればよいですか?

分類Dev

OCRツールを使用して画面領域からテキストを瞬時に抽出するにはどうすればよいですか?

分類Dev

画面を2つの独立した領域に分割するにはどうすればよいですか?

分類Dev

テキスト領域のキャレット列(ピクセルではない)の位置を最初から取得するにはどうすればよいですか?

分類Dev

貼り付けずにPuTTYの画面領域をコピーするにはどうすればよいですか?

分類Dev

Excelから範囲(印刷領域)を取得するにはどうすればよいですか?

分類Dev

TBitmapからピクセル配列を取得するにはどうすればよいですか?

分類Dev

Gtk.DrawingAreaからピクセルを取得するにはどうすればよいですか?

Related 関連記事

  1. 1

    .PNGからピクセルデータを取得するにはどうすればよいですか?

  2. 2

    VBA:フィルタリングされたデータから現在の領域を取得するにはどうすればよいですか?

  3. 3

    ピクセルのクラスターの周りに閉じた領域を作成するにはどうすればよいですか?

  4. 4

    2つのベクトル間でデータをより速くコピーするにはどうすればよいですか?

  5. 5

    ADBを介して画面ピクセルの色を取得するにはどうすればよいですか?

  6. 6

    UITableViewの最初のセルからデータを取得するにはどうすればよいですか?

  7. 7

    HTML Canvasでピクセルパーフェクトなクリッピング領域を作成するにはどうすればよいですか?

  8. 8

    RのgeoTIFFからピクセルの値を取得するにはどうすればよいですか?

  9. 9

    ステージング領域からではなく、作業ディレクトリからすべてのファイルをリセットするにはどうすればよいですか?

  10. 10

    分類されたデータフレームのスタック領域プロットを取得するにはどうすればよいですか?

  11. 11

    画像からピクセルの色を取得するにはどうすればよいですか?

  12. 12

    Windowsコンピューターの領域にプログラムでアクセスするにはどうすればよいですか?

  13. 13

    Windowsコンピューターの領域にプログラムでアクセスするにはどうすればよいですか?

  14. 14

    UIImage(Cocoa Touch)またはCGImage(Core Graphics)からピクセルデータを取得するにはどうすればよいですか?

  15. 15

    所有していないキャンバスからピクセルデータを取得するにはどうすればよいですか?

  16. 16

    コントロールの配列から最小限の領域でコントロールを取得するにはどうすればよいですか?

  17. 17

    PythonでopenCVから取得した色検出結果領域から画面座標を取得するにはどうすればよいですか?

  18. 18

    ajax呼び出しからimgデータ(ピクセルなど)を取得するにはどうすればよいですか?

  19. 19

    いくつかの値が一致したExcelからセルデータを取得するにはどうすればよいですか?

  20. 20

    ピクセルの生の配列を画面に表示するにはどうすればよいですか?

  21. 21

    選択したUICollectionViewセルからデータを取得するにはどうすればよいですか?

  22. 22

    Visual C ++の出力クライアント領域で.csvファイルデータを確認するにはどうすればよいですか?

  23. 23

    OCRツールを使用して画面領域からテキストを瞬時に抽出するにはどうすればよいですか?

  24. 24

    画面を2つの独立した領域に分割するにはどうすればよいですか?

  25. 25

    テキスト領域のキャレット列(ピクセルではない)の位置を最初から取得するにはどうすればよいですか?

  26. 26

    貼り付けずにPuTTYの画面領域をコピーするにはどうすればよいですか?

  27. 27

    Excelから範囲(印刷領域)を取得するにはどうすればよいですか?

  28. 28

    TBitmapからピクセル配列を取得するにはどうすればよいですか?

  29. 29

    Gtk.DrawingAreaからピクセルを取得するにはどうすればよいですか?

ホットタグ

アーカイブ