Totter Posted February 13, 2014 Posted February 13, 2014 Hi I have problem with creating image with inverted colors. I can capture image and draw inverted color picture, but I cannot create inverted color image to use _GDIPlus_ImageSaveToFile ( $hImage, $picture_path ) to save it directly. I'm using UEZ code that i do not fully understand. I thing that functions _GDIPlus_GraphicsDrawImageRectRectIA and _GDIPlus_GraphicsDrawImageRectRect do part of the thing (draw inverted color picture). The question is how to create inverted color image instead of drawing it to screen? 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 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
Solution FireFox Posted February 13, 2014 Solution Posted February 13, 2014 Hi, Instead of using the graphics from a GUI, use the graphics from the image you want to invert the color. So the inverted color will be drawn on the image.#include <GUIConstantsEx.au3> #include <ScreenCapture.au3> Example() Func Example() _GDIPlus_Startup() ;initialize GDI+ Local Const $iWidth = 600, $iHeight = 600 Local $hIA = _GDIPlus_ImageAttributesCreate() ;create an ImageAttribute object Local $tColorMatrix = _GDIPlus_ColorMatrixCreateNegative() ;create negative color matrix _GDIPlus_ImageAttributesSetColorMatrix($hIA, 0, True, $tColorMatrix) ;set negative color matrix Local $hHBmp = _ScreenCapture_Capture("", 0, 0, $iWidth, $iHeight) ;create a GDI bitmap by capturing an area on desktop Local $hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hHBmp) ;convert GDI to GDI+ bitmap _WinAPI_DeleteObject($hHBmp) ;release GDI bitmap resource because not needed anymore Local $hGraphics = _GDIPlus_ImageGetGraphicsContext($hBitmap) _GDIPlus_GraphicsDrawImageRectRect($hGraphics, $hBitmap, 0, 0, $iWidth, $iHeight, 0, 0, $iWidth, $iHeight, $hIA) ;draw the bitmap while applying the color adjustment _GDIPlus_ImageSaveToFile($hBitmap, "test.jpg") ;cleanup GDI+ resources _GDIPlus_ImageAttributesDispose($hIA) _GDIPlus_GraphicsDispose($hGraphics) _GDIPlus_BitmapDispose($hBitmap) _GDIPlus_Shutdown() EndFunc ;==>Example Br, FireFox.
Totter Posted February 14, 2014 Author Posted February 14, 2014 (edited) I have two more question. I changed: _GDIPlus_GraphicsDrawImageRectRect($hGraphics, $hBitmap, 0, 0, $iWidth, $iHeight, 0, 0, $iWidth, $iHeight, $hIA) to: __GDIPlus_GraphicsDrawImageRectRect($hGraphics, $hBitmap, $iX1, $iY1, $iX2-$iX1, $iY2-$iY1,$iX1, $iY1,$iX2-$iX1, $iY2-$iY1, $hIA) and code fails to invert colors Note: $iX1, $iY1, $iX2, $iY2 are coordinates used to ScreenCapture This works: _ GDIPlus_GraphicsDrawImageRectRect($hGraphics, $hBitmap, 0, 0, $iX2-$iX1, $iY2-$iY1,0, 0,$iX2-$iX1, $iY2-$iY1, $hIA) Question is why ? $nSrcX The X coordinate of the upper left corner of the source image, $nSrcY The Y coordinate of the upper left corner of the source image, $nDstX The X coordinate of the upper left corner of the destination image and $nDstY The Y coordinate of the upper left corner of the destination image should be zero. I did not wound explanation in HELP (checked all functions from GDIPlus in my code.) Second question is why function _GDIPlus_ImageSaveToFile returns zero (@error = 0) but do not fail to save image. Should return 1. In Help is written: Return Value Success: True. Failure: False and sets the @error flag to non-zero, @extended may contain GPSTATUS error code ($GPID_ERR*). Edited February 14, 2014 by Totter
FireFox Posted February 14, 2014 Posted February 14, 2014 __GDIPlus_GraphicsDrawImageRectRect($hGraphics, $hBitmap, $iX1, $iY1, $iX2-$iX1, $iY2-$iY1,$iX1, $iY1,,$iX2-$iX1, $iY2-$iY1, $hIA)Please use autoit code tags to post your code, and I can see a syntax error after the $iY1.Second question is why function _GDIPlus_ImageSaveToFile returns zero (@error = 0)but do not fail to save image.Should return 1. In Help is written: Return Value Success: True.Failure: False and sets the @error flag to non-zero, @extended may contain GPSTATUS error code ($GPID_ERR*).@error = 0 is not an error, it's a success. So the function returns 1.Br, FireFox.
Totter Posted February 14, 2014 Author Posted February 14, 2014 add. 1 Sorry my mistake when pasting to forum (now repaired in original post). This function does not fail but also does not invert colors. (Returns Succes) __GDIPlus_GraphicsDrawImageRectRect($hGraphics, $hBitmap, $iX1, $iY1, $iX2-$iX1, $iY2-$iY1,$iX1, $iY1,$iX2-$iX1, $iY2-$iY1, $hIA) works only in my code when written: GDIPlus_GraphicsDrawImageRectRect($hGraphics, $hBitmap, 0, 0, $iX2-$iX1, $iY2-$iY1,0, 0,$iX2-$iX1, $iY2-$iY1, $hIA) add.2 _GDIPlus_ImageSaveToFile($hBitmap,"testa1.jpg") saves testa1.jpg but returns 0 and error=0 Attaching program file as a proof:)) snapshot.au3
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