Click here to Skip to main content
15,886,578 members
Articles / Desktop Programming / MFC

Target Eye Revealed: Part 2 - Target Eye's Screen Capturing

Rate me:
Please Sign up or sign in to vote.
4.96/5 (51 votes)
12 Jun 2014CPOL10 min read 112.4K   3.7K   85  
How Target Eye's screen capturing mechanism works
This article is the second one in the Target Eye Revealed series, and discusses the screen capturing mechanism. After taking a look at the purpose of screen capturing, we will see a few screenshot files followed by steps in capturing the screen. We will also get to learn how to use the source code.
/*---------------------------------------------------------

   ISMorphoEffects : part of the ImgSource library.

	This code copyright (c) 2000-2012, Smaller Animals Software, Inc..

	No portion of this code may be copied or distributed without 
	permission of Smaller Animals Software, Inc..
	http://www.smalleranimals.com

---------------------------------------------------------*/

#pragma once

#if !defined is5_SOURCEH && !defined is5_INTERNAL
#error Do not include this file directly. Include ISource.h
#endif

#ifdef __cplusplus
extern "C" {
#endif

	
/*---------------------------------------------------------
   is5_MorphoDilationGray / _is5_MorphoDilationGray

   Purpose : 
   Apply a morphological dilation filter to a grayscale 
   image.

   Note:
   The default behavior for this function is:
   1. pass the mask over the source image.
   2. for each value in the mask, add its value to the pixel it overlays
   3. set the output value to the maximum of these additions.

   The behavior enabled by bit 0 of uFlags is:
   1. pass the mask over the source image.
   2. find the maximum of all pixels below non-zero mask values
   3. set the output value to that maximum.

   In the first mode, the output values are increased by the mask values.
   In the second mode, they are not.

   Param             Use
   ------------------------------------
   pInGray           input grayscale image
   uWidth            width in pixels
   uHeight           height
   uInRowStride      bytes per input pixel row
   pMask             N x N integer mask array

   N                 number of elements in one dimension of pMask.
                     N must be odd and greater than 0

   pOutGray          output grayscale image. allocated by caller
   uOutRowStride     bytes per output pixel row

   uFlags			 bit			use
					 ---			---
                     0              do not add mask elements to output pixel.
					 20             disable multithreaded processing

   Return
   ------
      FALSE on failure
---------------------------------------------------------*/
_ISDeclSpec BOOL        _ISCConv _ISFn( is5_MorphoDilationGray )(const BYTE *pInGray, UINT32 w, UINT32 h, UINT32 uInRowStride, const int *mask, int N, BYTE *pOutGray, UINT32 uOutRowStride, UINT32 uFlags);

/*---------------------------------------------------------
   is5_MorphoErosionGray / _is5_MorphoErosionGray

   Purpose : 
   Apply a morphological erosion filter to a grayscale 
   image.

   Note:
   The default behavior for this function is:
   1. pass the mask over the source image.
   2. for each value in the mask, subtract its value from the pixel it overlays
   3. set the output value to the minimum of these subtractions.

   The behavior enabled by bit 0 of uFlags is:
   1. pass the mask over the source image.
   2. find the minimum of all pixels below non-zero mask values
   3. set the output value to that minimum.

   In the first mode, the output values are decreased by the mask values.
   In the second mode, they are not.

   Param             Use
   ------------------------------------
   pInGray           input grayscale image
   uWidth            width in pixels
   uHeight           height
   uInRowStride      bytes per input pixel row

   pMask             N x N integer mask array

   N                 number of elements in one dimension of pMask.
                     N must be odd and greater than 0

   pOutGray          output grayscale image. allocated by caller
   uOutRowStride     bytes per output pixel row


   uFlags			 bit			use
					 ---			---
                     0              do not subtract mask elements from output pixel.
					 20             disable multithreaded processing


   Return
   ------
      FALSE on failure
---------------------------------------------------------*/
_ISDeclSpec BOOL        _ISCConv _ISFn( is5_MorphoErosionGray )(const BYTE *pInGray, UINT32 w, UINT32 h, UINT32 uInRowStride, const int* mask, int N, BYTE *pOutGray, UINT32 uOutRowStride, UINT32 uFlags);

/*---------------------------------------------------------
   is5_CloseGray

   Purpose : 
   Apply morphological "close" to an 8-bit image

   Notes:
      *  pIn != pOut.
      *  Output is allocated by the caller.

   Param             Use
   ------------------------------------
   pInGray           source image
   uWidth            width in pixels
   uHeight           height
   uInRowStride      bytes per input pixel row
   piMask            matrix (NxN values)
   N                 matrix size (actual matrix has NxN values)
   pOutGray          output image
   uOutRowStride     bytes per output pixel row


   uFlags			bit			use
					---			---
                     0          use non-summing erosion and dilation.
                                see notes for is5_MorphoDilationGray, is5_MorphoErosionGray.

					20          disable multithreaded processing

   Return
   ------
   FALSE on failure
---------------------------------------------------------*/
_ISDeclSpec BOOL _ISCConv _ISFn( is5_CloseGray )(const BYTE *pInGray, UINT32 uWidth, UINT32 uHeight, UINT32 uInRowStride, const int *piMask, int N, BYTE *pOutGray, UINT32 uOutRowStride, UINT32 uFlags);

/*---------------------------------------------------------
   is5_OpenGray

   Purpose : 
   Apply morphological "open" to an 8-bit image

   Notes:
      *  pIn != pOut.
      *  Output is allocated by the caller.

   Param             Use
   ------------------------------------
   pInGray           source image
   uWidth            width in pixels
   uHeight           height
   uInRowStride      bytes per input pixel row
   piMask            matrix (NxN values)
   N                 matrix size (actual matrix has NxN values)
   pOutGray          output image
   uOutRowStride     bytes per output pixel row


   uFlags			bit			use
					---			---
                     0          use non-summing erosion and dilation.
                                see notes for is5_MorphoDilationGray, is5_MorphoErosionGray.

					20          disable multithreaded processing

   Return
   ------
   FALSE on failure
---------------------------------------------------------*/
_ISDeclSpec BOOL _ISCConv _ISFn( is5_OpenGray )(const BYTE *pInGray, UINT32 uWidth, UINT32 uHeight, UINT32 uInRowStride, const int *piMask, int N, BYTE *pOutGray, UINT32 uOutRowStride, UINT32 uFlags);

/*---------------------------------------------------------
   is5_TophatGray

   Purpose : 
   Apply morphological "tophat" to an 8-bit image

   Notes:
      *  pIn != pOut.
      *  Output is allocated by the caller.

   Param             Use
   ------------------------------------
   pInGray           source image
   uWidth            width in pixels
   uHeight           height
   uInRowStride      bytes per input pixel row
   piMask            matrix (NxN values)
   N                 matrix size (actual matrix has NxN values)
   pOutGray          output image
   uOutRowStride     bytes per output pixel row

   uFlags			bit			use
					---			---
                     0          use non-summing erosion and dilation.
                                see notes for is5_MorphoDilationGray, is5_MorphoErosionGray.

					20          disable multithreaded processing

   Return
   ------
   FALSE on failure
---------------------------------------------------------*/
_ISDeclSpec BOOL _ISCConv _ISFn( is5_TophatGray )(const BYTE *pInGray, UINT32 uWidth, UINT32 uHeight, UINT32 uInRowStride, const int *piMask, int N, BYTE *pOutGray, UINT32 uOutRowStride, UINT32 uFlags);

/*---------------------------------------------------------
   is5_MorphoGradientGray

   Purpose : 
   Find the morphological gradient of an 8-bit image.

   This highlights sharp gray-level transitions (edges)
   in an image.

   Notes:
      *  pIn != pOut.
      *  Output is allocated by the caller.

   Param             Use
   ------------------------------------
   pInGray           source image
   uWidth            width in pixels
   uHeight           height
   uInRowStride      bytes per input pixel row
   pMask             matrix (NxN values)
   N                 matrix size (actual matrix has NxN values)
   pOutGray          output image
   uOutRowStride     bytes per output pixel row

   uFlags			bit			use
					---			---
                     0          use non-summing erosion and dilation.
                                see notes for is5_MorphoDilationGray, is5_MorphoErosionGray.

					20          disable multithreaded processing

   Return
   ------
   FALSE on failure
---------------------------------------------------------*/
_ISDeclSpec BOOL _ISCConv _ISFn( is5_MorphoGradientGray )(const BYTE *pInGray, UINT32 w, UINT32 h, UINT32 uInRowStride, const int *pMask, int N, BYTE *pOutGray, UINT32 uOutRowStride, UINT32 uFlags);

/*---------------------------------------------------------
   is5_MorphoDilation1Bit

   Purpose : 
   Apply a morphological dilation to a 1-bit image.

   Notes:
      *  pIn != pOut.
      *  Output is allocated by the caller.
      *  Output should be set to all 0's before calling this function

   Param             Use
   ------------------------------------
   pIn               input 1-bit image
   uWidth            width in pixels
   uHeight           height
   uInRowStride      bytes per input pixel row
   pOut              output 1-bit image
   uOutRowStride     bytes per output pixel row
   pMask             N x J integer mask array

   N                 number of columns in pMask.
                     N must be odd and greater than 0

   J                 number of rows in pMask.
                     J must be odd and greater than 0

   uFlags			bit			use
					---			---
					20			disable multithreaded processing



   Return
   ------
   FALSE on failure
---------------------------------------------------------*/
_ISDeclSpec BOOL _ISCConv _ISFn( is5_MorphoDilation1Bit )(const BYTE *pIn, UINT32 uWidth, UINT32 uHeight, UINT32 uInRowStride, BYTE *pOut, UINT32 uOutRowStride, const int *mask, UINT32 uFilterSizeX, UINT32 uFilterSizeY, UINT32 uFlags);

/*---------------------------------------------------------
   is5_MorphoErosion1Bit

   Purpose : 
   Apply a morphological erosion to a 1-bit image.

   Notes:
      *  pIn != pOut.
      *  Output is allocated by the caller.
      *  Output should be set to all 0's before calling this function

   Param             Use
   ------------------------------------
   pIn               input 1-bit image
   uWidth            width in pixels
   uHeight           height
   uInRowStride      bytes per input pixel row
   pOut              output 1-bit image
   uOutRowStride     bytes per output pixel row
   pMask             N x J integer mask array

   N                 number of columns in pMask.
                     N must be odd and greater than 0

   J                 number of rows in pMask.
                     J must be odd and greater than 0

   uFlags			bit			use
					---			---
					20			disable multithreaded processing


   Return
   ------
   FALSE on failure
---------------------------------------------------------*/
_ISDeclSpec BOOL _ISCConv _ISFn( is5_MorphoErosion1Bit )(const BYTE *pIn, UINT32 uWidth, UINT32 uHeight, UINT32 uInRowStride, BYTE *pOut, UINT32 uOutRowStride, const int *mask, UINT32 N, UINT32 J, UINT32 uFlags);

/*---------------------------------------------------------
   is5_MorphoClose1Bit

   Notes:
      *  pIn != pOut.
      *  Output is allocated by the caller.
      *  Output should be set to all 0's before calling this function

   Purpose : 
   Apply a morphological close to a 1-bit image.

   Notes:
      *  pIn != pOut.
      *  Output is allocated by the caller.
      *  Output should be set to all 0's before calling this function

   Param             Use
   ------------------------------------
   pIn               input 1-bit image
   uWidth            width in pixels
   uHeight           height
   uInRowStride      bytes per input pixel row
   pOut              output 1-bit image
   uOutRowStride     bytes per output pixel row
   pMask             N x J integer mask array

   N                 number of columns in pMask.
                     N must be odd and greater than 0

   J                 number of rows in pMask.
                     J must be odd and greater than 0

   uFlags			bit			use
					---			---
					20			disable multithreaded processing


   Return
   ------
   FALSE on failure
---------------------------------------------------------*/
_ISDeclSpec BOOL _ISCConv _ISFn( is5_MorphoClose1Bit )(const BYTE *pIn, UINT32 uWidth, UINT32 uHeight, UINT32 uInRowStride, BYTE *pOut, UINT32 uOutRowStride, const int *mask, UINT32 uFilterSizeX, UINT32 uFilterSizeY ,UINT32 uFlags);

/*---------------------------------------------------------
   is5_MorphoOpen1Bit

   Purpose : 
   Apply a morphological open to a 1-bit image.

   Notes:
      *  pIn != pOut.
      *  Output is allocated by the caller.
      *  Output should be set to all 0's before calling this function

   Param             Use
   ------------------------------------
   pIn               input 1-bit image
   uWidth            width in pixels
   uHeight           height
   uInRowStride      bytes per input pixel row
   pOut              output 1-bit image
   uOutRowStride     bytes per output pixel row
   pMask             N x J integer mask array

   N                 number of columns in pMask.
                     N must be odd and greater than 0

   J                 number of rows in pMask.
                     J must be odd and greater than 0

   uFlags			bit			use
					---			---
					20			disable multithreaded processing



   Return
   ------
   FALSE on failure
---------------------------------------------------------*/
_ISDeclSpec BOOL _ISCConv _ISFn( is5_MorphoOpen1Bit )(const BYTE *pIn, UINT32 uWidth, UINT32 uHeight, UINT32 uInRowStride, BYTE *pOut, UINT32 uOutRowStride, const int *pMask, UINT32 N, UINT32 J, UINT32 uFlags);

/*---------------------------------------------------------
   is5_MorphoHitOrMiss1Bit

   Purpose : 
   Perform a hit-or-miss transformation on a 1-bit image.

   Hit or Miss is a basic tool for finding geometric shapes
   within an image. The masks used determine the shapes that
   are detected.

   Mask A operates on foreground features and mask B 
   on background features. Together they detect 
   foreground-background transitions in the input image.
   
   The two masks used are normally the same size and _must_ 
   contain mutually-exclusive elements: if a mask position
   in A contains a 1, the corresponding position in B must 
   contain a 0.


   Ex:

   These masks will find vertical edges on the left sides of 
   the foreground image.

   mask A:     mask B:
   0 0 0       0 0 0 
   0 1 1       1 0 0
   0 0 0       0 0 0

   Notes:
      *  pIn != pOut.
      *  Output is allocated by the caller.
      *  Output should be set to all 0's before calling this function

   Param             Use
   ------------------------------------
   pIn               input 1-bit image
   uWidth            width in pixels
   uHeight           height
   uInRowStride      bytes per input pixel row
   pOut              output 1-bit image
   uOutRowStride     bytes per output pixel row
   pMaskA            Na x Ja integer mask array

   Na                number of columns in pMaskA.
                     Na must be odd and greater than 0 

   Ja                number of rows in pMaskA.
                     Ja must be odd and greater than 0 

   pMaskB            Nb x Jb integer mask array

   Nb                number of columns in pMaskB.
                     Nb must be odd and greater than 0

   Jb                number of rows in pMaskB.
                     Jb must be odd and greater than 0

   uFlags			bit			use
					---			---
					20			disable multithreaded processing



   Return
   ------
   FALSE on failure
---------------------------------------------------------*/
_ISDeclSpec BOOL _ISCConv _ISFn( is5_MorphoHitOrMiss1Bit )(const BYTE *pIn, UINT32 uWidth, UINT32 uHeight, UINT32 uInRowStride, BYTE *pOut, UINT32 uOutRowStride, const int *pMaskA, UINT32 Na, UINT32 Ja, const int *maskB, UINT32 Nb, UINT32 Jb, UINT32 uFlags);

/*---------------------------------------------------------
   is5_MorphoBoundaryExtraction1Bit

   Purpose : 
   Perform a boundary detection/extraction on a 1-bit image.
   This will generate an outline of the foreground features of 
   the input image.

   A typical mask is 3x3 with all elements set to 1.

   Notes:
      *  pIn != pOut.
      *  Output is allocated by the caller.
      *  Output should be set to all 0's before calling this function

   Param             Use
   ------------------------------------
   pIn               input 1-bit image
   uWidth            width in pixels
   uHeight           height
   uInRowStride      bytes per input pixel row
   pOut              output 1-bit image
   uOutRowStride     bytes per output pixel row
   pMask             N x J integer mask array

   N                 number of columns in pMask.
                     N must be odd and greater than 0

   J                 number of rows in pMask.
                     J must be odd and greater than 0

   uFlags			bit			use
					---			---
					20			disable multithreaded processing


   Return
   ------
   FALSE on failure
---------------------------------------------------------*/
_ISDeclSpec BOOL _ISCConv _ISFn( is5_MorphoBoundaryExtraction1Bit )(const BYTE *pIn, UINT32 uWidth, UINT32 uHeight, UINT32 uInRowStride, BYTE *pOut, UINT32 uOutRowStride, const int *pMask, UINT32 N, UINT32 J, UINT32 uFlags);

/*---------------------------------------------------------
   is5_MorphoThinning1Bit

   Purpose : 
   Apply morphological thinning to a 1-bit image. This
   will reduce the geometric size of an image, leaving only 
   a skeletonized frame behind.

   This function requires two sets of masks. the A masks represents
   foreground matching masks and the B masks should be the compliements
   of the A masks. (swap ones and zeros).

   A typical set of A masks is:

   0 0 0   1 0 0   1 1 0   1 1 1   1 1 1   1 1 1   0 1 1   0 0 1
   1 1 1   1 1 0   1 1 0   1 1 0   1 1 1   0 1 1   0 1 1   0 1 1
   1 1 1   1 1 1   1 1 0   1 0 0   0 0 0   0 0 1   0 1 1   1 1 1

   The B masks are compliments of these (1 and 0 reversed).

   Note that the content of each mask is the preceding mask, rotated 45 deg.
   
   The process works by applying each of these masks in pairs (A[x], B[x])
   for all pairs, until maxIterations has been reached or until there is
   no change in the image. This can be a long process.

   Notes:
      *  pIn != pOut.
      *  Output is allocated by the caller.
      *  Output should be set to all 0's before calling this function

   Param             Use
   ------------------------------------
   pIn               input 1-bit image
   uWidth            width in pixels
   uHeight           height
   uInRowStride      bytes per input pixel row
   pOut              output 1-bit image

   pMasksA           an array of foreground masks

   uFilterSizeA      number of elements in one dimension of one 
                     element in pMaskA. must be odd and greater than 0

   pMasksB           an array of background masks. must be the same size
                     as pMasksA.

   uFilterSizeB      number of elements in one dimension of one 
                     element in pMaskB. must be odd and greater than 0.
                     should be the same as uFilterSizeA.

   uMaskCount        number of masks in pMasksA (and pMasksB)

   uMaxIterations    maximum number of thinning iterations to try. may stop
                     early, if the process yields no changes in the image.

   uFlags			bit			use
					---			---
					20			disable multithreaded processing



   Return
   ------
   FALSE on failure
---------------------------------------------------------*/
_ISDeclSpec BOOL _ISCConv _ISFn( is5_MorphoThinning1Bit )(const BYTE *pIn, UINT32 uWidth, UINT32 uHeight, UINT32 uInRowStride, BYTE *pOut, 
                            const int *masksA[], UINT32 uFilterSizeA, const int *masksB[], UINT32 uFilterSizeB, UINT32 uMaskCount, UINT32 uMaxIterations, UINT32 uFlags);

/*---------------------------------------------------------
   is5_InvertBuffer

   Purpose : 
   Invert all bits in a buffer. 
   
   Among other things, this can be used to implement
   the image compliment of a 1-bit image during 
   morphological processing.

   Param             Use
   ------------------------------------
   pIn               input buffer
   uLen              buffer size in bytes

   Return
   ------
   FALSE on failure
---------------------------------------------------------*/
_ISDeclSpec BOOL _ISCConv _ISFn( is5_InvertBuffer )(void * pBuf, UINT32 uLen);

/*---------------------------------------------------------
   is5_InvertBuffer

   Purpose : 
   Copy one buffer to another, with all bits inverted.
   
   Among other things, this can be used to implement
   the image compliment of a 1-bit image during 
   morphological processing.

   Param             Use
   ------------------------------------
   pIn               input buffer
	pOut					output buffer
   uLen              buffer size in bytes

   Return
   ------
   FALSE on failure
---------------------------------------------------------*/
_ISDeclSpec void _ISCConv _ISFn( is5_CopyInvertedBuffer )(const void *pIn, void *pOut, UINT32 uLen);

/*---------------------------------------------------------
   is5_IntersectBuffers

   Purpose : 
   Combine two buffers using a logical AND. 
   
   Among other things, this can be used to implement
   the intersection of two 1-bit images during morphological 
   processing.

   Param             Use
   ------------------------------------
   pA                input buffer 1
   pB                input buffer 2
   pOut              output buffer (may be pA or pB)
   uLen              buffer size in bytes

   Return
   ------
   FALSE on failure
---------------------------------------------------------*/
_ISDeclSpec BOOL _ISCConv _ISFn( is5_IntersectBuffers )(const void *pA, const void *pB, void *pOut, UINT32 uLen);

/*---------------------------------------------------------
   is5_UnionBuffers

   Purpose : 
   Combine two buffers using a logical OR. 
   
   Among other things, this can be used to implement
   the union of two 1-bit images during morphological 
   processing.

   Param             Use
   ------------------------------------
   pA                input buffer 1
   pB                input buffer 2
   pOut              output buffer (may be pA or pB)
   uLen              buffer size in bytes

   Return
   ------
   FALSE on failure
---------------------------------------------------------*/
_ISDeclSpec BOOL _ISCConv _ISFn( is5_UnionBuffers )(const void *pA, const void *pB, void *pOut, UINT32 uLen);
 
/*---------------------------------------------------------
   is5_XORBuffers

   Purpose : 
   Combine two buffers using a logical XOR. 

   Param             Use
   ------------------------------------
   pA                input buffer 1
   pB                input buffer 2
   pOut              output buffer (may be pA or pB)
   uLen              buffer size in bytes


   Return
   ------
   FALSE on failure
---------------------------------------------------------*/
_ISDeclSpec BOOL _ISCConv _ISFn( is5_XORBuffers )(const void *pA, const void *pB, void *pOut, UINT32 uLen);

#ifdef __cplusplus
}
#endif

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
CEO Secured Globe, Inc.
United States United States
Michael Haephrati is a music composer, an inventor and an expert specializes in software development and information security, who has built a unique perspective which combines technology and the end user experience. He is the author of a the book Learning C++ , which teaches C++ 20, and was published in August 2022.

He is the CEO of Secured Globe, Inc., and also active at Stack Overflow.

Read our Corporate blog or read my Personal blog.





Comments and Discussions