Sign in to follow this  
Followers 0
The_Key_Maker

Rotating an image from a custom origin with overlaying other image

6 posts in this topic

Hi guys, 

I saw in a post #6 in the topic mentioned below, that you posted a way to rotate an image.

I'm trying to rotate similat image, a niddle, but I want to rotate it in a specific anchor/origin point (it's base), so it can be a niddle of a speed meter I'm trying to make. 

My niddle has the width=40, height = 9, location on he speed meter: left=291, top=352. I need the anchor to be at (Left,Top) = (325,357), as the speed meter located by:

Global $OriginX = 325
Global $OriginY = 357
$SpeedMeterGause =  GUICtrlCreatePic("C:\Users\salon\Pictures\speedomete.gif", 280, 312, 90, 90); meter dimentions 90x90
$SpeedMeterNiddle = GUICtrlCreatePic("C:\Users\salon\Pictures\Niddle.jpg",  291, 352, 40, 9) ;custom location of the niddle, dim 40x9

I want the niddle to be able to rotate all over the meter, from let's say, angles of -45 degrees (represents minimum) to 270 degrees (maximum).

Attached a picture of the speed meter on the lower-right corner of the GUI, and the script itself.

Is it possible?

Thanks!!!

 

 

speedometer.png

Load Menu.au3

Share this post


Link to post
Share on other sites



14 hours ago, junkew said:

 

 

Hi @junkew,

I'm looking to rotate an image on top of other image, when the rotation point is not the center of the image, but the far end middle of it:
For example: My niddle is 40x9 (WxH), and it's located on (100,100), I want the rotation point to be on (100+40,100+9/2), and not (100+40/2,100+9/2) as the center of the image.

 

Share this post


Link to post
Share on other sites

#4 ·  Posted (edited)

Have a look here:

 

Please ask if you have any question.

 

Meanwhile I will write an example how to rotate a bitmap needle.

Edited by 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!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites

Thanks, @UEZ, I'll check that in a an hour. Can the rotated image be transparent?

 

Share this post


Link to post
Share on other sites

Here a basic example how a rotation of a transparent needle can be done.

#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>

Global Const $iWidth = 300, $iHeight = 200
Global Const $hGUI = GUICreate("GDI+ Needle Rotation Example", $iWidth, $iHeight)
GUISetState()

_GDIPlus_Startup()
;create buffered graphic handle to display final drawn image
Global Const $hCanvas = _GDIPlus_GraphicsCreateFromHWND($hGUI)
Global Const $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hCanvas)
Global Const $hGfx = _GDIPlus_ImageGetGraphicsContext($hBitmap)
_GDIPlus_GraphicsSetSmoothingMode($hGfx, 4)

;load needle from memory
Global Const $hImage = _GDIPlus_BitmapCreateFromMemory(_Zeiger())

;create a new image with squared dimension of the loaded needle bitmap and place the needle center in the middle
Global Const $iNeedleCenterX = 25, $iNeedleCenterY = 8, $iImageWidth = 117, $iImageHeight = 17, $iNeedleWidth = 2 * ($iImageWidth - $iNeedleCenterX), $iNeedleHeight = $iNeedleWidth
Global Const $hImage_Needle = _GDIPlus_BitmapCreateFromScan0($iNeedleWidth, $iNeedleHeight)
Global Const $hCtxt = _GDIPlus_ImageGetGraphicsContext($hImage_Needle)
_GDIPlus_GraphicsDrawImageRect($hCtxt, $hImage, $iNeedleWidth / 2 - $iNeedleCenterX, $iNeedleHeight / 2 - $iNeedleCenterY, $iImageWidth, $iImageHeight)


Global Const $fRadius = $iImageWidth - $iNeedleCenterX, $fCenterScreenX = $iWidth / 2, $fCenterScreenY = $iHeight / 2 - 30

Global $fAngle = 0, $iDir = 1

Global Const $hBrush = _GDIPlus_LineBrushCreate(0, 0, $fRadius, $fRadius, 0xFFFF0000, 0xFF00FF00, 1)

Do
    ;do some animation
    _GDIPlus_GraphicsClear($hGfx)
    RotateNeedle($fAngle)
    $fAngle += 0.5 * $iDir
    If BitOR($fAngle < 0, $fAngle > 180) Then $iDir *= -1

    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            _GDIPlus_BrushDispose($hBrush)
            _GDIPlus_GraphicsDispose($hCanvas)
            _GDIPlus_GraphicsDispose($hGfx)
            _GDIPlus_GraphicsDispose($hCtxt)
            _GDIPlus_BitmapDispose($hBitmap)
            _GDIPlus_BitmapDispose($hImage_Needle)
            _GDIPlus_ImageDispose($hImage)
            _GDIPlus_Shutdown()
            GUIDelete()
            Exit
    EndSwitch

Until False

Func RotateNeedle($fAngle)
    ;draw a dummy background
    Local Const $hPath = _GDIPlus_PathCreate()
    _GDIPlus_PathAddArc($hPath, $fCenterScreenX - $fRadius, $fCenterScreenY, 2 * $fRadius, 2 * $fRadius, 180, 180)
    _GDIPlus_GraphicsFillPath($hGfx, $hPath, $hBrush)
    _GDIPlus_PathDispose($hPath)

    ;create a new bitmap
    Local Const $hBmp = _GDIPlus_BitmapCreateFromScan0($iNeedleWidth, $iNeedleHeight)
    Local Const $hContext = _GDIPlus_ImageGetGraphicsContext($hBmp)
    _GDIPlus_GraphicsSetPixelOffsetMode($hContext, 2)

    ;create a matrix handle to rotate bitmap
    Local Const $hMatrix = _GDIPlus_MatrixCreate()
    _GDIPlus_MatrixTranslate($hMatrix, $fRadius, $fRadius)
    _GDIPlus_MatrixRotate($hMatrix, -180 + $fAngle)
    _GDIPlus_GraphicsSetTransform($hContext, $hMatrix)
    _GDIPlus_MatrixTranslate($hMatrix, -$fRadius, -$fRadius)
    _GDIPlus_GraphicsSetTransform($hContext, $hMatrix)

    ;copy needle to the rotated bitmap
    _GDIPlus_GraphicsDrawImageRect($hContext, $hImage_Needle, 0, 0, $iNeedleWidth, $iNeedleHeight)

    ;copy result to our main graphic content
    _GDIPlus_GraphicsDrawImageRect($hGfx, $hBmp, $fCenterScreenX - $fRadius, $fCenterScreenY - 10, $iNeedleWidth, $iNeedleHeight)
    _GDIPlus_GraphicsDrawImageRect($hCanvas, $hBitmap, 0, 0, $iWidth, $iHeight)

    ;release resources within this function to avoid memory leak
    _GDIPlus_MatrixDispose($hMatrix)
    _GDIPlus_GraphicsDispose($hContext)
    _GDIPlus_ImageDispose($hBmp)
EndFunc


;Code below was generated by: 'File to Base64 String' Code Generator v1.20 Build 2015-09-19

Func _Zeiger($bSaveBinary = False, $sSavePath = @ScriptDir)
    Local $Zeiger
    $Zeiger &= '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'
    $Zeiger &= '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'
    $Zeiger &= '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'
    $Zeiger &= 'oECslVar9YZSOjLGiFKxdgkRCquVFqWUUlrZ2U9P/guwxJjXdV3J5/PRsaPH3jn41sEZoOVYa1lYWODkyVlarVbKIwsi6XZN6EGn08Ha7oKkNhlFlk5nOS6wRQRBiLUR2WyWoaFByqOjlEdGKJVKZLNZjh49Rq1WIwgCMpls75L6eblQ5TDRtRW+pQ8Vro44ibKkS0oJZk6vT8+dn4c07iZOPJzptRKndAkozjl2JLlCP3Zf+f7qUpLWGs/z8P0OW6an+fqdd1LwCzjAi512u3riRF0brXubU9qSstM13JeIstZWRCSvtSIIApaWFgnDoGcRAwMDbBrcxMjwMOVymXK5jF/08TwPYxwe+d0jzcVWa74xM9NUSkvaAaquMEMbycKaXHxWrAJEgtgLYQfV/UAvJT+Hi44USlL6taY0xEpTRM6Vw6TDxoVwTDocqL7UfK11yfkd4BTwsaNE3Q1kbGiVxa4XVEWp/F852smfbZ79g1K5e7ReRkRYXl7GGEM2m8E4Br9QIF8okM/ncV2HKLK89uprrcceffx5YL/ruH+NQnsa7EaU3ux5YulFZ0KpR13C3iQ2XzK6v9j4vFHoVwFq/uzc9cAvPS/z7Ww24xrjkMvlKI+WKY+MkMvl6HQ68u7bh/67sLDwotZ6P/AKUK83aiFf0IbQ/wAq4CpjdWoV/AAAAABJRU5ErkJggg=='
    Local $bString = _WinAPI_Base64Decode($Zeiger)
    If @error Then Return SetError(1, 0, 0)
    $bString = Binary($bString)
    If $bSaveBinary Then
        Local Const $hFile = FileOpen($sSavePath & "\tacho_zeiger_max.png", 18)
        If @error Then Return SetError(2, 0, $bString)
        FileWrite($hFile, $bString)
        FileClose($hFile)
    EndIf
    Return $bString
EndFunc   ;==>_Zeiger

Func _WinAPI_Base64Decode($sB64String)
    Local $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "ptr", 0, "dword*", 0, "ptr", 0, "ptr", 0)
    If @error Or Not $aCrypt[0] Then Return SetError(1, 0, "")
    Local $bBuffer = DllStructCreate("byte[" & $aCrypt[5] & "]")
    $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "struct*", $bBuffer, "dword*", $aCrypt[5], "ptr", 0, "ptr", 0)
    If @error Or Not $aCrypt[0] Then Return SetError(2, 0, "")
    Return DllStructGetData($bBuffer, 1)
EndFunc   ;==>_WinAPI_Base64Decode

 

1 person likes this

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!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0

  • Similar Content

    • c.haslam
      By c.haslam
      UEZ has kindly provided me with code that rotates an image per a line: see here
      Because I want to trim a photograph after rotation, I need to crop the photo. I wrote code which calls _GDIPlus_GraphicsSetClipRect() to do this, but it places spurious stuff in the corners: see 2.jpg attached.
      I want only the trimmed photo to show.
      The original jpeg is also attached.
      The arguments to _GDIPlus_GraphicsSetClipRect() come from solving 2 simultaneous equations: if a and b are the width and height of the original photo, find x and y, the width and height of the rotated and cropped rectangle;
      a = x cos(ang) + y sin(ang)
      b = x sin(ang) + y cos(ang)
      My solution is:
      x = (b * sin(ang) - a*cos(ang)) / (sin(ang)^2 - (cos(ang)^2)
      y = (b * cos(ang) - a * sin(ang)) / (cos(ang)^2 - sin(ang)^2)
      To try to get a handle on the problem, I have temporarily added in several lines in Case $btn. In 2.jpg, you can see that the rectangle bounding the area to be retained is in the wrong place.
      The code is:
      #include <ButtonConstants.au3> #include <GDIPlus.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> Opt('MustDeclareVars',1) Global Const $MK_SHIFT = 0x4 Global Const $MK_CONTROL = 0x8 Global Const $fPi = ACos(-1), $fPi2 = $fPi / 2, $fRad = 180 / $fPi GUIRegisterMsg($WM_MOUSEWHEEL, "WM_MOUSEWHEEL") GUIRegisterMsg($WM_PAINT,'WM_PAINT') Global $gX0=10,$gX1=580,$gY0,$gY1,$gForm1,$glblPic,$iLW,$iLH,$iW,$iH Global $ghCanvas,$ghImage,$ghPen,$gGraphicPic,$ghBitmap,$ghMatrix,$ghImageClone,$ghGfxClone Global Const $kDegToRads = 3.14159/180 main() Func main() $gForm1 = GUICreate("Form1", 623, 601, 192, 114) $iLW = 589 $iLH = 500 $glblPic = GUICtrlCreateLabel("", 8, 8, $iLW, $iLH) Local $btn = GUICtrlCreateButton("Rotate", 472, 560, 65, 25) GUISetState(@SW_SHOW) Local $oldY0,$oldY1,$fAngle _GDIPlus_Startup() $ghPen = _GDIPlus_PenCreate(0xFF999999,2) $ghImage = _GDIPlus_ImageLoadFromFile('H:\b\pergola.jpg') Local $h = GUICtrlGetHandle($glblPic) $gGraphicPic = _GDIPlus_GraphicsCreateFromHWND($h) $gY0 = 400 $gY1 = 400 $iW = _GDIPlus_ImageGetWidth($ghImage) $iH = _GDIPlus_ImageGetHeight($ghImage) $ghBitmap = _GDIPlus_BitmapCreateFromScan0($iW, $iH) $ghCanvas = _GDIPlus_ImageGetGraphicsContext($ghBitmap) $ghMatrix = _GDIPlus_MatrixCreate() ; Loop until the user exits. While True If $gY0<>$oldY0 Or $gY1<>$oldY1 Then Paint() $oldY0 = $gY0 $oldY1 = $gY1 Else Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop Case $btn $ghImageClone=_GDIPlus_BitmapCreateFromScan0($iW, $iH) $ghGfxClone=_GDIPlus_ImageGetGraphicsContext($ghImageClone) _GDIPlus_MatrixTranslate($ghMatrix, $iW/2, $iH/2) $gY1 = 300 ; temp Local $ang = -Angle($gY1-$gY0, $gX1-$gX0) _GDIPlus_MatrixRotate($ghMatrix, $ang) ;~ _GDIPlus_MatrixRotate($ghMatrix, -Angle($gY1-$gY0, $gX1-$gX0)) _GDIPlus_MatrixTranslate($ghMatrix, -$iW/2, -$iH/2) _GDIPlus_GraphicsSetTransform($ghGfxClone, $ghMatrix) _GDIPlus_GraphicsDrawImageRect($ghGfxClone,$ghImage,0,0,$iW,$iH) Local $angRads = $ang*$kDegToRads Local $sinAng = Sin($angRads) Local $cosAng = Cos($angRads) Local $wid = ($iLH*$sinAng-$iLW*$cosAng)/($sinAng^2-$cosAng^2) Local $left = ($iLW-$wid)/2 Local $ht = ($iLH*$cosAng-$iLW*$sinAng)/($cosAng^2-$sinAng^2) Local $top = ($iLH-$ht)/2 _GDIPlus_GraphicsDrawRect($ghGfxClone,$left,$top,$wid,$ht,$ghPen) ; temp _GDIPlus_GraphicsSetClipRect($ghGfxClone,$left,$top,$wid,$ht,0) _GDIPlus_GraphicsDispose($ghGfxClone) $ghGfxClone=_GDIPlus_ImageGetGraphicsContext($ghImage) _GDIPlus_GraphicsClear($ghImage) _GDIPlus_GraphicsDrawImageRect($ghGfxClone,$ghImageClone,0,0,$iW,$iH) _GDIPlus_GraphicsDispose($ghGfxClone) _GDIPlus_ImageDispose($ghImageClone) $gy0 = 400 $gy1 = 400 Paint() _GDIPlus_ImageSaveToFile($ghImage,'H:\b\2.jpg') ; added - is rotated, with same size as original file EndSwitch EndIf WEnd ; Clean up resources _GDIPlus_MatrixDispose($ghMatrix) _GDIPlus_ImageDispose($ghCanvas) _GDIPlus_ImageDispose($ghImage) _GDIPlus_ImageDispose($ghBitmap) _GDIPlus_PenDispose($ghPen) _GDIPlus_GraphicsDispose($gGraphicPic) _GDIPlus_Shutdown() EndFunc Func WM_MOUSEWHEEL($hWnd, $iMsg, $wParam, $lParam) #forceref $hWnd, $iMsg, $wParam, $lParam Local Const $kYmax=$iLH-1,$kDelta=2 Local $vec = GUIGetCursorInfo($gForm1) If $vec[4] = $vec[4]=$glblPic Then Local $iDelta = BitShift($wParam, 16) ; positive = up Local $iKeys = _WinAPI_LoWord($wParam) If BitAND($iKeys,$MK_CONTROL)=$MK_CONTROL Then If BitAND($iKeys,$MK_SHIFT)=$MK_SHIFT Then ; do nothing Else If $iDelta > 0 And $gY0>3 Then $gY0 -= $kDelta If $iDelta < 0 And $gY0<$kYmax Then $gY0 += $kDelta EndIf Else If BitAND($iKeys,$MK_SHIFT)=$MK_SHIFT Then If $iDelta > 0 And $gY1>3 Then $gY1 -= $kDelta If $iDelta < 0 And $gY1<$kYmax Then $gY1 += $kDelta Else If $iDelta > 0 And $gY0>3 Then $gY0 -= $kDelta If $iDelta < 0 And $gY0<$kYmax Then $gY0 += $kDelta If $iDelta > 0 And $gY1>3 Then $gY1 -= $kDelta If $iDelta < 0 And $gY1<$kYmax Then $gY1 += $kDelta EndIf EndIf EndIf Return $GUI_RUNDEFMSG EndFunc ;==>WM_MOUSEWHEEL Func Paint() _GDIPlus_GraphicsClear($ghCanvas,0) _GDIPlus_GraphicsDrawImageRect($ghCanvas, $ghImage, 0,0, $iLW, $iLH) _GDIPlus_GraphicsDrawLine($ghCanvas, $gX0, $gY0, $gX1, $gY1, $ghPen) _GDIPlus_GraphicsDrawImageRect($gGraphicPic, $ghBitmap, 0, 0, $iW, $iH) EndFunc Func WM_PAINT() _WinAPI_RedrawWindow($gForm1, 0, 0, $RDW_UPDATENOW) Paint() _WinAPI_RedrawWindow($gForm1, 0, 0, $RDW_VALIDATE) EndFunc Func Angle($y, $x) ;return value is in degree Local Const $fPi = ACos(-1), $fPi2 = ACos(-1) / 2, $fRad = 180 / $fPi Switch True Case ($x > 0) Return ATan($y / $x) * $fRad Case ($x < 0 And $y >= 0) Return ATan($y / $x + $fPi) * $fRad Case ($x < 0 And $y < 0) Return ATan($y / $x - $fPi) * $fRad Case ($x = 0 And $y > 0) Return $fPi2 * $fRad Case ($x = 0 And $y < 0) Return -$fPi2 * $fRad Case ($x = 0 And $y = 0) Return 0 EndSwitch EndFunc I also don't understand how the rotated picture gets displayed. There are graphics objects, graphics contexts and PDI+ bitmaps. How are they related?
      Help would be much appreciated.


    • Loken
      By Loken
      Hello Autoit Forum, i want to make a window rotater but idk how can i do, i search the forum and found something but these link were crashed.I want rotate windows because i cant rotate Lines 360 degree in GUI. Thanks Big AutoIt Forum.