autof1 Posted February 27, 2011 Share Posted February 27, 2011 Hi Everyone, Does anyone know how I can invert the colours on a bitmap/JPEG image? (Think MS Paint) I'm trying to do this before I run the image through a OCR. See the Tesserac script for more details: The screen capture I want to OCR has yellow characters on a blue background that tesserac can't read unless I invert the colours. I have played around with the script and even tried opening the capture in MS paint to invert (using Keyboard commands) but no luck. Anyone know a line of code that can do this for a entire image? I have seen a few example scripts on here that do it per pixel, but that's not what I am looking for a tedious/slow. Also, is there a way to screen capture a window that is always minimized, or do I have to activate everytime? Any help is much appreciated! Thanks, GG Link to comment Share on other sites More sharing options...
UEZ Posted February 27, 2011 Share Posted February 27, 2011 One possibility:expandcollapse popup;coded by UEZ ;thanks to Authenticity for GDIP.au3 and the great examples #include <GDIPlus.au3> #Include <Misc.au3> $file = FileOpenDialog("Select image to load", @ScriptDir, "Images (*.jpg;*.png;*.bmp)") If @error Then Exit _GDIPlus_Startup() $hImage = _GDIPlus_ImageLoadFromFile($file) $scale_factor = 1.0 $iX = _GDIPlus_ImageGetWidth($hImage) * $scale_factor $iY = _GDIPlus_ImageGetHeight($hImage) * $scale_factor $hGUI = GUICreate("GDI+: Image to Negative Example", $iX, $iY) GUISetState() $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI) Global $hImageContext, $hBackImage _Negative() $dll = DllOpen("user32.dll") While 1 Switch GUIGetMsg() Case -3 _GDIPlus_BitmapDispose($hImage) _GDIPlus_GraphicsDispose($hImageContext) _GDIPlus_BitmapDispose($hBackImage) _GDIPlus_GraphicsDispose($hGraphics) _GDIPlus_Shutdown() GUIDelete($hGUI) DllClose($dll) Exit EndSwitch If _IsPressed("4E", $dll) Then ;press n to negative image $hImage = _GDIPlus_BitmapCloneArea($hBackImage, 0, 0, $iX, $iY) _Negative() EndIf Sleep(100) WEnd Func _Negative() Local $tNegMatrix, $pNegMatrix If $hImage Then $hBackImage = _GDIPlus_BitmapCloneArea($hImage, 0, 0, $iX, $iY) $hImageContext = _GDIPlus_ImageGetGraphicsContext($hBackImage) $tNegMatrix = _GDIPlus_ColorMatrixCreateNegative() $pNegMatrix = DllStructGetPtr($tNegMatrix) $hIA = _GDIPlus_ImageAttributesCreate() _GDIPlus_ImageAttributesSetColorMatrix($hIA, 0, True, $pNegMatrix) _GDIPlus_GraphicsDrawImageRectRectIA($hImageContext, $hImage, 0, 0, $iX, $iY, 0, 0, $iX, $iY, $hIA) _GDIPlus_GraphicsDrawImageRectRect($hGraphics, $hBackImage, 0, 0, $iX, $iY, 0, 0, $iX, $iY) $tNegMatrix = 0 EndIf EndFunc ; #FUNCTION# ==================================================================================================================== ; Name...........: _GDIPlus_ColorMatrixCreateNegative ; Description ...: Creates and initializes a negative color matrix ; Syntax.........: _GDIPlus_ColorMatrixCreateNegative() ; Parameters ....: None ; Return values .: Success - $tagGDIPCOLORMATRIX structure ; Failure - 0 ; Remarks .......: None ; Related .......: $tagGDIPCOLORMATRIX ; Link ..........; @@MsdnLink@@ ColorMatrix ; Example .......; No ; =============================================================================================================================== Func _GDIPlus_ColorMatrixCreateNegative() Local $iI, $tCM $tCM = _GDIPlus_ColorMatrixCreateScale(-1, -1, -1, 1) For $iI = 1 To 4 DllStructSetData($tCM, "m", 1, 20 + $iI) Next Return $tCM EndFunc ;==>_GDIPlus_ColorMatrixCreateNegative ; #FUNCTION# ==================================================================================================================== ; Name...........: _GDIPlus_ColorMatrixCreateScale ; Description ...: Creates and initializes a scaling color matrix ; Syntax.........: _GDIPlus_ColorMatrixCreateScale($nRed, $nGreen, $nBlue[, $nAlpha = 1]) ; Parameters ....: $nRed - Red component scaling factor ; $nGreen - Green component scaling factor ; $nBlue - Blue component scaling factor ; $nAlpha - Alpha component scaling factor ; Return values .: Success - $tagGDIPCOLORMATRIX structure that contains a scaling color matrix ; Failure - 0 ; Remarks .......: A scaling color matrix is used to multiply components of a color by multiplier factors ; Related .......: $tagGDIPCOLORMATRIX ; Link ..........; @@MsdnLink@@ ColorMatrix ; Example .......; No ; =============================================================================================================================== Func _GDIPlus_ColorMatrixCreateScale($nRed, $nGreen, $nBlue, $nAlpha = 1) Local $tCM Local Const $tagGDIPCOLORMATRIX = "float m[25]" $tCM = DllStructCreate($tagGDIPCOLORMATRIX) DllStructSetData($tCM, "m", $nRed, 1) DllStructSetData($tCM, "m", $nGreen, 7) DllStructSetData($tCM, "m", $nBlue, 13) DllStructSetData($tCM, "m", $nAlpha, 19) DllStructSetData($tCM, "m", 1, 25) Return $tCM EndFunc ;==>_GDIPlus_ColorMatrixCreateScale ; #FUNCTION# ==================================================================================================================== ; Name...........: _GDIPlus_ImageAttributesSetColorMatrix ; Description ...: Sets or clears the color- and grayscale-adjustment matrices for a specified category ; Syntax.........: _GDIPlus_ImageAttributesSetColorMatrix($hImageAttributes[, $iColorAdjustType = 0[, $fEnable = False,[ $pClrMatrix = 0[, $pGrayMatrix = 0[, $iColorMatrixFlags = 0]]]]]) ; Parameters ....: $hImageAttributes - Pointer to an ImageAttribute object ; $iColorAdjustType - The category for which the color- and grayscale-adjustment matrices are set or cleared: ; |0 - Color or grayscale adjustment applies to all categories that do not have adjustment settings of their own ; |1 - Color or grayscale adjustment applies to bitmapped images ; |2 - Color or grayscale adjustment applies to brush operations in metafiles ; |3 - Color or grayscale adjustment applies to pen operations in metafiles ; |4 - Color or grayscale adjustment applies to text drawn in metafiles ; $fEnable - If True, the specified matrices (color, grayscale or both) adjustments for the specified ; +category are applied; otherwise the category is cleared ; $pClrMatrix - Pointer to a $tagGDIPCOLORMATRIX structure that specifies a color-adjustment matrix ; $pGrayMatrix - Pointer to a $tagGDIPCOLORMATRIX structure that specifies a grayscale-adjustment matrix ; $iColorMatrixFlags - Type of image and color that will be affected by the adjustment matrices: ; |0 - All color values (including grays) are adjusted by the same color-adjustment matrix ; |1 - Colors are adjusted but gray shades are not adjusted. ; +A gray shade is any color that has the same value for its red, green, and blue components ; |2 - Colors are adjusted by one matrix and gray shades are adjusted by another matrix ; Return values .: Success - True ; Failure - False and either: ; |@error and @extended are set if DllCall failed ; |$GDIP_STATUS contains a non zero value specifying the error code ; Remarks .......: None ; Related .......: _GDIPlus_ColorMatrixCreate, $tagGDIPCOLORMATRIX ; Link ..........; @@MsdnLink@@ GdipSetImageAttributesColorMatrix ; Example .......; No ; =============================================================================================================================== Func _GDIPlus_ImageAttributesSetColorMatrix($hImageAttributes, $iColorAdjustType = 0, $fEnable = False, $pClrMatrix = 0, $pGrayMatrix = 0, $iColorMatrixFlags = 0) Local $aResult = DllCall($ghGDIPDll, "uint", "GdipSetImageAttributesColorMatrix", "hwnd", $hImageAttributes, "int", $iColorAdjustType, "int", $fEnable, "ptr", $pClrMatrix, "ptr", $pGrayMatrix, "int", $iColorMatrixFlags) If @error Then Return SetError(@error, @extended, False) $GDIP_STATUS = $aResult[0] Return $aResult[0] = 0 EndFunc ;==>_GDIPlus_ImageAttributesSetColorMatrix ; #FUNCTION# ==================================================================================================================== ; Name...........: _GDIPlus_GraphicsDrawImageRectRectIA ; Description ...: Draws an image ; Syntax.........: _GDIPlus_GraphicsDrawImageRectRectIA($hGraphics, $hImage, $nSrcX, $nSrcY, $nSrcWidth, $nSrcHeight, $nDstX, $nDstY, $nDstWidth, $nDstHeight[, $hImageAttributes = 0[, $iUnit = 2]]) ; Parameters ....: $hGraphics - Pointer to a Graphics object ; $hImage - Pointer to an Image object ; $iSrcX - The X coordinate of the upper left corner of the source image ; $iSrcY - The Y coordinate of the upper left corner of the source image ; $iSrcWidth - Width of the source image ; $iSrcHeight - Height of the source image ; $iDstX - The X coordinate of the upper left corner of the destination image ; $iDstY - The Y coordinate of the upper left corner of the destination image ; $iDstWidth - Width of the destination image ; $iDstHeight - Height of the destination image ; $hImageAttributes - Pointer to an ImageAttributes object that specifies the color and size attributes of the image to be drawn ; $iUnit - Unit of measurement: ; |0 - World coordinates, a nonphysical unit ; |1 - Display units ; |2 - A unit is 1 pixel ; |3 - A unit is 1 point or 1/72 inch ; |4 - A unit is 1 inch ; |5 - A unit is 1/300 inch ; |6 - A unit is 1 millimeter ; Return values .: Success - True ; Failure - False and either: ; |@error and @extended are set if DllCall failed ; |$GDIP_STATUS contains a non zero value specifying the error code ; Remarks .......: None ; Related .......: None ; Link ..........; @@MsdnLink@@ GdipDrawImageRectRect ; Example .......; No ; =============================================================================================================================== Func _GDIPlus_GraphicsDrawImageRectRectIA($hGraphics, $hImage, $nSrcX, $nSrcY, $nSrcWidth, $nSrcHeight, $nDstX, $nDstY, $nDstWidth, $nDstHeight, $hImageAttributes = 0, $iUnit = 2) Local $aResult = DllCall($ghGDIPDll, "int", "GdipDrawImageRectRect", "hwnd", $hGraphics, "hwnd", $hImage, "float", $nDstX, "float", _ $nDstY, "float", $nDstWidth, "float", $nDstHeight, "float", $nSrcX, "float", $nSrcY, "float", $nSrcWidth, "float", _ $nSrcHeight, "int", $iUnit, "hwnd", $hImageAttributes, "int", 0, "int", 0) If @error Then Return SetError(@error, @extended, False) $GDIP_STATUS = $aResult[0] Return $aResult[0] = 0 EndFunc ;==>_GDIPlus_GraphicsDrawImageRectRectIA ; #FUNCTION# ==================================================================================================================== ; Name...........: _GDIPlus_ImageAttributesCreate ; Description ...: Creates an ImageAttributes object ; Syntax.........: _GDIPlus_ImageAttributesCreate() ; Parameters ....: None ; Return values .: Success - Pointer to a new ImageAttribute object ; Failure - 0 and either: ; |@error and @extended are set if DllCall failed ; |$GDIP_STATUS contains a non zero value specifying the error code ; Remarks .......: After you are done with the object, call _GDIPlus_ImageAttributesDispose to release the object resources ; Related .......: _GDIPlus_ImageAttributesDispose ; Link ..........; @@MsdnLink@@ GdipCreateImageAttributes ; Example .......; No ; =============================================================================================================================== Func _GDIPlus_ImageAttributesCreate() Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateImageAttributes", "int*", 0) If @error Then Return SetError(@error, @extended, 0) $GDIP_STATUS = $aResult[0] Return $aResult[1] EndFunc ;==>_GDIPlus_ImageAttributesCreateAnother one is to use inline asm which I used in As far as I can remember there are some more example here in the forum - you have to search them.Br,UEZ Please don't send me any personal message and ask for support! I will not reply! Selection of finest graphical examples at Codepen.io The own fart smells best! ✌Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!¯\_(ツ)_/¯ ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now