Hello,
I want to check if a image is in another image.
I found a piece of code, but if I want to find a circle (for example), and the circle has a transparent background, it doesn't find the circle, because in the other image the circle does have a colored background. Recoloring the background is not an option because the background can be too complex, how can I stop the program from checking if the transparent pixels are the same? Sorry for my bad english, I am not a native english speaker. I hope you can understand what I want.
Code:
I want to check if a image is in another image.
I found a piece of code, but if I want to find a circle (for example), and the circle has a transparent background, it doesn't find the circle, because in the other image the circle does have a colored background. Recoloring the background is not an option because the background can be too complex, how can I stop the program from checking if the transparent pixels are the same? Sorry for my bad english, I am not a native english speaker. I hope you can understand what I want.
Code:
VB.NET:
[COLOR=#00008B]Imports[/COLOR] System.Drawing
[COLOR=#00008B]Imports[/COLOR] System.Runtime.CompilerServices
[COLOR=#00008B]Imports[/COLOR] System.Drawing.Imaging
[COLOR=#00008B]Imports[/COLOR] System.Runtime.InteropServices
[COLOR=#00008B]Module[/COLOR] BitmapExtension
<Extension()>
[COLOR=#00008B]Public[/COLOR] [COLOR=#00008B]Function[/COLOR] Contains(src [COLOR=#00008B]As[/COLOR] Bitmap, [COLOR=#00008B]ByRef[/COLOR] bmp [COLOR=#00008B]As[/COLOR] Bitmap) [COLOR=#00008B]As[/COLOR] Point
[COLOR=gray]'[/COLOR]
[COLOR=gray]'-- Some logic pre-checks[/COLOR]
[COLOR=gray]'[/COLOR]
[COLOR=#00008B]If[/COLOR] src [COLOR=#00008B]Is[/COLOR] [COLOR=#800000]Nothing[/COLOR] [COLOR=#00008B]OrElse[/COLOR] bmp [COLOR=#00008B]Is[/COLOR] [COLOR=#800000]Nothing[/COLOR] [COLOR=#00008B]Then[/COLOR] [COLOR=#00008B]Return[/COLOR] [COLOR=#800000]Nothing[/COLOR]
[COLOR=#00008B]If[/COLOR] src.Width = bmp.Width [COLOR=#00008B]AndAlso[/COLOR] src.Height = bmp.Height [COLOR=#00008B]Then[/COLOR]
[COLOR=#00008B]If[/COLOR] src.GetPixel([COLOR=#800000]0[/COLOR], [COLOR=#800000]0[/COLOR]) = bmp.GetPixel([COLOR=#800000]0[/COLOR], [COLOR=#800000]0[/COLOR]) [COLOR=#00008B]Then[/COLOR]
[COLOR=#00008B]Return[/COLOR] [COLOR=#00008B]New[/COLOR] Point([COLOR=#800000]0[/COLOR], [COLOR=#800000]0[/COLOR])
[COLOR=#00008B]Else[/COLOR]
[COLOR=#00008B]Return[/COLOR] [COLOR=#800000]Nothing[/COLOR]
[COLOR=#00008B]End[/COLOR] [COLOR=#00008B]If[/COLOR]
[COLOR=#00008B]ElseIf[/COLOR] src.Width < bmp.Width [COLOR=#00008B]OrElse[/COLOR] src.Height < bmp.Height [COLOR=#00008B]Then[/COLOR]
[COLOR=#00008B]Return[/COLOR] [COLOR=#800000]Nothing[/COLOR]
[COLOR=#00008B]End[/COLOR] [COLOR=#00008B]If[/COLOR]
[COLOR=gray]'[/COLOR]
[COLOR=gray]'-- Prepare optimizations[/COLOR]
[COLOR=gray]'[/COLOR]
[COLOR=#00008B]Dim[/COLOR] sr [COLOR=#00008B]As[/COLOR] [COLOR=#00008B]New[/COLOR] Rectangle([COLOR=#800000]0[/COLOR], [COLOR=#800000]0[/COLOR], src.Width, src.Height)
[COLOR=#00008B]Dim[/COLOR] br [COLOR=#00008B]As[/COLOR] [COLOR=#00008B]New[/COLOR] Rectangle([COLOR=#800000]0[/COLOR], [COLOR=#800000]0[/COLOR], bmp.Width, bmp.Height)
[COLOR=#00008B]Dim[/COLOR] srcLock [COLOR=#00008B]As[/COLOR] BitmapData = src.LockBits(sr, Imaging.ImageLockMode.[COLOR=#00008B]ReadOnly[/COLOR], PixelFormat.Format24bppRgb)
[COLOR=#00008B]Dim[/COLOR] bmpLock [COLOR=#00008B]As[/COLOR] BitmapData = bmp.LockBits(br, Imaging.ImageLockMode.[COLOR=#00008B]ReadOnly[/COLOR], PixelFormat.Format24bppRgb)
[COLOR=#00008B]Dim[/COLOR] sStride [COLOR=#00008B]As[/COLOR] [COLOR=#00008B]Integer[/COLOR] = srcLock.Stride
[COLOR=#00008B]Dim[/COLOR] bStride [COLOR=#00008B]As[/COLOR] [COLOR=#00008B]Integer[/COLOR] = bmpLock.Stride
[COLOR=#00008B]Dim[/COLOR] srcSz [COLOR=#00008B]As[/COLOR] [COLOR=#00008B]Integer[/COLOR] = sStride * src.Height
[COLOR=#00008B]Dim[/COLOR] bmpSz [COLOR=#00008B]As[/COLOR] [COLOR=#00008B]Integer[/COLOR] = bStride * bmp.Height
[COLOR=#00008B]Dim[/COLOR] srcBuff(srcSz) [COLOR=#00008B]As[/COLOR] [COLOR=#00008B]Byte[/COLOR]
[COLOR=#00008B]Dim[/COLOR] bmpBuff(bmpSz) [COLOR=#00008B]As[/COLOR] [COLOR=#00008B]Byte[/COLOR]
Marshal.Copy(srcLock.Scan0, srcBuff, [COLOR=#800000]0[/COLOR], srcSz)
Marshal.Copy(bmpLock.Scan0, bmpBuff, [COLOR=#800000]0[/COLOR], bmpSz)
[COLOR=gray]' we don't need to lock the image anymore as we have a local copy[/COLOR]
bmp.UnlockBits(bmpLock)
src.UnlockBits(srcLock)
[COLOR=#00008B]Dim[/COLOR] x, y, x2, y2, sx, sy, bx, by, sw, sh, bw, bh [COLOR=#00008B]As[/COLOR] [COLOR=#00008B]Integer[/COLOR]
[COLOR=#00008B]Dim[/COLOR] r, g, b [COLOR=#00008B]As[/COLOR] [COLOR=#00008B]Byte[/COLOR]
[COLOR=#00008B]Dim[/COLOR] p [COLOR=#00008B]As[/COLOR] Point = [COLOR=#800000]Nothing[/COLOR]
bw = bmp.Width
bh = bmp.Height
sw = src.Width - bw [COLOR=gray]' limit scan to only what we need. the extra corner[/COLOR]
sh = src.Height - bh [COLOR=gray]' point we need is taken care of in the loop itself.[/COLOR]
bx = [COLOR=#800000]0[/COLOR] : by = [COLOR=#800000]0[/COLOR]
[COLOR=gray]'[/COLOR]
[COLOR=gray]'-- Scan source for bitmap[/COLOR]
[COLOR=gray]'[/COLOR]
[COLOR=#00008B]For[/COLOR] y = [COLOR=#800000]0[/COLOR] [COLOR=#00008B]To[/COLOR] sh
sy = y * sStride
[COLOR=#00008B]For[/COLOR] x = [COLOR=#800000]0[/COLOR] [COLOR=#00008B]To[/COLOR] sw
sx = sy + x * [COLOR=#800000]3[/COLOR]
[COLOR=gray]'[/COLOR]
[COLOR=gray]'-- Find start point/pixel[/COLOR]
[COLOR=gray]'[/COLOR]
r = srcBuff(sx + [COLOR=#800000]2[/COLOR])
g = srcBuff(sx + [COLOR=#800000]1[/COLOR])
b = srcBuff(sx)
[COLOR=#00008B]If[/COLOR] r = bmpBuff([COLOR=#800000]2[/COLOR]) [COLOR=#00008B]AndAlso[/COLOR] g = bmpBuff([COLOR=#800000]1[/COLOR]) [COLOR=#00008B]AndAlso[/COLOR] b = bmpBuff([COLOR=#800000]0[/COLOR]) [COLOR=#00008B]Then[/COLOR]
p = [COLOR=#00008B]New[/COLOR] Point(x, y)
[COLOR=gray]'[/COLOR]
[COLOR=gray]'-- We have a pixel match, check the region[/COLOR]
[COLOR=gray]'[/COLOR]
[COLOR=#00008B]For[/COLOR] y2 = [COLOR=#800000]0[/COLOR] [COLOR=#00008B]To[/COLOR] bh - [COLOR=#800000]1[/COLOR]
by = y2 * bStride
[COLOR=#00008B]For[/COLOR] x2 = [COLOR=#800000]0[/COLOR] [COLOR=#00008B]To[/COLOR] bw - [COLOR=#800000]1[/COLOR]
bx = by + x2 * [COLOR=#800000]3[/COLOR]
sy = (y + y2) * sStride
sx = sy + (x + x2) * [COLOR=#800000]3[/COLOR]
r = srcBuff(sx + [COLOR=#800000]2[/COLOR])
g = srcBuff(sx + [COLOR=#800000]1[/COLOR])
b = srcBuff(sx)
[COLOR=#00008B]If[/COLOR] [COLOR=#00008B]Not[/COLOR] (r = bmpBuff(bx + [COLOR=#800000]2[/COLOR]) [COLOR=#00008B]AndAlso[/COLOR]
g = bmpBuff(bx + [COLOR=#800000]1[/COLOR]) [COLOR=#00008B]AndAlso[/COLOR]
b = bmpBuff(bx)) [COLOR=#00008B]Then[/COLOR]
[COLOR=gray]'[/COLOR]
[COLOR=gray]'-- Not matching, continue checking[/COLOR]
[COLOR=gray]'[/COLOR]
p = [COLOR=#800000]Nothing[/COLOR]
sy = y * sStride
[COLOR=#00008B]Exit[/COLOR] [COLOR=#00008B]For[/COLOR]
[COLOR=#00008B]End[/COLOR] [COLOR=#00008B]If[/COLOR]
[COLOR=#00008B]Next[/COLOR]
[COLOR=#00008B]If[/COLOR] p = [COLOR=#800000]Nothing[/COLOR] [COLOR=#00008B]Then[/COLOR] [COLOR=#00008B]Exit[/COLOR] [COLOR=#00008B]For[/COLOR]
[COLOR=#00008B]Next[/COLOR]
[COLOR=#00008B]End[/COLOR] [COLOR=#00008B]If[/COLOR] [COLOR=gray]'end of region check[/COLOR]
[COLOR=#00008B]If[/COLOR] p <> [COLOR=#800000]Nothing[/COLOR] [COLOR=#00008B]Then[/COLOR] [COLOR=#00008B]Exit[/COLOR] [COLOR=#00008B]For[/COLOR]
[COLOR=#00008B]Next[/COLOR]
[COLOR=#00008B]If[/COLOR] p <> [COLOR=#800000]Nothing[/COLOR] [COLOR=#00008B]Then[/COLOR] [COLOR=#00008B]Exit[/COLOR] [COLOR=#00008B]For[/COLOR]
[COLOR=#00008B]Next[/COLOR]
bmpBuff = [COLOR=#800000]Nothing[/COLOR]
srcBuff = [COLOR=#800000]Nothing[/COLOR]
[COLOR=#00008B]Return[/COLOR] p
[COLOR=#00008B]End[/COLOR] [COLOR=#00008B]Function[/COLOR]
[COLOR=#00008B]End[/COLOR] [COLOR=#00008B]Module[/COLOR]