V1代码:

; 原版函数库出处:https://www.autohotkey.com/boards/viewtopic.php?t=72797
#NoEnv
#SingleInstance Force
SetBatchLines -1
SetWorkingDir %A_ScriptDir%

Run https://image.baidu.com/search/index?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&dyTabStr=MCwxLDMsMiw2LDQsNSw4LDcsOQ%3D%3D&word=人脸

Loop 15
  Outline%A_Index% := new HighlightOutline("Blue", 88)

Loop
  FaceDetect("屏幕截图时随便填", 0, 0, A_ScreenWidth, A_ScreenHeight)
Return

; MsgBox % FaceDetect("test.png")

Esc::ExitApp


FaceDetect(file, X:="", Y:="", W:="", H:="", maxheight := 2000) {
  static BitmapDecoderStatics, BitmapEncoderStatics, SoftwareBitmapStatics, FaceDetector, SupportedBitmapPixelFormats, countcoordinate
  if (FaceDetector = "") {
    CreateClass("Windows.Graphics.Imaging.BitmapDecoder", IBitmapDecoderStatics := "{438CCB26-BCEF-4E95-BAD6-23A822E58D01}", BitmapDecoderStatics)
    , CreateClass("Windows.Graphics.Imaging.BitmapEncoder", IBitmapEncoderStatics := "{A74356A7-A4E4-4EB9-8E40-564DE7E1CCB2}", BitmapEncoderStatics)
    , CreateClass("Windows.Graphics.Imaging.SoftwareBitmap", ISoftwareBitmapStatics := "{DF0385DB-672F-4A9D-806E-C2442F343E86}", SoftwareBitmapStatics)
    , CreateClass("Windows.Media.FaceAnalysis.FaceDetector", IFaceDetectorStatics := "{BC042D67-9047-33F6-881B-6746C1B218B8}", FaceDetectorStatics)
    , DllCall(NumGet(NumGet(FaceDetectorStatics+0)+6*A_PtrSize), "ptr", FaceDetectorStatics, "ptr*", FaceDetector)	; CreateAsync
    , WaitForAsync(FaceDetector)
    , DllCall(NumGet(NumGet(FaceDetectorStatics+0)+7*A_PtrSize), "ptr", FaceDetectorStatics, "ptr*", ReadOnlyList)	; GetSupportedBitmapPixelFormats
    , DllCall(NumGet(NumGet(ReadOnlyList+0)+7*A_PtrSize), "ptr", ReadOnlyList, "int*", count)	; count

    Loop % count
      DllCall(NumGet(NumGet(ReadOnlyList+0)+6*A_PtrSize), "ptr", ReadOnlyList, "int", A_Index-1, "uint*", BitmapPixelFormat)
      , SupportedBitmapPixelFormats .= "|" BitmapPixelFormat "|"

    ObjRelease(FaceDetectorStatics)
    , ObjRelease(ReadOnlyList)
  }
  
  if (W="") {
    if (SubStr(file, 2, 1) != ":")
      file := A_ScriptDir "\" file
    if !FileExist(file) or InStr(FileExist(file), "D") {
      msgbox File "%file%" does not exist
      ExitApp
    }
    VarSetCapacity(GUID, 16)
    , DllCall("ole32\CLSIDFromString", "wstr", IID_RandomAccessStream := "{905A0FE1-BC53-11DF-8C49-001E4FC686DA}", "ptr", &GUID)
    , DllCall("ShCore\CreateRandomAccessStreamOnFile", "wstr", file, "uint", Read := 0, "ptr", &GUID, "ptr*", IRandomAccessStream)
   } else
    VarSetCapacity(GUID, 16)
    , DllCall("ole32\CLSIDFromString", "wstr", IID_RandomAccessStream := "{905A0FE1-BC53-11DF-8C49-001E4FC686DA}", "ptr", &GUID)
    , hBitmap := HBitmapFromScreen(X, Y, W, H)
    , IRandomAccessStream := HBitmapToRandomAccessStream(hBitmap)
    , DllCall("DeleteObject", "Ptr", hBitmap)

  DllCall(NumGet(NumGet(BitmapDecoderStatics+0)+14*A_PtrSize), "ptr", BitmapDecoderStatics, "ptr", IRandomAccessStream, "ptr*", BitmapDecoder)	; CreateAsync
  , WaitForAsync(BitmapDecoder)
  , BitmapFrame := ComObjQuery(BitmapDecoder, IBitmapFrame := "{72A49A1C-8081-438D-91BC-94ECFC8185C6}")
  , DllCall(NumGet(NumGet(BitmapFrame+0)+12*A_PtrSize), "ptr", BitmapFrame, "uint*", width)	; get_PixelWidth
  , DllCall(NumGet(NumGet(BitmapFrame+0)+13*A_PtrSize), "ptr", BitmapFrame, "uint*", height)	; get_PixelHeight
  , DllCall(NumGet(NumGet(BitmapFrame+0)+8*A_PtrSize), "ptr", BitmapFrame, "uint*", BitmapPixelFormat)	; get_BitmapPixelFormat
  , BitmapFrameWithSoftwareBitmap := ComObjQuery(BitmapDecoder, IBitmapFrameWithSoftwareBitmap := "{FE287C9A-420C-4963-87AD-691436E08383}")

  if (height > maxheight)
    DllCall(NumGet(NumGet(BitmapEncoderStatics+0)+15*A_PtrSize), "ptr", BitmapEncoderStatics, "ptr", IRandomAccessStream, "ptr", BitmapDecoder, "ptr*", BitmapEncoder)	; CreateForTranscodingAsync
    , WaitForAsync(BitmapEncoder)
    , DllCall(NumGet(NumGet(BitmapEncoder+0)+15*A_PtrSize), "ptr", BitmapEncoder, "ptr*", BitmapTransform)	; BitmapTransform
    , DllCall(NumGet(NumGet(BitmapTransform+0)+7*A_PtrSize), "ptr", BitmapTransform, "int", floor(maxheight/height*width))	; put_ScaledWidth
    , DllCall(NumGet(NumGet(BitmapTransform+0)+9*A_PtrSize), "ptr", BitmapTransform, "int", maxheight)	; put_ScaledHeight
    , DllCall(NumGet(NumGet(BitmapFrameWithSoftwareBitmap+0)+8*A_PtrSize), "ptr", BitmapFrameWithSoftwareBitmap, "uint", BitmapPixelFormat, "uint", Premultiplied := 0, "ptr", BitmapTransform, "uint", IgnoreExifOrientation := 0, "uint", DoNotColorManage := 0, "ptr*", SoftwareBitmap)	; GetSoftwareBitmapTransformedAsync
    else
    DllCall(NumGet(NumGet(BitmapFrameWithSoftwareBitmap+0)+6*A_PtrSize), "ptr", BitmapFrameWithSoftwareBitmap, "ptr*", SoftwareBitmap)	; GetSoftwareBitmapAsync

  WaitForAsync(SoftwareBitmap)

  if !InStr(SupportedBitmapPixelFormats, "|" BitmapPixelFormat "|") {
    DllCall(NumGet(NumGet(SoftwareBitmapStatics+0)+7*A_PtrSize), "ptr", SoftwareBitmapStatics, "ptr", SoftwareBitmap, "uint", Gray8 := 62, "ptr*", SoftwareBitmapTemp)	; Convert
    , Close := ComObjQuery(SoftwareBitmap, IClosable := "{30D5A829-7FA4-4026-83BB-D75BAE4EA99E}")
    , DllCall(NumGet(NumGet(Close+0)+6*A_PtrSize), "ptr", Close)	; Close
    , ObjRelease(Close)
    , ObjRelease(SoftwareBitmap)
    , SoftwareBitmap := SoftwareBitmapTemp
  }
  DllCall(NumGet(NumGet(FaceDetector+0)+6*A_PtrSize), "ptr", FaceDetector, ptr, SoftwareBitmap, "ptr*", DetectedFaceList)	; DetectFacesAsync
  , WaitForAsync(DetectedFaceList)
  , DllCall(NumGet(NumGet(DetectedFaceList+0)+7*A_PtrSize), "ptr", DetectedFaceList, "int*", count)	; count

  Loop % countcoordinate
    Outline%A_Index%.Hide()

  Loop % count
    varsetcapacity(bounds, 16, 0)
    , DllCall(NumGet(NumGet(DetectedFaceList+0)+6*A_PtrSize), "ptr", DetectedFaceList, "int", A_Index-1, "ptr*", DetectedFace)	; get_Item
    , DllCall(NumGet(NumGet(DetectedFace+0)+6*A_PtrSize), "ptr", DetectedFace, "ptr", &bounds)	; BitmapBounds
    , x := numget(bounds, 0, "uint")
    , y := numget(bounds, 4, "uint")
    , width := numget(bounds, 8, "uint")
    , height := numget(bounds, 12, "uint")
    , result .= "face" A_Index ": x=" x ", y=" y ", width=" width ", height=" height "`n"
    , Outline%A_Index%.Show(x, y, width+x, height+y)
    , ObjRelease(DetectedFace)

  countcoordinate := count
  , Close := ComObjQuery(IRandomAccessStream, IClosable := "{30D5A829-7FA4-4026-83BB-D75BAE4EA99E}")
  , DllCall(NumGet(NumGet(Close+0)+6*A_PtrSize), "ptr", Close)	; Close
  , ObjRelease(Close)
  , Close := ComObjQuery(SoftwareBitmap, IClosable := "{30D5A829-7FA4-4026-83BB-D75BAE4EA99E}")
  , DllCall(NumGet(NumGet(Close+0)+6*A_PtrSize), "ptr", Close)	; Close
  , ObjRelease(Close)
  , ObjRelease(IRandomAccessStream)
  , ObjRelease(BitmapDecoder)
  , ObjRelease(BitmapFrame)

  if (height > maxheight)
    ObjRelease(BitmapEncoder), ObjRelease(BitmapTransform)
  ObjRelease(BitmapFrameWithSoftwareBitmap)
  , ObjRelease(SoftwareBitmap)
  , ObjRelease(DetectedFaceList)
  Return result
}



CreateClass(string, interface, ByRef Class) {
  CreateHString(string, hString)
  , VarSetCapacity(GUID, 16)
  , DllCall("ole32\CLSIDFromString", "wstr", interface, "ptr", &GUID)
  , result := DllCall("Combase.dll\RoGetActivationFactory", "ptr", hString, "ptr", &GUID, "ptr*", Class, "uint")
  if (result != 0) {
    if (result = 0x80004002)
      msgbox No such interface supported
     else if (result = 0x80040154)
      msgbox Class not registered
      else
      msgbox error: %result%
    ExitApp
  }
  DeleteHString(hString)
}

CreateHString(string, ByRef hString) {
  DllCall("Combase.dll\WindowsCreateString", "wstr", string, "uint", StrLen(string), "ptr*", hString)
}

DeleteHString(hString) {
  DllCall("Combase.dll\WindowsDeleteString", "ptr", hString)
}

WaitForAsync(ByRef Object) {
  AsyncInfo := ComObjQuery(Object, IAsyncInfo := "{00000036-0000-0000-C000-000000000046}")
  Loop {
    DllCall(NumGet(NumGet(AsyncInfo+0)+7*A_PtrSize), "ptr", AsyncInfo, "uint*", status)	; IAsyncInfo.Status
    if (status != 0) {
      if (status != 1) {
        DllCall(NumGet(NumGet(AsyncInfo+0)+8*A_PtrSize), "ptr", AsyncInfo, "uint*", ErrorCode)	; IAsyncInfo.ErrorCode
        msgbox AsyncInfo status error: %ErrorCode%
        ExitApp
      }
      ObjRelease(AsyncInfo)
      break
    }
    sleep 10
  }
  DllCall(NumGet(NumGet(Object+0)+8*A_PtrSize), "ptr", Object, "ptr*", ObjectResult)	; GetResults
  , ObjRelease(Object)
  , Object := ObjectResult
}

; =================== 截图和内存转换 ===================

GetArea() {
  area := []
  StartSelection(area)
  while !area.w
    Sleep, 100
  Return area
}
  
StartSelection(area) {
  handler := Func("Select").Bind(area)
  Hotkey, LButton, % handler, On
  ReplaceSystemCursors("IDC_CROSS")
}

Select(area) {
  static hGui := CreateSelectionGui()
  Hook := new WindowsHook(WH_MOUSE_LL := 14, "LowLevelMouseProc", hGui)
  Loop {
    KeyWait, LButton
    WinGetPos, X, Y, W, H, ahk_id %hGui%
  } until w > 0
  ReplaceSystemCursors("")
  Hotkey, LButton, Off
  Hook := ""
  Gui, %hGui%:Show, Hide
  for k, v in ["x", "y", "w", "h"]
    area[v] := %v%
}

ReplaceSystemCursors(IDC = "") {
  static IMAGE_CURSOR := 2, SPI_SETCURSORS := 0x57
      , exitFunc := Func("ReplaceSystemCursors").Bind("")
      , SysCursors := { IDC_APPSTARTING: 32650
                , IDC_ARROW		: 32512
                , IDC_CROSS		: 32515
                , IDC_HAND		 : 32649
                , IDC_HELP		 : 32651
                , IDC_IBEAM		: 32513
                , IDC_NO			: 32648
                , IDC_SIZEALL	 : 32646
                , IDC_SIZENESW	: 32643
                , IDC_SIZENWSE	: 32642
                , IDC_SIZEWE	  : 32644
                , IDC_SIZENS	  : 32645 
                , IDC_UPARROW	 : 32516
                , IDC_WAIT		 : 32514 }
  if !IDC
    DllCall("SystemParametersInfo", UInt, SPI_SETCURSORS, UInt, 0, UInt, 0, UInt, 0)
    , OnExit(exitFunc, 0)
   else {
    hCursor := DllCall("LoadCursor", Ptr, 0, UInt, SysCursors[IDC], Ptr)
    for k, v in SysCursors
      hCopy := DllCall("CopyImage", Ptr, hCursor, UInt, IMAGE_CURSOR, Int, 0, Int, 0, UInt, 0, Ptr)
      , DllCall("SetSystemCursor", Ptr, hCopy, UInt, v)

    OnExit(exitFunc)
  }
}

CreateSelectionGui() {
  Gui, New, +hwndhGui +Alwaysontop -Caption +LastFound +ToolWindow +E0x20 -DPIScale
  WinSet, Transparent, 130
  Gui, Color, FFC800
  Return hGui
}

LowLevelMouseProc(nCode, wParam, lParam) {
  static WM_MOUSEMOVE := 0x200, WM_LBUTTONUP := 0x202
      , coords := [], startMouseX, startMouseY, hGui
      , timer := Func("LowLevelMouseProc").Bind("timer", "", "")
  
  if (nCode = "timer") {
    while coords[1] {
      point := coords.RemoveAt(1)
      , mouseX := point[1], mouseY := point[2]
      , x := startMouseX < mouseX ? startMouseX : mouseX
      , y := startMouseY < mouseY ? startMouseY : mouseY
      , w := Abs(mouseX - startMouseX)
      , h := Abs(mouseY - startMouseY)
      try Gui, %hGUi%: Show, x%x% y%y% w%w% h%h% NA
    }
  } else {
    (!hGui && hGui := A_EventInfo)
    if (wParam = WM_LBUTTONUP)
      startMouseX := startMouseY := ""
    if (wParam = WM_MOUSEMOVE)  {
      mouseX := NumGet(lParam + 0, "Int")
      , mouseY := NumGet(lParam + 4, "Int")
      if (startMouseX = "") {
        startMouseX := mouseX
        , startMouseY := mouseY
      }
      coords.Push([mouseX, mouseY])
      SetTimer, % timer, -10
    }
    Return DllCall("CallNextHookEx", Ptr, 0, Int, nCode, UInt, wParam, Ptr, lParam)
  }
}

class WindowsHook {
  __New(type, callback, eventInfo := "", isGlobal := true) {
    this.callbackPtr := RegisterCallback(callback, "Fast", 3, eventInfo)
    this.hHook := DllCall("SetWindowsHookEx", "Int", type, "Ptr", this.callbackPtr
                    , "Ptr", !isGlobal ? 0 : DllCall("GetModuleHandle", "UInt", 0, "Ptr")
                    , "UInt", isGlobal ? 0 : DllCall("GetCurrentThreadId"), "Ptr")
  }
  __Delete() {
    DllCall("UnhookWindowsHookEx", "Ptr", this.hHook)
    , DllCall("GlobalFree", "Ptr", this.callBackPtr, "Ptr")
  }
}

HBitmapFromScreen(X, Y, W, H) {
  HDC := DllCall("GetDC", "Ptr", 0, "UPtr")
  , HBM := DllCall("CreateCompatibleBitmap", "Ptr", HDC, "Int", W, "Int", H, "UPtr")
  , PDC := DllCall("CreateCompatibleDC", "Ptr", HDC, "UPtr")
  , DllCall("SelectObject", "Ptr", PDC, "Ptr", HBM)
  , DllCall("BitBlt", "Ptr", PDC, "Int", 0, "Int", 0, "Int", W, "Int", H, "Ptr", HDC, "Int", X, "Int", Y, "UInt", 0x00CC0020)
  , DllCall("DeleteDC", "Ptr", PDC)
  , DllCall("ReleaseDC", "Ptr", 0, "Ptr", HDC)
  Return HBM
}

HBitmapToRandomAccessStream(hBitmap) {
  static IID_IRandomAccessStream := "{905A0FE1-BC53-11DF-8C49-001E4FC686DA}"
      , IID_IPicture				:= "{7BF80980-BF32-101A-8BBB-00AA00300CAB}"
      , PICTYPE_BITMAP := 1
      , BSOS_DEFAULT	:= 0
      
  DllCall("Ole32\CreateStreamOnHGlobal", "Ptr", 0, "UInt", true, "PtrP", pIStream, "UInt")
  
  , VarSetCapacity(PICTDESC, sz := 8 + A_PtrSize*2, 0)
  , NumPut(sz, PICTDESC)
  , NumPut(PICTYPE_BITMAP, PICTDESC, 4)
  , NumPut(hBitmap, PICTDESC, 8)
  , riid := CLSIDFromString(IID_IPicture, GUID1)
  , DllCall("OleAut32\OleCreatePictureIndirect", "Ptr", &PICTDESC, "Ptr", riid, "UInt", false, "PtrP", pIPicture, "UInt")
  ; IPicture::SaveAsFile
  , DllCall(NumGet(NumGet(pIPicture+0) + A_PtrSize*15), "Ptr", pIPicture, "Ptr", pIStream, "UInt", true, "UIntP", size, "UInt")
  , riid := CLSIDFromString(IID_IRandomAccessStream, GUID2)
  , DllCall("ShCore\CreateRandomAccessStreamOverStream", "Ptr", pIStream, "UInt", BSOS_DEFAULT, "Ptr", riid, "PtrP", pIRandomAccessStream, "UInt")
  , ObjRelease(pIPicture)
  , ObjRelease(pIStream)
  Return pIRandomAccessStream
}

CLSIDFromString(IID, ByRef CLSID) {
  VarSetCapacity(CLSID, 16, 0)
  if res := DllCall("ole32\CLSIDFromString", "WStr", IID, "Ptr", &CLSID, "UInt")
    throw Exception("CLSIDFromString failed. Error: " . Format("{:#x}", res))
  Return &CLSID
}


; ====================== 边框高亮线 ======================

class HighlightOutline {
  __New(Color="Red", Transparent=255) {
    Loop 4 {
      Gui New, -Caption +AlwaysOnTop +ToolWindow HWNDhwnd -DPIScale +E0x20 +E0x00080000
      Gui Color, %Color%
      DllCall("SetLayeredWindowAttributes", "Ptr", this[A_Index] := hwnd, "Uint", 0, "Uchar", Transparent, "int", 2)
    }
    this.top := this[1]
    , this.right := this[2]
    , this.bottom := this[3]
    , this.left := this[4]
    Gui Gui_Cheek_Number%A_DefaultGui%: Default
  }

  Show(x1, y1, x2, y2, b=3) {
    Try Gui % this[1] ":Show", % "NA x" x1-b " y" y1-b " w" x2-x1+b*2 " h" b
    Try Gui % this[2] ":Show", % "NA x" x2 " y" y1 " w" b " h" y2-y1
    Try Gui % this[3] ":Show", % "NA x" x1-b " y" y2 " w" x2-x1+2*b " h" b
    Try Gui % this[4] ":Show", % "NA x" x1-b " y" y1 " w" b " h" y2-y1
  }

  Hide() {
    Loop 4
      Gui % this[A_Index] ": Hide"
  }

  Destroy() {
    Loop 4
      Gui % this[A_Index] ": Destroy"
  }
}

 

V2代码:

MsgBox FaceDetect("face.jpg")

Facedetect(File, MaxHeight := 2000)
{
  Static BitmapDecoderStatics, BitmapEncoderStatics, SoftwareBitmapStatics, FaceDetector := "", SupportedBitmapPixelFormats

  if (FaceDetector = "")
  {
    CreateClass("Windows.Graphics.Imaging.BitmapDecoder", IBitmapDecoderStatics := "{438CCB26-BCEF-4E95-BAD6-23A822E58D01}", &BitmapDecoderStatics)
    CreateClass("Windows.Graphics.Imaging.BitmapEncoder", IBitmapEncoderStatics := "{A74356A7-A4E4-4EB9-8E40-564DE7E1CCB2}", &BitmapEncoderStatics)
    CreateClass("Windows.Graphics.Imaging.SoftwareBitmap", ISoftwareBitmapStatics := "{DF0385DB-672F-4A9D-806E-C2442F343E86}", &SoftwareBitmapStatics)
    CreateClass("Windows.Media.FaceAnalysis.FaceDetector", IFaceDetectorStatics := "{BC042D67-9047-33F6-881B-6746C1B218B8}", &FaceDetectorStatics)

    ComCall(6, FaceDetectorStatics, 'Ptr*', &FaceDetector := 0)
    WaitForAsync(&FaceDetector)
    ComCall(7, FaceDetectorStatics, 'Ptr*', &ReadOnlyList := 0)
    ComCall(7, ReadOnlyList, 'Int*', &Count := 0)

    Loop Count
    {
      ComCall(6, ReadOnlyList, 'Int', A_Index - 1, 'UInt*', &BitmapPixelFormat := 0)
      SupportedBitmapPixelFormats .= "|" BitmapPixelFormat "|"
    }

    ObjRelease(FaceDetectorStatics)
    ObjRelease(ReadOnlyList)
  }

  if (SubStr(File, 2, 1) != ":")
    File := A_ScriptDir "\" File

  if !FileExist(File) || InStr(FileExist(File), "D")
  {
    MsgBox("File `"" File "`" does not exist")
    ExitApp()
  }   

  GUID := Buffer(16)
  DllCall("ole32\CLSIDFromString", "wstr", IID_RandomAccessStream := "{905A0FE1-BC53-11DF-8C49-001E4FC686DA}", "Ptr", GUID)
  DllCall("ShCore\CreateRandomAccessStreamOnFile", "wstr", File, "UInt", Read := 0, "Ptr", GUID, "Ptr*", &IRandomAccessStream := 0)

  ComCall(14, BitmapDecoderStatics, 'Ptr', IRandomAccessStream, 'Ptr*', &BitmapDecoder := 0)
  WaitForAsync(&BitmapDecoder)
  BitmapFrame := ComObjQuery(BitmapDecoder, IBitmapFrame := "{72A49A1C-8081-438D-91BC-94ECFC8185C6}")
  ComCall(12, BitmapFrame, 'UInt*', &Width := 0)
  ComCall(13, BitmapFrame, 'UInt*', &Height := 0)
  ComCall(8, BitmapFrame, 'UInt*', &BitmapPixelFormat := 0)
  BitmapFrameWithSoftwareBitmap := ComObjQuery(BitmapDecoder, IBitmapFrameWithSoftwareBitmap := "{FE287C9A-420C-4963-87AD-691436E08383}")

  if (Height > MaxHeight)
  {
    ComCall(15, BitmapEncoderStatics, 'Ptr', IRandomAccessStream, 'Ptr', BitmapDecoder, 'Ptr*', &BitmapEncoder := 0)
    WaitForAsync(BitmapEncoder)
    ComCall(15, BitmapEncoder, 'Ptr*', &BitmapTransform := 0)
    ComCall(7, BitmapTransform, 'Int', Floor(MaxHeight / Height * Width))
    ComCall(9, BitmapTransform, 'Int', MaxHeight)
    ComCall(8, BitmapFrameWithSoftwareBitmap, 'UInt', BitmapPixelFormat, 'UInt', Premultiplied := 0, 'Ptr', BitmapTransform, 'UInt', IgnoreExifOrientation := 0, 'UInt', DoNotColorManage := 0, 'Ptr*', &SoftwareBitmap)
  }

  else
    ComCall(6, BitmapFrameWithSoftwareBitmap, 'Ptr*', &SoftwareBitmap := 0)

  WaitForAsync(&SoftwareBitmap)

  if !InStr(SupportedBitmapPixelFormats, "|" BitmapPixelFormat "|")
  {
    ComCall(7, SoftwareBitmapStatics, 'Ptr', SoftwareBitmap, 'UInt', Gray8 := 62, 'Ptr*', &SoftwareBitmapTemp := 0)
    Close := ComObjQuery(SoftwareBitmap, IClosable := "{30D5A829-7FA4-4026-83BB-D75BAE4EA99E}")
    ComCall(6, Close)
    SoftwareBitmap := SoftwareBitmapTemp
  }

  ComCall(6, FaceDetector, 'Ptr', SoftwareBitmap, 'Ptr*', &DetectedFaceList := 0)
  WaitForAsync(&DetectedFaceList)
  ComCall(7, DetectedFaceList, 'Int*', &Count := 0)

  Loop Count
  {
    VarSetStrCapacity(&bounds, 16)
    ComCall(6, DetectedFaceList, 'Int', A_Index-1, 'Ptr*', &DetectedFace := 0)
    ComCall(6, DetectedFace, 'Ptr', StrPtr(bounds))

    x := NumGet(StrPtr(bounds), 0, "UInt")
    y := NumGet(StrPtr(bounds), 4, "UInt")
    Width := NumGet(StrPtr(bounds), 8, "UInt")
    Height := NumGet(StrPtr(bounds), 12, "UInt")
    Result .= "face" A_Index ": x=" x ", y=" y ", Width=" Width ", Height=" Height "`n"
    ObjRelease(DetectedFace)
  }

  Close := ComObjQuery(IRandomAccessStream, IClosable := "{30D5A829-7FA4-4026-83BB-D75BAE4EA99E}")
  ComCall(6, Close)
  Close := ComObjQuery(SoftwareBitmap, IClosable := "{30D5A829-7FA4-4026-83BB-D75BAE4EA99E}")
  ComCall(6, Close)
  ObjRelease(IRandomAccessStream)
  ObjRelease(BitmapDecoder)

  if (Height > MaxHeight)
  {
    ObjRelease(BitmapEncoder)
    ObjRelease(BitmapTransform)
  }

  ObjRelease(SoftwareBitmap)
  ObjRelease(DetectedFaceList)
  
  Return Result
}

CreateClass(string, interface, &Class)
{
  CreateHString(string, &hString)
  GUID := Buffer(16)
  DllCall("ole32\CLSIDFromString", "wstr", interface, "Ptr", GUID)
  Result := DllCall("Combase.dll\RoGetActivationFactory", "Ptr", hString, "Ptr", GUID, "Ptr*", &Class := 0, "UInt")
  if (Result != 0)
  {
    if (Result = 0x80004002)
      MsgBox("No such interface supported")
    else if (Result = 0x80040154)
      MsgBox("Class not registered")
    else
      MsgBox("error: " Result)
  }
  DeleteHString(hString)
}

CreateHString(string, &hString)
{
  DllCall("Combase.dll\WindowsCreateString", "wstr", string, "UInt", StrLen(string), "Ptr*", &hString := 0)
}

DeleteHString(hString)
{
  DllCall("Combase.dll\WindowsDeleteString", "Ptr", hString)
}

WaitForAsync(&Object)
{
  AsyncInfo := ComObjQuery(Object, IAsyncInfo := "{00000036-0000-0000-C000-000000000046}")
  Loop
  {
    ComCall(7, Asyncinfo, 'UInt*', &Status := 0)
    
    if (Status != 0)
    {
      if (Status != 1)
      {
        ComCall(8, Asyncinfo, 'UInt*', &ErrorCode := 0)
        MsgBox("AsyncInfo Status error: " ErrorCode)
      }

      Break
    }
    Sleep(10)
  }

  ComCall(8, Object, 'Ptr*', &ObjectResult := 0)
  ObjRelease(Object)
  Object := ObjectResult
}

 

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。