<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; AHK: Поиск совпадения картинки через машинный код]]></title>
	<link rel="self" href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=17654&amp;type=atom" />
	<updated>2023-03-12T01:58:12Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.script-coding.com/viewtopic.php?id=17654</id>
		<entry>
			<title type="html"><![CDATA[AHK: Поиск совпадения картинки через машинный код]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=157091#p157091" />
			<content type="html"><![CDATA[<p>Решил упростить c++ функции + создать правильный алгоритм нахождения всех совпадений + упростить сам скртипт взятый отсюда:<br /><a href="https://github.com/MasterFocus/AutoHotkey/tree/912011380caf37a690ff911d9ded388f4ada2f4e/Functions/GDI%2B%20ImageSearch">https://github.com/MasterFocus/AutoHotk … mageSearch</a><br />и отсюда:<br /><a href="https://github.com/MasterFocus/AutoHotkey/tree/master/Functions/Gdip_ImageSearch">https://github.com/MasterFocus/AutoHotk … mageSearch</a><br />Для поиска совпадений нам нужно: <br />1) Haystack scan, stride, начальная точка поиска, конечная точка поиска<br />2) Needle scan, stride, ширина с высотой<br />3) Вариация от 0 до 255 и если необходимо указать прозрачый цвет в формате rgb.<br /></p><div class="codebox"><pre><code>setbatchlines -1
DllCall(&quot;LoadLibrary&quot;, &quot;str&quot;, &quot;gdiplus&quot;)
VarSetCapacity(si, 8+2*A_PtrSize, 0)
NumPut(0x1, si, &quot;uint&quot;)
DllCall(&quot;gdiplus\GdiplusStartup&quot;, &quot;ptr*&quot;, pToken, &quot;ptr&quot;, &amp;si, &quot;ptr&quot;, 0)
MCode_ImageSearch := MCode(&quot;2,x86:VVdWU4PsJItEJFArRCRgiUQkFItsJGiDwAGJRCQci0QkVCtEJGSJRCQgg8ABhe0PhA8BAAA7RCRMD46AAgAAi0QkTA+vRCREiUQkGItEJEiJRCQMi0QkHDtEJEgPjhkCAACLRCRkhcAPjskAAABmkItEJECLfCQMx0QkCAAAAADHBCQAAAAAjQS4iUQkEItEJBiJRCQEi1QkYItEJAgx24tMJBADRCRYA0wkBIXSfxvpmwEAAI12AIPDAYPABIPBBDlcJGAPhIUBAAAPtlECD7ZwAo08Kjn+fzYp6jnWfDAPtlEBD7ZwAY08Kjn+fyEp6jnWfBsPthEPtjCNPCo5/n8OKeo51n2wjbQmAAAAAJCAeAMAdKKLfCQMjUcBOXwkFA+OVAEAAIlEJAyLRCRkhcAPjzn///+LRCQ4i3wkDOnLAAAAO0QkTA+OcQEAAItEJEwPr0QkRItsJGCJRCQMi3wkSItEJBw5+A+OLgEAAItMJGSFyQ+OkAAAAI10JgCQi0QkQIt0JAzHBCQAAAAAMduNBLiJRCQEi0wkBItEJFiNFDEB2DHJhe0Pjn0AAACJXCQI6xaNdgCAeAMAdTKDwQGDwASDwgQ5zXRdD7ZaAjhYAnXkD7ZaAThYAXXbD7YaOBh02oB4AwB01I22AAAAAI1HATl8JBQPjqAAAACLTCRkiceFyQ+Pdf///4tEJDiJOItEJDyLfCRMiTgxwIPEJFteX13DjXYAi1wkCIMEJAEDXCRciwQkA3QkRDlEJGQPhVP////rxI20JgAAAABmkIt0JFyDBCQBAXQkCIsEJIt0JEQBdCQEOUQkZA+FJf7//4tEJDiLfCQM65SLRCRMi3QkRIt8JCABdCQYg8ABO3wkTH4riUQkTOmv/f//i0QkTIt0JESLfCQgAXQkDIPAATt8JEx+CYlEJEzpoP7//4tEJDjHAP////+LRCQ8xwD/////uP/////pQP///w==,x64:QVdBVkFVQVRVV1ZTSIPsKESLpCTAAAAAi4QkoAAAAIusJMgAAABEi5wk0AAAAEQp4EyLvCSwAAAAiUQkEIPAAU2JxYlEJBiLhCSoAAAASIlMJHAp6EiJVCR4iUQkHIPAAUSJjCSIAAAARYXbD4QzAQAAO4QkmAAAAA+OxQIAAIuEJJgAAABMiYQkgAAAAEEPr8GJRCQUQY1EJP9JjUSHBEiJRCQIRIu0JJAAAACLRCQYRDnwD442AgAAhe0PjsYAAABmDx9EAABCjTy1AAAAAIt0JBQx20Ux7Uhj/0WF5A+O6wEAAExjy0hj1kuNBA9IAfpMA0wkCEgDlCSAAAAA6xgPH4AAAAAASIPABEiDwgRJOcEPhLcBAAAPtkoCRA+2QAJGjRQZRTnQfz1EKdlBOch8NQ+2SgFED7ZAAUaNFBlFOdB/I0Qp2UE5yHwbD7YKRA+2AEaNFBlFOdB/C0Qp2UE5yH2jDx8AgHgDAHSaQY1GAUQ5dCQQD45zAQAAQYnGhe0Pj0D///9Ii0QkcIu8JJgAAABEiTBIi0QkeIk4McDp+QAAADuEJJgAAAAPjpIBAACLvCSYAAAAQY1EJP9Fic4Pr7wkiAAAAEmNdIcEi5wkkAAAAItEJBg52A+OPQEAAIXtD46eAAAADx+AAAAAAESNFJ0AAAAAQYn5RTHbRTHATWPSRYXkD46oAAAASWPRSWPIRIlEJAhMAdJJjQQPSAHxTAHq6xxmDx+EAAAAAACAeAMAdTpIg8AESIPCBEg5wXRtRA+2QgJEOEACdeJED7ZCAUQ4QAF110QPtgJEOAB01IB4AwB0zg8fhAAAAAAAjUMBOVwkEA+OoQAAAInDhe0Pj2n///9Ii0QkcIu8JJgAAACJGEiLRCR4iTgxwEiDxChbXl9dQVxBXUFeQV/DkESLRCQIQYPDAUQDhCS4AAAARQHxRDndD4U3////67iQQYPFAQOcJLgAAAADtCSIAAAARDntD4Xx/f//6Zj+//+LhCSYAAAAi7QkiAAAAIt8JBwBdCQUg8ABO7wkmAAAAH4yiYQkmAAAAOmH/f//i4QkmAAAAItcJBxEAfeDwAE7nCSYAAAAfgyJhCSYAAAA6Yr+//9Ii0QkcMcA/////0iLRCR4xwD/////uP/////pOv///w==&quot;)
MCode_ImageSearchList := MCode(&quot;2,x86:VVdWU4PsSItEJHArhCSAAAAAiUQkGIPAAYusJIgAAACJRCQsi0QkdCuEJIQAAACJRCQwg8ABiUQkQIXtD4TnAQAAO0QkbA+OmAMAAItEJGyLfCRgx0QkKAAAAAAPr0QkZIlEJCCLRCRoweACiUQkOItEJGgDhCSAAAAAjQSHiUQkPItEJGyJRCQki4QkgAAAAPfYweACiUQkRItEJCw7RCRoD46qAwAAi0QkJAOEJIQAAACJRCQ0i0QkPIuUJIQAAACJRCQci0QkOIlEJBCLRCRoiUQkFIXSD47aAAAAZpCLRCQgxwQkAAAAAMdEJAgAAAAAiUQkBItEJBADRCRgiUQkDIuMJIAAAACLRCQMMduLFCQDRCQEA1QkeIXJf2XpBAMAAI10JgAPtkgCD7ZyAo08KTn+fzEp6TnOfCsPtkgBD7ZyAY08KTn+fxwp6TnOfBYPtggPtjKNPCk5/n8JKek5zn0JjXYAgHoDAHUcg8MBg8AEg8IEOZwkgAAAAA+EpAIAAIB4AwB1not8JBSDRCQQBINEJBwEjUcBOXwkGA+ErQIAAIuUJIQAAACJRCQUhdIPjyj///+LfCQoi1wkXIt0JBSLTCQkjQS9AAAAAIk0u4PHAolMAwSLXCQ0iXwkKDnZfaWLhCSAAAAAAfA5xn2Yi3QkZIt8JESLVCQcA1QkII22AAAAAI0EOo10JgCQxkADAIPABDnQdfWDwQEB8jnZdeTpYf///ztEJGwPjrEBAACLRCRsi3wkYMdEJCgAAAAAD69EJGSJRCQUi0QkaMHgAolEJDSLhCSAAAAAA0QkaI0Eh4u8JIAAAACJRCQki0QkbIlEJByLhCSAAAAA99jB4AKJRCQ4i0QkLDtEJGgPjtoBAACLRCQcA4QkhAAAAIucJIQAAACLbCRoiUQkIItEJCSJRCQQi0QkNIlEJAiF2w+OqAAAAI20JgAAAACQi0QkCANEJGDHBCQAAAAAMduJRCQEi3QkFItEJASLVCR4MckB8AHahf8PjgUBAACJXCQM6xqNdgCAegMAdTqDwQGDwASDwgQ5zw+E4QAAAIB4AwB0Iw+2WAI4WgJ12g+2WAE4WgF10Q+2GDgadNCAegMAdMqNdCYAg0QkCASNRQGDRCQQBDlsJBgPhBEBAACLnCSEAAAAicWF2w+PYP///4t0JCiLXCRci0wkHIkss40EtQAAAACDxgKJdCQoi3QkIIlMAwQ58X2vjUQ9ADnFfaeLXCRki1QkEIk8JIn3i3QkOANUJBSNtCYAAAAAjXYAjQQWjXQmAJDGQAMAg8AEOcJ19YPBAQHaOfl15Is8JOlk////x0QkKAAAAACLRCQog8RIW15fXcONtCYAAAAAkItcJAyDBCQBA1wkfIsEJAN0JGQ5hCSEAAAAD4XJ/v//6Uv///+NdgCLdCR8g0QkCAEBNCSLRCQIi3QkZAF0JAQ5hCSEAAAAD4W2/P//6Wb9//+LfCQki1wkZAFcJCCNRwE5fCQwdCeJRCQk6Sr8//+LdCQci0wkZAFMJBSNRgE5dCQwdAmJRCQc6fr9//+LRCQohcAPhEr///+LfCRAi7QkhAAAAItEJCwDhCSAAAAAjVD/jUw3/zlMJGwPjSv///85VCRoD40h////i1QkbA+vVCRki3wkYItcJGiLdCRsjVQX/CnDi3wkZI0Ugo0cnQQAAACNBBONtCYAAAAAZpCAeAMAdQTGQAP/g8AEOdB174PGAQH6OfF12otEJCiDxEhbXl9dww==,x64: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&quot;)
MCode_SetBitmapTransColor := MCode(&quot;2,x86:VVdWU4PsBItMJCSLbCQYi3wkHItEJCCLVCQohcl+YYXAfl2NTIUAMfYx2410JgCQiRwkjUQ1AOsOjbQmAAAAAIPABDnBdCkPtloCOFgCdfAPtloBOFgBdecPtho4GHXgxkADAIPABDnBddyNdCYAkIscJAH5Af6DwwE5XCQkdbCDxAQxwFteX13D,x64:U0xj2kiLVCQwRYXJfm5FhcB+aUGNQP9FicBFMdJJ99hIjUyBBEnB4AIPH4AAAAAASY0ECOsTZi4PH4QAAAAAAEiDwARIOch0Jw+2WgI4WAJ17g+2WgE4WAF15Q+2GjgYdd7GQAMASIPABEg5yHXakEGDwgFMAdlFOdF1tDHAW8M=&quot;)

needlePath := &quot;D:\unnamed.bmp&quot;, haystackX1 := 0, haystackY1 := 0, haystackX2 := 1920, haystackY2 := 1080, variation := 0, needleTrans := 0xb51212

; Получаем необходимые данные needle из файла и если есть необходимость устанавливаем альфа-канал на нужный цвет.
DllCall(&quot;gdiplus\GdipCreateBitmapFromFile&quot;, &quot;wstr&quot;, needlePath, &quot;ptr*&quot;, needlePbitmap)
DllCall(&quot;gdiplus\GdipGetImageWidth&quot;, &quot;ptr&quot;, needlePbitmap, &quot;uint*&quot;, needleWidth)
DllCall(&quot;gdiplus\GdipGetImageHeight&quot;, &quot;ptr&quot;, needlePbitmap, &quot;uint*&quot;, needleHeight)
VarSetCapacity(needleRect, 16, 0)
NumPut(needleWidth, needleRect, 8, &quot;uint&quot;)
NumPut(needleHeight, needleRect, 12, &quot;uint&quot;)
VarSetCapacity(needleBitmapData, 16+2*A_PtrSize, 0)
DllCall(&quot;gdiplus\GdipBitmapLockBits&quot;, &quot;ptr&quot;, needlePbitmap, &quot;ptr&quot;, &amp;needleRect, &quot;uint&quot;, ReadWrite := 3, &quot;int&quot;, Format32bppArgb := 2498570, &quot;ptr&quot;, &amp;needleBitmapData)
needleStride := NumGet(needleBitmapData, 8, &quot;int&quot;)
needleScan := NumGet(needleBitmapData, 16, &quot;ptr&quot;)
if needleTrans
{
   VarSetCapacity(TransColor, 4)
   NumPut(needleTrans, TransColor, 0, &quot;int&quot;)
   DllCall(MCode_SetBitmapTransColor, &quot;ptr&quot;, needleScan, &quot;int&quot;, needleStride, &quot;int&quot;, needleWidth, &quot;int&quot;, needleHeight, &quot;ptr&quot;, &amp;TransColor, &quot;cdecl int&quot;)
}

; Получаем необходимые данные haystack c экрана через bitblt (можно использовать любые другие апи).
hDC := DllCall(&quot;GetDC&quot;, &quot;ptr&quot;, 0, &quot;ptr&quot;)
hBitmap := DllCall(&quot;CreateCompatibleBitmap&quot;, &quot;ptr&quot;, hDC, &quot;int&quot;, haystackX2, &quot;int&quot;, haystackY2, &quot;ptr&quot;)
pDC := DllCall(&quot;CreateCompatibleDC&quot;, &quot;ptr&quot;, hDC, &quot;ptr&quot;)
oBM := DllCall(&quot;SelectObject&quot;, &quot;ptr&quot;, pDC, &quot;ptr&quot;, hBitmap, &quot;ptr&quot;)
DllCall(&quot;BitBlt&quot;, &quot;ptr&quot;, pDC, &quot;int&quot;, 0, &quot;int&quot;, 0, &quot;int&quot;, haystackX2, &quot;int&quot;, haystackY2, &quot;ptr&quot;, hDC, &quot;int&quot;, 0, &quot;int&quot;, 0, &quot;uint&quot;, SRCCOPY := 0x00CC0020)
DllCall(&quot;SelectObject&quot;, &quot;ptr&quot;, pDC, &quot;ptr&quot;, oBM)
DllCall(&quot;DeleteDC&quot;, &quot;ptr&quot;, pDC)
DllCall(&quot;ReleaseDC&quot;, &quot;ptr&quot;, 0, &quot;ptr&quot;, hDC)
DllCall(&quot;gdiplus\GdipCreateBitmapFromHBITMAP&quot;, &quot;ptr&quot;, hBitmap, &quot;ptr&quot;, 0, &quot;ptr*&quot;, haystackPbitmap)
DllCall(&quot;DeleteObject&quot;, &quot;ptr&quot;, hBitmap)
VarSetCapacity(haystackRect, 16, 0)
NumPut(haystackX2, haystackRect, 8, &quot;uint&quot;)
NumPut(haystackY2, haystackRect, 12, &quot;uint&quot;)
VarSetCapacity(haystackBitmapData, 16+2*A_PtrSize, 0)
DllCall(&quot;gdiplus\GdipBitmapLockBits&quot;, &quot;ptr&quot;, haystackPbitmap, &quot;ptr&quot;, &amp;haystackRect, &quot;uint&quot;, ReadWrite := 3, &quot;int&quot;, Format32bppArgb := 2498570, &quot;ptr&quot;, &amp;haystackBitmapData)
haystackStride := NumGet(haystackBitmapData, 8, &quot;int&quot;)
haystackScan := NumGet(haystackBitmapData, 16, &quot;ptr&quot;)

; Если есть необходимость можно посмотреть, какие изображения получились откоментировав следующие 2 строчки
;gosub, haystackSave
;gosub, needleSave

; Сам поиск
if !DllCall(MCode_ImageSearch, &quot;int*&quot;, FoundX, &quot;int*&quot;, FoundY, &quot;ptr&quot;, haystackScan, &quot;int&quot;, haystackStride, &quot;int&quot;, haystackX1, &quot;int&quot;, haystackY1, &quot;int&quot;, haystackX2, &quot;int&quot;, haystackY2, &quot;ptr&quot;, needleScan, &quot;int&quot;, needleStride, &quot;int&quot;, needleWidth, &quot;int&quot;, needleHeight, &quot;int&quot;, variation, &quot;cdecl int&quot;)
   msgbox % FoundX &quot;`n&quot; FoundY
else
   msgbox not found

; Мультипоиск
VarSetCapacity(array, 1000, 0)   ;  для 125 совпадений, если надо больше, то нужно увеличить
n := DllCall(MCode_ImageSearchList, &quot;ptr&quot;, &amp;array, &quot;ptr&quot;, haystackScan, &quot;int&quot;, haystackStride, &quot;int&quot;, haystackX1, &quot;int&quot;, haystackY1, &quot;int&quot;, haystackX2, &quot;int&quot;, haystackY2, &quot;ptr&quot;, needleScan, &quot;int&quot;, needleStride, &quot;int&quot;, needleWidth, &quot;int&quot;, needleHeight, &quot;int&quot;, variation, &quot;cdecl int&quot;)
if (n != 0)
{
   list := &quot;Found &quot; n//2 &quot; occurrences:&quot;
   loop % n//2
      list .= &quot;`nx&quot; NumGet(array, (A_Index - 1)*8, &quot;int&quot;) &quot; y&quot; NumGet(array, (A_Index-1)*8+4, &quot;int&quot;)
   msgbox % list
}
else
   msgbox not found

; При необходимости  освобождаем ресурсы haystack
DllCall(&quot;gdiplus\GdipBitmapUnlockBits&quot;, &quot;ptr&quot;, haystackPbitmap, &quot;ptr&quot;, &amp;haystackBitmapData)
DllCall(&quot;gdiplus\GdipDisposeImage&quot;, &quot;ptr&quot;, haystackPbitmap)

; При необходимости  освобождаем ресурсы needle
DllCall(&quot;gdiplus\GdipBitmapUnlockBits&quot;, &quot;ptr&quot;, needlePbitmap, &quot;ptr&quot;, &amp;needleBitmapData)
DllCall(&quot;gdiplus\GdipDisposeImage&quot;, &quot;ptr&quot;, needlePbitmap)
return


haystackSave:
needleSave:
save := SubStr(A_ThisLabel, 1, -4)
if (save = &quot;haystack&quot;)
   saveWidth := haystackX2, saveHeight := haystackY2
else
   saveWidth := needleWidth, saveHeight := needleHeight
DllCall(&quot;gdiplus\GdipGetImageEncodersSize&quot;, &quot;uint*&quot;, count, &quot;uint*&quot;, size)
VarSetCapacity(ci, size)
DllCall(&quot;gdiplus\GdipGetImageEncoders&quot;, &quot;uint&quot;, count, &quot;uint&quot;, size, &quot;ptr&quot;, &amp;ci)
Loop % count
{
   EncoderExtensions := StrGet(NumGet(ci, (idx:=(48+7*A_PtrSize)*(A_Index-1))+32+3*A_PtrSize, &quot;ptr&quot;), &quot;utf-16&quot;)
   if InStr(EncoderExtensions, &quot;*.bmp&quot;)
   {
      pCodec := &amp;ci + idx
      break
   }
}
DllCall(&quot;gdiplus\GdipCreateBitmapFromScan0&quot;, &quot;int&quot;, saveWidth, &quot;int&quot;, saveHeight, &quot;int&quot;, %save%Stride, &quot;int&quot;, Format32bppArgb := 2498570, &quot;ptr&quot;, %save%Scan, &quot;ptr*&quot;, pBitmap)
DllCall(&quot;gdiplus\GdipSaveImageToFile&quot;, &quot;ptr&quot;, pBitmap, &quot;wstr&quot;, save &quot;_temp.bmp&quot;, &quot;ptr&quot;, pCodec, &quot;uint&quot;, 0)
DllCall(&quot;gdiplus\GdipDisposeImage&quot;, &quot;ptr&quot;, pBitmap)
return


MCode(mcode)
{
  static e := {1:4, 2:1}, c := (A_PtrSize=8) ? &quot;x64&quot; : &quot;x86&quot;
  if (!regexmatch(mcode, &quot;^([0-9]+),(&quot; c &quot;:|.*?,&quot; c &quot;:)([^,]+)&quot;, m))
    return
  if (!DllCall(&quot;crypt32\CryptStringToBinary&quot;, &quot;str&quot;, m3, &quot;uint&quot;, 0, &quot;uint&quot;, e[m1], &quot;ptr&quot;, 0, &quot;uint*&quot;, s, &quot;ptr&quot;, 0, &quot;ptr&quot;, 0))
    return
  p := DllCall(&quot;GlobalAlloc&quot;, &quot;uint&quot;, 0, &quot;ptr&quot;, s, &quot;ptr&quot;)
  if (c=&quot;x64&quot;)
    DllCall(&quot;VirtualProtect&quot;, &quot;ptr&quot;, p, &quot;ptr&quot;, s, &quot;uint&quot;, 0x40, &quot;uint*&quot;, op)
  if (DllCall(&quot;crypt32\CryptStringToBinary&quot;, &quot;str&quot;, m3, &quot;uint&quot;, 0, &quot;uint&quot;, e[m1], &quot;ptr&quot;, p, &quot;uint*&quot;, s, &quot;ptr&quot;, 0, &quot;ptr&quot;, 0))
    return p
  DllCall(&quot;GlobalFree&quot;, &quot;ptr&quot;, p)
}</code></pre></div><p>c++ функции:<br /></p><div class="codebox"><pre><code>int Gdip_ImageSearch(int * Foundx, int * Foundy, unsigned char * HayStack, int Stride1, int sx1, int sy1, int sx2, int sy2, unsigned char * Needle, int Stride2, int nw, int nh, int v)
{
   int y1, y2, x1, x2, tx, ty;
   sx2=sx2-nw+1; sy2=sy2-nh+1;
   if (v == 0)
   {
      for (y1 = sy1; y1 &lt; sy2; y1++)
      {
         for (x1 = sx1; x1 &lt; sx2; x1++)
         {
            ty = y1;
            for (y2 = 0; y2 &lt; nh; y2++)
            {
               tx = x1;
               for (x2 = 0; x2 &lt; nw; x2++)
               {
                  if (Needle[(4*x2)+(y2*Stride2)+2] == HayStack[(4*tx)+(ty*Stride1)+2]
                  &amp;&amp; Needle[(4*x2)+(y2*Stride2)+1] == HayStack[(4*tx)+(ty*Stride1)+1]
                  &amp;&amp; Needle[(4*x2)+(y2*Stride2)] == HayStack[(4*tx)+(ty*Stride1)]
                  || Needle[(4*x2)+(y2*Stride2)+3] == 0)
                     tx++;
                  else
                     goto NoMatch1;
               }
               ty++;
            }
            Foundx[0] = x1; Foundy[0] = y1;
            return 0;
            NoMatch1:;
         }
      }
   }
   else
   {
      for (y1 = sy1; y1 &lt; sy2; y1++)
      {
         for (x1 = sx1; x1 &lt; sx2; x1++)
         {
            ty = y1;
            for (y2 = 0; y2 &lt; nh; y2++)
            {
               tx = x1;
               for (x2 = 0; x2 &lt; nw; x2++)
               {
                  if (Needle[(4*x2)+(y2*Stride2)+2] &lt;= HayStack[(4*tx)+(ty*Stride1)+2]+v
                  &amp;&amp; Needle[(4*x2)+(y2*Stride2)+2] &gt;= HayStack[(4*tx)+(ty*Stride1)+2]-v
                  &amp;&amp; Needle[(4*x2)+(y2*Stride2)+1] &lt;= HayStack[(4*tx)+(ty*Stride1)+1]+v
                  &amp;&amp; Needle[(4*x2)+(y2*Stride2)+1] &gt;= HayStack[(4*tx)+(ty*Stride1)+1]-v
                  &amp;&amp; Needle[(4*x2)+(y2*Stride2)] &lt;= HayStack[(4*tx)+(ty*Stride1)]+v
                  &amp;&amp; Needle[(4*x2)+(y2*Stride2)] &gt;= HayStack[(4*tx)+(ty*Stride1)]-v
                  || Needle[(4*x2)+(y2*Stride2)+3] == 0)
                     tx++;
                  else
                     goto NoMatch2;
               }
               ty++;
            }
            Foundx[0] = x1; Foundy[0] = y1;
            return 0;
            NoMatch2:;
         }
      }
   }
   Foundx[0] = -1; Foundy[0] = -1;
   return -1;
}

int Gdip_ImageSearchList(int arr[], unsigned char * HayStack, int Stride1, int sx1, int sy1, int sx2, int sy2, unsigned char * Needle, int Stride2, int nw, int nh, int v)
{
   int y1, y2, x1, x2, tx, ty, hx, hy, n;
   n=0; sx2=sx2-nw+1; sy2=sy2-nh+1;
   if (v == 0)
   {
      for (y1 = sy1; y1 &lt; sy2; y1++)
      {
         for (x1 = sx1; x1 &lt; sx2; x1++)
         {
            ty = y1;
            for (y2 = 0; y2 &lt; nh; y2++)
            {
               tx = x1;
               for (x2 = 0; x2 &lt; nw; x2++)
               {
                  if (HayStack[(4*tx)+(ty*Stride1)+3] != 0)
				  {
				     if (Needle[(4*x2)+(y2*Stride2)+2] == HayStack[(4*tx)+(ty*Stride1)+2]
                     &amp;&amp; Needle[(4*x2)+(y2*Stride2)+1] == HayStack[(4*tx)+(ty*Stride1)+1]
                     &amp;&amp; Needle[(4*x2)+(y2*Stride2)] == HayStack[(4*tx)+(ty*Stride1)]
                     || Needle[(4*x2)+(y2*Stride2)+3] == 0)
                        tx++;
                     else
                        goto NoMatch1;
                  }
				  else
                     goto NoMatch1;
               }
               ty++;
            }
			arr[n++]=x1;
			arr[n++]=y1;
            for (hy = y1; hy &lt; y1+nh; hy++)
            {
			   for (hx = x1; hx &lt; x1+nw; hx++)
                  HayStack[(4*hx)+(hy*Stride1)+3] = 0;
            }
            NoMatch1:;
         }
      }
   }
   else
   {
      for (y1 = sy1; y1 &lt; sy2; y1++)
      {
         for (x1 = sx1; x1 &lt; sx2; x1++)
         {
            ty = y1;
            for (y2 = 0; y2 &lt; nh; y2++)
            {
               tx = x1;
               for (x2 = 0; x2 &lt; nw; x2++)
               {
                  if (HayStack[(4*tx)+(ty*Stride1)+3] != 0)
				  {
				     if (Needle[(4*x2)+(y2*Stride2)+2] &lt;= HayStack[(4*tx)+(ty*Stride1)+2]+v
                     &amp;&amp; Needle[(4*x2)+(y2*Stride2)+2] &gt;= HayStack[(4*tx)+(ty*Stride1)+2]-v
                     &amp;&amp; Needle[(4*x2)+(y2*Stride2)+1] &lt;= HayStack[(4*tx)+(ty*Stride1)+1]+v
                     &amp;&amp; Needle[(4*x2)+(y2*Stride2)+1] &gt;= HayStack[(4*tx)+(ty*Stride1)+1]-v
                     &amp;&amp; Needle[(4*x2)+(y2*Stride2)] &lt;= HayStack[(4*tx)+(ty*Stride1)]+v
                     &amp;&amp; Needle[(4*x2)+(y2*Stride2)] &gt;= HayStack[(4*tx)+(ty*Stride1)]-v
                     || Needle[(4*x2)+(y2*Stride2)+3] == 0)
                        tx++;
                     else
                        goto NoMatch2;
                  }
                  else
                     goto NoMatch2;
               }
               ty++;
            }
			arr[n++]=x1;
			arr[n++]=y1;
            for (hy = y1; hy &lt; y1+nh; hy++)
            {
			   for (hx = x1; hx &lt; x1+nw; hx++)
                  HayStack[(4*hx)+(hy*Stride1)+3] = 0;
            }
            NoMatch2:;
         }
      }
   }
   if (n != 0)
   {
      sx2=sx2+nw-1; sy2=sy2+nh-1;
      for (y1 = sy1; y1 &lt; sy2; y1++)
      {
         for (x1 = sx1; x1 &lt; sx2; x1++)
         {
            if (HayStack[(4*x1)+(y1*Stride1)+3] == 0)
               HayStack[(4*x1)+(y1*Stride1)+3] = 255;
         }
      }
   }
   return n;
}

int Gdip_SetBitmapTransColor(unsigned char * Scan, int Stride, int Width, int Height, unsigned char * Trans)
{
   int x1, y1, index;
   for (y1 = 0; y1 &lt; Height; y1++)
   {
      for (x1 = 0; x1 &lt; Width; x1++)
      {
         index = (4*x1)+(y1*Stride);
         if (Scan[index+2] == Trans[2] &amp;&amp; Scan[index+1] == Trans[1] &amp;&amp; Scan[index+0] == Trans[0])
            Scan[index+3] = 0;
      }
   }
   return 0;
}</code></pre></div><p><a href="http://forum.script-coding.com/viewtopic.php?id=16706">Тема для обсуждения</a></p>]]></content>
			<author>
				<name><![CDATA[Malcev]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=26930</uri>
			</author>
			<updated>2023-03-12T01:58:12Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=157091#p157091</id>
		</entry>
</feed>
