Jump to content
Chimp

✂️ Quick crop tool

Recommended Posts

2020/08/16 New Version

I've made some changes and fixes to this function:
I added the possibility to vary both the thickness of the selector and its color.
to customize the appearance and behavior of the tool, you can change the values of some variables in the function listing. See comments on lines 140-170
You can also vary the look of the border by setting a custom dash/space length pattern. Thanks to @UEZ for that. See here for reference.
Hope it is free of bugs.
(i don't know how to test it to see if it is also DPI aware??)
Suggestions for improvements and bug reports are welcome.

How to use this demo of use:

  1. hit Ctrl+PrintScreen to activate the tool
  2. LeftClick and drag on the borders of the tool to resize the area
  3. you can also Leftclick and drag within the area to move it around
  4. RightClick within the area to shot a screenshot of only the delimited area to the clipboard.


in short "how to use the function" outside this demo in your programs:

  1. including the following 4 standard udf
    #include <Windowsconstants.au3>
    #include <WinAPISys.au3>
    #include <Misc.au3>
    #include <GDIPlus.au3>
    and pasting the _Crop function in your listing is all what you need, then:
  2. call the _Crop() function; the 'selector' appears around the mouse
    hovering  the mouse over any side or corner the cursor should change accordingly;
  3. LeftClick on the edges and drag to redim the area, also LeftClick within the area and drag to move the selection around.
  4. When you are done with the selection, RightClick within the area or also hit the ESC key,
    the 4 element 1D array is returned to the caller and the 'selector' disappears from the screen

Thank you

... below original post ...

A function that allows you to freely and visually select an area of the screen
Yes I know, there are already some in the forum, however here is yet another cropping tool.
I collected some snippets from the forum and merged in a simple and quick cropping tool implemented as a single standalone function.
The _Crop() function simply returns a 4-element 1D array with the x-y coordinates of the upper left and the width and height of the selected area, respectively in the elements [0] [1] [2] [3]. So it's up to you to make good use of these parameters
An example of use:
Since Windows already has both a screenprint functionkey to copy the whole screen to the clipboard and the Alt-printscreen shortkut to copy only the active window to the clipboard, I'm goinmg to bind this _crop() function combined with the Control-printscreen hotkey to create a "partial" screenshot of the delimited area of the screen. The captured screenshot of that area is copied to the clipboard, so you can paste it wherever you want.
How to use it:
after running the script, use the Control+Printscreen keys to activate the crop tool that appears around the mouse position; then use the mouse to visually resize and move the area and when you have delimited the desired area click with the right mouse button inside the area to copy it to the clipboard.
Suggestions, improvements and finally error reports are welcome
Happy cropping

#AutoIt3Wrapper_Res_HiDpi=y
#include <Windowsconstants.au3>
#include <WinAPISys.au3>
#include <Misc.au3>
#include <GDIPlus.au3>

; ----------------------
; -- Demo start --------
; ----------------------
#include <ScreenCapture.au3> ; needed only for this demo
#include <Clipboard.au3> ; needed only for this demo
Global $user32 = DllOpen("user32.dll")
While 1
    ; hit Control+Printscreen to call the _Crop Function
    If _IsPressed("11", $user32) And _IsPressed("2C", $user32) Then _example() ; 11 CTRL key + 2C PRINTSCREEN key

    ; hit Control + c to exit this script (can be castomized with other keys)
    If _IsPressed("11", $user32) And _IsPressed("43", $user32) Then ExitLoop ; 11 CTRL key + 43 C key
    Sleep(150)
WEnd
DllClose($user32)
TrayTip("Crop demo", "End of the 'TSR' crop demo", 3, 1) ; (1) = Info icon
Sleep(3000)
Exit

Func _example()
    $aRect = _Crop() ; mark the area

    If Not @extended Then ; if the ESC key was pressed within the _Crop function the @extended is set to 1

        Local $hGui = GUICreate("", $aRect[2], $aRect[3], $aRect[0] - 1, $aRect[1] - 1, $WS_POPUPWINDOW)
        Local $idPic = GUICtrlCreatePic('', 0, 0, $aRect[2], $aRect[3])
        Local $hBmp = _ScreenCapture_Capture('', $aRect[0], $aRect[1], $aRect[0] + $aRect[2] - 1, $aRect[1] + $aRect[3] - 1, False)
        Local $iMidX = $aRect[0] + $aRect[2] / 2
        Local $iMidY = $aRect[1] + $aRect[3] / 2

        ; snippet by UEZ
        ; https://www.autoitscript.com/forum/topic/129333-screen-capture-to-clipboard/?do=findComment&comment=898287
        Local $bResult = _ClipBoard_Open(0) + _ClipBoard_Empty() + Not _ClipBoard_SetDataEx($hBmp, $CF_BITMAP)
        _ClipBoard_Close()
        If $bResult = 2 Then
            ToolTip("the area was copied to the clipboard", $iMidX, $iMidY, 'Info', 1, 6)
        Else
            ToolTip("Something went wrong", $iMidX, $iMidY, 'Error', 3, 6)
        EndIf

        ; snippet by Malkey
        ; https://www.autoitscript.com/forum/topic/191425-capturing-image-without-saving/?do=findComment&comment=1373088
        Local $STM_SETIMAGE = 0x0172
        GUICtrlSendMsg($idPic, $STM_SETIMAGE, $IMAGE_BITMAP, $hBmp)
        _WinAPI_DeleteObject($hBmp)

        GUISetState()
        DllCall("User32.dll", "int", "AnimateWindow", "hwnd", $hGui, "int", 750, "long", "0x00050002") ; Right-Left
        GUIDelete($hGui)
        Sleep(250)
        ToolTip('')
    EndIf
EndFunc   ;==>_example
; ----------------------
; -- Demo end ----------
; ----------------------

; #FUNCTION# ====================================================================================================================
; Name ..........: _Crop
; Description ...: A function that allows you to freely and visually select an area of the screen
; Syntax ........: _Crop([$i_X = Default[, $i_Y = Default[, $i_W = Default[, $i_H = Default[, $iMinW = -1[, $iMaxW = -1[,
;                  $iMinH = -1[, $iMaxH = -1]]]]]]]])
;
;                  - To resize the area click the left mouse button and drag on any of the moving colored edges of the tool.
;                    You can also LeftClick within the selected area and drag to move the whole selection.
;
;                  - To terminate the selection operation RightClick within the selected area.
;
;                    You can alse terminate the selection operation by hitting the ESC key;
;                    in that case the @extended macro will be setted to true
;
; Parameters ....:                        All parameters are optional:
;                  $i_X                 - [optional] an integer value. Default is MouseGetPos(0) - 50.
;                                         The upper left X coordinate where you want the cropping tool to appear
;
;                  $i_Y                 - [optional] an integer value. Default is MouseGetPos(1) - 50.
;                                         The upper left Y coordinate where you want the cropping tool to appear
;
;                  $i_W                 - [optional] an integer value. Default is 100.
;                                         The initial width of the selection area
;
;                  $i_H                 - [optional] an integer value. Default is 100.
;                                         The initial height of the selection area
;
;                  $iMinW               - [optional] an integer value. Default is 1 (minimum allowed is 1).
;                                         The minimum selectable width
;
;                  $iMaxW               - [optional] an integer value. Default is -1 (no limit).
;                                         The maximum selectable width
;
;                  $iMinH               - [optional] an integer value. Default is 1 (minimum allowed is 1).
;                                         The minimum selectable height
;
;                  $iMaxH               - [optional] an integer value. Default is -1 (no limit).
;                                         The maximum selectable height
;
; Return values .:                      - A 4 element 1D array where:
;                                         element [0] the upperLeft X coordinate of the selected area
;                                         element [1] the upperLeft Y coordinate of the selected area
;                                         element [2] the width of the selected area
;                                         element [3] the height of the selected area
;
;                                        @extended is set to True if you exit from the _crop() function by pressing the ESC key
;
; Author ........: Chimp (Gianni Addiego)
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......:
; ===============================================================================================================================
; Func _Crop($i_X = MouseGetPos(0) - 50, $i_Y = MouseGetPos(1) - 50, $i_W = 100, $i_H = 100, $iMinW = -1, $iMaxW = -1, $iMinH = -1, $iMaxH = -1)
Func _Crop($i_X = Default, $i_Y = Default, $i_W = Default, $i_H = Default, $iMinW = 1, $iMaxW = -1, $iMinH = 1, $iMaxH = -1)
    _GDIPlus_Startup()
    If ($i_X = '') Or ($i_X = Default) Then $i_X = MouseGetPos(0) - 50
    If ($i_Y = '') Or ($i_Y = Default) Then $i_Y = MouseGetPos(1) - 50
    If ($i_W = '') Or ($i_W = Default) Then $i_W = 100
    If ($i_H = '') Or ($i_H = Default) Then $i_H = 100
    If ($iMinW < 1) Or ($iMinW = Default) Then $iMinW = 1
    If ($iMaxW < 1) Or ($iMaxW = Default) Then $iMaxW = 65535
    If ($iMinH < 1) Or ($iMinH = Default) Then $iMinH = 1
    If ($iMaxH < 1) Or ($iMaxH = Default) Then $iMaxH = 65535

    ; used local variables
    Local $hGUI2, $hGUI3, $aWinPos2, $aPrevPos2[4], $aClientSize
    Local $iX, $iY, $iW, $iH
    Local Enum $x, $y
    Local $iOuterTolerance, $iBorder, $iInnerTolerance
    Local $hGraphic, $hPen, $AlphaKey = 0xFF000000, $RectColor, $RectBgColor
    Local $hDLL = DllOpen("user32.dll")
    Local $fOffset, $iDelay, $iTimerID = TimerInit()
    Local $iCursorID, $iBorderID, $aMousePointer, $iSide, $iTopBot, $iInner, $iRightEdge, $iBottomEdge, $iMouseOffsetX, $iMouseOffsetY
    Local $bEscape

    ; ==================================================================================
    ; Set the appearance and behaviour of the tool
    ; ==================================================================================
    $iBorder = 2 ; the width of the colored border (minimum 1)

    ; since with a very thin border it is difficult to click on it to drag it
    ; it is possible to set an external courtesy area authorized to click on the border
    ; even if the mouse is not exactly on it (it can also be set to 0 to disable it)
    $iOuterTolerance = 4 ; 'courtesy' external area allowed to click on the border

    ; same as above but for the inside of the edge
    $iInnerTolerance = 3 ; 'courtesy' internal area allowed to click on the border

    $RectColor = 0xFFFF0000 ;   The color of the colored moving edge

    $RectBgColor = 0xFFFFFF00 ; The Background color of the colored moving edge

    $iDelay = 50 ; this value determines the rotation speed of the moving colored border. The lower it is, the faster it is

    ; here the pattern of the moving edge can be customized
    ; Thanks to @UEZ for this snippet. See Here for reference: https://www.autoitscript.com/forum/topic/185769-moving-dash-rectangle/?do=findComment&comment=1343856
    Local $iCount = 4, $tArray = DllStructCreate("float;float;float;float")
    DllStructSetData($tArray, 1, 2) ;  dash length
    DllStructSetData($tArray, 2, 4) ;  space length
    DllStructSetData($tArray, 3, 2) ;  dash length
    DllStructSetData($tArray, 4, 4) ;  space length
    ; Important!: also set the below variable as the sum of all the above dash/space values
    ; ==========
    Local $iDotsDashesTotLen = 2 + 4 + 2 + 4 ; <--- adapt this variable to the above values
    ; ==================================================================================

    ; Create a transparent window where to draw the moving colored edge effect using the $iBorder variable
    ; X and Y coordinates refers to where will be placed the client crop area (not the draggable outer colored border)
    $hGUI2 = GUICreate('', $i_W + $iBorder * 2, $i_H + $iBorder * 2, $i_X - $iBorder, $i_Y - $iBorder, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST))

    ; make sure $AlphaKey color is different from both $RectColor and $RectBgColor
    While ($AlphaKey = $RectColor) Or ($AlphaKey = $RectBgColor)
        $AlphaKey += 1
    WEnd
    GUISetBkColor($AlphaKey, $hGUI2)
    _WinAPI_SetLayeredWindowAttributes($hGUI2, $AlphaKey, 0, $LWA_COLORKEY)

    ; Create a transparent window wider than the main one to allow the custom mouse cursor to be displayed even beyond the colored border (Tolerance)
    ; also, since this window is not "passthrough", it prevents mouse clicks from passing underneath.
    $hGUI3 = GUICreate('', $i_W + $iBorder * 2 + $iOuterTolerance * 2, $i_H + $iBorder * 2 + $iOuterTolerance * 2, $i_X - $iBorder - $iOuterTolerance, $i_Y - $iBorder - $iOuterTolerance, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST))
    WinSetTrans($hGUI3, "", 1)

    WinSetOnTop($hGUI3, "", $WINDOWS_ONTOP)
    GUISetState(@SW_SHOW, $hGUI2)
    GUISetState(@SW_SHOW, $hGUI3)

    $hPen = _GDIPlus_PenCreate($RectColor, $iBorder * 2) ; why * 2 ??
    _GDIPlus_PenSetColor($hPen, $RectColor)
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI2)

    Do
        $iSide = 0
        $iTopBot = 0
        $iInner = 0
        $bEscape = False

        $aMousePointer = GUIGetCursorInfo($hGUI2) ; zero based
        $aWinPos2 = WinGetPos($hGUI2)
        $aClientSize = WinGetClientSize($hGUI2)

        ; -----------------------
        ; check pointer position
        ; --------------------------------------------------------------------------------------------------------------------------------------------------------
        If _ ; Pointer is on the left border
                (($aMousePointer[$x] >= -$iOuterTolerance) And ($aMousePointer[$x] < ($iBorder + $iInnerTolerance))) And _
                (($aMousePointer[$y] >= -$iOuterTolerance) And ($aMousePointer[$y] < ($aClientSize[1] + $iOuterTolerance))) Then $iSide = 1
        If _ ; Pointer is on the right border
                (($aMousePointer[$x] >= ($aClientSize[0] - $iBorder - $iInnerTolerance)) And ($aMousePointer[$x] < ($aClientSize[0] + $iOuterTolerance))) And _
                (($aMousePointer[$y] >= -$iOuterTolerance) And ($aMousePointer[$y] < ($aClientSize[1] + $iOuterTolerance))) Then $iSide = 2
        If _ ; Pointer is on the top border
                (($aMousePointer[$y] >= -$iOuterTolerance) And ($aMousePointer[$y] < ($iBorder + $iInnerTolerance))) And _
                (($aMousePointer[$x] >= -$iOuterTolerance) And ($aMousePointer[$x] < ($aClientSize[0] + $iOuterTolerance))) Then $iTopBot = 3
        If _ ; Pointer is on the bottom border
                (($aMousePointer[$y] >= ($aClientSize[1] - $iBorder - $iInnerTolerance)) And ($aMousePointer[$y] < $aClientSize[1] + $iOuterTolerance)) And _
                (($aMousePointer[$x] >= -$iOuterTolerance) And ($aMousePointer[$x] < ($aClientSize[0] + $iOuterTolerance))) Then $iTopBot = 6
        If _ ; Pointer is within the client area
                (($aMousePointer[$x] >= ($iBorder + $iInnerTolerance)) And $aMousePointer[$x] < ($aClientSize[0] - $iBorder - $iInnerTolerance)) And _
                (($aMousePointer[$y] >= ($iBorder + $iInnerTolerance)) And $aMousePointer[$y] < ($aClientSize[1] - $iBorder - $iInnerTolerance)) Then $iInner = 9
        ; --------------------------------------------------------------------------------------------------------------------------------------------------------

        $iBorderID = $iSide + $iTopBot + $iInner
        ;
        ; SetCursor
        ; ---------
        $iCursorID = 0
        Switch $iBorderID
            Case 0
                $iCursorID = 2 ; ARROW

            Case 1, 2 ; 1 left ; 2 right
                $iCursorID = 13 ; SIZEWE

            Case 3, 6 ; 3 top ; 6 bottom
                $iCursorID = 11 ; SIZENS

            Case 5, 7 ; 5 TopRight ; 7 BottomLeft
                $iCursorID = 10 ; SIZENESW

            Case 4, 8 ; 4 TopLeft ; 8 BottomRight
                $iCursorID = 12 ; SIZENWSE

            Case 9 ; 9 Inside
                $iCursorID = 0 ; HAND - or SIZEALL (9)
        EndSwitch
        GUISetCursor($iCursorID, 1)

        ; -------------------------------------------------------
        ;  If LeftClick on the tool then Drag or redimm selector
        ; -------------------------------------------------------
        If _IsPressed("1", $hDLL) And $iBorderID And (WinActive($hGUI2) Or WinActive($hGUI3)) Then ; Left clicked
            $aWinPos2 = WinGetPos($hGUI2)

            Switch $iBorderID
                Case 0
                Case 1 ; Pointer is on the left border
                    $iMouseOffsetX = $aWinPos2[0] - MouseGetPos(0)
                    $iRightEdge = $aWinPos2[0] + WinGetClientSize($hGUI2)[0]

                Case 2 ; Pointer is on the right border
                    $iMouseOffsetX = $aWinPos2[0] + $aWinPos2[2] - MouseGetPos(0)

                Case 3 ; Pointer is on the top border
                    $iMouseOffsetY = $aWinPos2[1] - MouseGetPos(1)
                    $iBottomEdge = $aWinPos2[1] + $aWinPos2[3]

                Case 4 ; Pointer is on the top-left corner
                    $iMouseOffsetY = $aWinPos2[1] - MouseGetPos(1)
                    $iMouseOffsetX = $aWinPos2[0] - MouseGetPos(0)
                    $iRightEdge = $aWinPos2[0] + WinGetClientSize($hGUI2)[0]
                    $iBottomEdge = $aWinPos2[1] + $aWinPos2[3]

                Case 5 ; Pointer is on the top-right corner
                    $iMouseOffsetX = $aWinPos2[0] + $aWinPos2[2] - MouseGetPos(0)
                    $iMouseOffsetY = $aWinPos2[1] - MouseGetPos(1)
                    $iBottomEdge = $aWinPos2[1] + $aWinPos2[3]

                Case 6 ; Pointer is on the bottom border
                    $iMouseOffsetY = $aWinPos2[1] + $aWinPos2[3] - MouseGetPos(1)

                Case 7 ; Pointer is on the bottom-left
                    $iMouseOffsetY = $aWinPos2[1] + $aWinPos2[3] - MouseGetPos(1)
                    $iMouseOffsetX = $aWinPos2[0] - MouseGetPos(0)
                    $iRightEdge = $aWinPos2[0] + WinGetClientSize($hGUI2)[0]

                Case 8 ; Pointer is on the bottom-right
                    $iMouseOffsetY = $aWinPos2[1] + $aWinPos2[3] - MouseGetPos(1)
                    $iMouseOffsetX = $aWinPos2[0] + $aWinPos2[2] - MouseGetPos(0)

                Case 9
                    $iMouseOffsetY = $aWinPos2[1] - MouseGetPos(1)
                    $iMouseOffsetX = $aWinPos2[0] - MouseGetPos(0)
            EndSwitch

            Do
                $iX = Default
                $iY = Default
                $iW = Default
                $iH = Default

                Switch $iBorderID

                    Case 1 ; Pointer is on the left border
                        $iX = MouseGetPos(0) + $iMouseOffsetX
                        $iW = $iRightEdge - MouseGetPos(0) + -$iMouseOffsetX

                    Case 2 ; Pointer is on the right border
                        $iW = (MouseGetPos(0) - $aWinPos2[0]) + $iMouseOffsetX

                    Case 3 ; Pointer is on the top border
                        $iY = MouseGetPos(1) + $iMouseOffsetY
                        $iH = $iBottomEdge - MouseGetPos(1) + -$iMouseOffsetY

                    Case 4 ; Pointer is on the top-left corner
                        $iX = MouseGetPos(0) + $iMouseOffsetX
                        $iY = MouseGetPos(1) + $iMouseOffsetY
                        $iW = $iRightEdge - MouseGetPos(0) + -$iMouseOffsetX
                        $iH = $iBottomEdge - MouseGetPos(1) + -$iMouseOffsetY

                    Case 5 ; Pointer is on the top-right corner
                        $iY = MouseGetPos(1) + $iMouseOffsetY
                        $iW = (MouseGetPos(0) - $aWinPos2[0]) + $iMouseOffsetX
                        $iH = $iBottomEdge - MouseGetPos(1) + -$iMouseOffsetY

                    Case 6 ; Pointer is on the bottom border
                        $iH = (MouseGetPos(1) - $aWinPos2[1]) + $iMouseOffsetY

                    Case 7 ; Pointer is on the bottom-left corner
                        $iX = MouseGetPos(0) + $iMouseOffsetX
                        $iW = $iRightEdge - MouseGetPos(0) + -$iMouseOffsetX
                        $iH = (MouseGetPos(1) - $aWinPos2[1]) + $iMouseOffsetY

                    Case 8 ; Pointer is on the bottom-right corner
                        $iW = (MouseGetPos(0) - $aWinPos2[0]) + $iMouseOffsetX
                        $iH = (MouseGetPos(1) - $aWinPos2[1]) + $iMouseOffsetY

                    Case 9 ; Pointer is inside the client area
                        $iX = MouseGetPos(0) + $iMouseOffsetX
                        $iY = MouseGetPos(1) + $iMouseOffsetY

                EndSwitch

                If $iW > ($iMaxW + $iBorder * 2) Then
                    $iW = $iMaxW + $iBorder * 2
                    $iX = Default
                EndIf
                If $iW < ($iMinW + $iBorder * 2) Then
                    $iW = $iMinW + $iBorder * 2
                    $iX = Default
                EndIf
                If $iH > ($iMaxH + $iBorder * 2) Then
                    $iH = $iMaxH + $iBorder * 2
                    $iY = Default
                EndIf
                If $iH < ($iMinH + $iBorder * 2) Then
                    $iH = $iMinH + $iBorder * 2
                    $iY = Default
                EndIf

                WinMove($hGUI2, '', $iX, $iY, $iW, $iH)

                GUISetCursor($iCursorID, 1)
                $aWinPos2 = WinGetPos($hGUI2)
                $aClientSize = WinGetClientSize($hGUI2)

                ; If GUI2 moved or resized then redraw the colored border and reposition also GUI3
                If $aPrevPos2[0] <> $aWinPos2[0] Or $aPrevPos2[1] <> $aWinPos2[1] Or $aPrevPos2[2] <> $aWinPos2[2] Or $aPrevPos2[3] <> $aWinPos2[3] Then
                    ; store new position/size
                    $aPrevPos2[0] = $aWinPos2[0]
                    $aPrevPos2[1] = $aWinPos2[1]
                    $aPrevPos2[2] = $aWinPos2[2]
                    $aPrevPos2[3] = $aWinPos2[3]
                    _GDIPlus_GraphicsDispose($hGraphic)
                    WinMove($hGUI3, '', $aWinPos2[0] - $iOuterTolerance, $aWinPos2[1] - $iOuterTolerance, $aWinPos2[2] + $iOuterTolerance * 2, $aWinPos2[3] + $iOuterTolerance * 2)
                    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI2)
                    _GDIPlus_GraphicsClear($hGraphic, $AlphaKey) ; erase rect
                    _GDIPlus_PenSetDashStyle($hPen, $GDIP_DASHSTYLESOLID)
                    _GDIPlus_PenSetColor($hPen, $RectBgColor)
                    _GDIPlus_GraphicsDrawRect($hGraphic, 0, 0, $aWinPos2[2], $aWinPos2[3], $hPen)
                    ; _GDIPlus_PenSetDashStyle($hPen, $GDIP_DASHSTYLEDOT)
                    DllCall($__g_hGDIPDll, "int", "GdipSetPenDashArray", "handle", $hPen, "struct*", $tArray, "long", $iCount)
                    _GDIPlus_PenSetColor($hPen, $RectColor)
                    _GDIPlus_GraphicsDrawRect($hGraphic, 0, 0, $aWinPos2[2], $aWinPos2[3], $hPen) ; draw again rect
                EndIf

                If TimerDiff($iTimerID) > $iDelay Then
                    $fOffset = Mod($fOffset + .5, $iDotsDashesTotLen)
                    ; this is the key for the animated dotted line ;-) by UEZ
                    ; https://www.autoitscript.com/forum/topic/185769-moving-dash-rectangle/?do=findComment&comment=1343851
                    DllCall($__g_hGDIPDll, "int", "GdipSetPenDashOffset", "handle", $hPen, "float", $fOffset)
                    _GDIPlus_GraphicsClear($hGraphic, $AlphaKey) ; erase rect
                    _GDIPlus_PenSetDashStyle($hPen, $GDIP_DASHSTYLESOLID)
                    _GDIPlus_PenSetColor($hPen, $RectBgColor)
                    _GDIPlus_GraphicsDrawRect($hGraphic, 0, 0, $aWinPos2[2], $aWinPos2[3], $hPen)
                    ; _GDIPlus_PenSetDashStyle($hPen, $GDIP_DASHSTYLEDOT)
                    DllCall($__g_hGDIPDll, "int", "GdipSetPenDashArray", "handle", $hPen, "struct*", $tArray, "long", $iCount)
                    _GDIPlus_PenSetColor($hPen, $RectColor)
                    _GDIPlus_GraphicsDrawRect($hGraphic, 0, 0, $aWinPos2[2], $aWinPos2[3], $hPen) ; draw again rect
                    $iTimerID = TimerInit()
                EndIf
            Until Not _IsPressed("1", $hDLL) ; Right click released
        EndIf

        If TimerDiff($iTimerID) > $iDelay Then
            $fOffset = Mod($fOffset + .5, $iDotsDashesTotLen)
            DllCall($__g_hGDIPDll, "int", "GdipSetPenDashOffset", "handle", $hPen, "float", $fOffset) ; this is the key for the animated dotted line ;-) by UEZ
            _GDIPlus_GraphicsClear($hGraphic, $AlphaKey) ; erase rect
            _GDIPlus_PenSetDashStyle($hPen, $GDIP_DASHSTYLESOLID)
            _GDIPlus_PenSetColor($hPen, $RectBgColor)
            _GDIPlus_GraphicsDrawRect($hGraphic, 0, 0, $aWinPos2[2], $aWinPos2[3], $hPen)
            ; _GDIPlus_PenSetDashStyle($hPen, $GDIP_DASHSTYLEDOT)
            DllCall($__g_hGDIPDll, "int", "GdipSetPenDashArray", "handle", $hPen, "struct*", $tArray, "long", $iCount)
            _GDIPlus_PenSetColor($hPen, $RectColor)
            _GDIPlus_GraphicsDrawRect($hGraphic, 0, 0, $aWinPos2[2], $aWinPos2[3], $hPen) ; draw again rect
            $iTimerID = TimerInit()
        EndIf

        If _IsPressed('1B', $hDLL) Then $bEscape = True ; 1B ESC key
    Until ((_IsPressed('2', $hDLL) Or $bEscape) And (WinActive($hGUI2) Or WinActive($hGUI3))) ; RightClick means I'm done with selection

    Do; neutralize the RightClick persistency
    Until Not _IsPressed('2', $hDLL)

    Local $aGotRect[4] = [ _
            $aWinPos2[0] + $iBorder, _ ; ....... UpperLeft X of window's client area
            $aWinPos2[1] + $iBorder, _ ; ....... UpperLeft Y of window's client area
            $aWinPos2[2] - $iBorder * 2, _ ; ... Width of window's client area
            $aWinPos2[3] - $iBorder * 2 _ ; .... Height of window's client area
            ]
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()
    DllClose($hDLL)
    $tArray = 0
    GUIDelete($hGUI3)
    GUIDelete($hGUI2)
    Return SetError(0, $bEscape, $aGotRect)
EndFunc   ;==>_Crop

 

Edited by Chimp
New version of 2020/08/16

small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt....

Share this post


Link to post
Share on other sites

It doesn't work for me (Win7),  it shows that rectangle, but nothing is happening, unable to move it or change size or get a copy, the script doesn't crash, it is just doing nothing .  I need to end it with the system tray.

Edited by Nine

Share this post


Link to post
Share on other sites

Hi @Nine, thanks for the feedback
could you please tell me if the red rectangle is animated? ie the dots rotate counterclockwise? does the cursor take a different picture when you hover over each side and each of the corners and within the rectangle area? clicking and dragging with the right or left button on the edges and inside the area has no effect? is the area of the rectangle transparent? that is, you see what's underneath?
Thank you

Edited by Chimp

small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt....

Share this post


Link to post
Share on other sites
4 hours ago, Chimp said:

could you please tell me if the red rectangle is animated? ie the dots rotate counterclockwise?

Yes

4 hours ago, Chimp said:

does the cursor take a different picture when you hover over each side and each of the corners and within the rectangle area?

No

4 hours ago, Chimp said:

clicking and dragging with the right or left button on the edges and inside the area has no effect?

No effect

4 hours ago, Chimp said:

is the area of the rectangle transparent? that is, you see what's underneath?

Yes I can see underneath, I am just unable to control the rectangle. Right-click is not working, it is the underneath application that respond to the right-click.

Share this post


Link to post
Share on other sites

Nicely done Chimp but I think it is not DPI aware because when I crop a portion of the screen the result is not correct.

Additionally, thinner border lines would be better to set area more precise.


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
15 hours ago, Nine said:

... I can see underneath, I am just unable to control the rectangle. Right-click is not working, it is the underneath application that respond to the right-click.

could you please try to change this line:

$hGUI2 = GUICreate("", $aWinPos1[2], $aWinPos1[3], $aWinPos1[0], $aWinPos1[1], $WS_POPUP, $WS_EX_LAYERED + $WS_EX_TOPMOST + $WS_EX_TRANSPARENT)

with this other (removed the extended style $WS_EX_TRANSPARENT ( and also used BitOR instead of addition)):

$hGUI2 = GUICreate("", $aWinPos1[2], $aWinPos1[3], $aWinPos1[0], $aWinPos1[1], $WS_POPUP , BitOR( $WS_EX_LAYERED, $WS_EX_TOPMOST))

thank You

14 hours ago, UEZ said:

Nicely done Chimp but I think it is not DPI aware because when I crop a portion of the screen the result is not correct.

Additionally, thinner border lines would be better to set area more precise.

Hi @UEZ,thanks for the feedback,
any suggestions on how to make this a DPI aware script?
perhaps with some adjustment like those indicated here? (https://www.autoitscript.com/forum/topic/199786-making-your-compiled-application-dpi-aware/)?

Thank You

 

Edited by Chimp

small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt....

Share this post


Link to post
Share on other sites
14 hours ago, dmob said:

Working great on Win10. Nice job :thumbsup:

Thank You :)


small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt....

Share this post


Link to post
Share on other sites

A bit better, the cursor changes picture but still not able to move, change size or right click.  Tested on a Win10 PC and working perfectly.

Maybe my Win7 comp is somewhat non-standard with aero feature removed and others.  Thanks anyway for the effort.  Good job.

Share this post


Link to post
Share on other sites
4 hours ago, Nine said:

Maybe my Win7 comp is somewhat non-standard with aero feature removed and others.

My Windows 7 (Pro, 64-bit, SP1) is default, but shows similar behavior.I can select an area (see picture section), but as soon as I release the right mouse button the framed area disappears.

The following modification does not make any difference :

$hGUI2 = GUICreate("", $aWinPos1[2], $aWinPos1[3], $aWinPos1[0], $aWinPos1[1], $WS_POPUP , BitOR( $WS_EX_LAYERED, $WS_EX_TOPMOST))

CroptestWin7.jpg.0bf0d9eaf6aa7a5ad95a783e02d8591b.jpg


Musashi-C64.png

"In the beginning the Universe was created. This has made a lot of people very angry and been widely regarded as a bad move."

Share this post


Link to post
Share on other sites
3 hours ago, Musashi said:

... but as soon as I release the right mouse button the framed area disappears ...

Hi @Musashi, thanks for Your feedback
is not clear to me what happens on your system,
the right sequence of use (of the demo) should be:

  1. press control+printsceen (the 'selector' appears around the mouse)
  2. hovering  the mouse over any side or corner the cursor should change accordingly; LeftClick on the edges and drag to redim the area, also LeftClick within the area and drag to move the selection around.
  3. when you are done with the selection, RightClick within the area to copy the selected portion of the screen to the clipboard. The shot is taken and the 'selector' disappears from the screen. (just for fun I've also added a brief animation just to give a visual feedback of the action done)
  4. that's all, the selected screenshot is (should be) now into the clipboard to be pasted where you need it. (seems  the the taken area is not DPIaware... working on it)

Which of the above steps fail?

Thanks for your testing

Edited by Chimp

small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt....

Share this post


Link to post
Share on other sites
36 minutes ago, Chimp said:

Which of the above steps fail?

None, it was my own stupidity :lol:. I had overlooked that you have to press control+printsceen FIRST to start the process.

It works fine on my Windows 7 system, no matter if

$hGUI2 = GUICreate("", $aWinPos1[2], $aWinPos1[3], $aWinPos1[0], $aWinPos1[1], $WS_POPUP, $WS_EX_LAYERED + $WS_EX_TOPMOST + $WS_EX_TRANSPARENT)

or

$hGUI2 = GUICreate("", $aWinPos1[2], $aWinPos1[3], $aWinPos1[0], $aWinPos1[1], $WS_POPUP , BitOR( $WS_EX_LAYERED, $WS_EX_TOPMOST))

However : In the example, the process can be started multiple times and I miss an exit option. Hopefully I did not overlook something again.

36 minutes ago, Chimp said:

just for fun I've also added a brief animation just to give a visual feedback of the action done

Nice effect 👍

Thinner borderlines would be better, as @UEZ has already pointed out.

Edited by Musashi
typo

Musashi-C64.png

"In the beginning the Universe was created. This has made a lot of people very angry and been widely regarded as a bad move."

Share this post


Link to post
Share on other sites
9 hours ago, Chimp said:

Hi @UEZ,thanks for the feedback,
any suggestions on how to make this a DPI aware script?
perhaps with some adjustment like those indicated here? (https://www.autoitscript.com/forum/topic/199786-making-your-compiled-application-dpi-aware/)?

Thank You

I have checked also my script

which I coded sometime in 2018 on my previous notebook without DPI and it didn't work either.

I've updated the script by adding the function _WinAPI_SetProcessDpiAwarenessContext which seems to work properly on my Win10 v2004. I don't know if the script works properly on OS < Win10.

I've not check yet if

#AutoIt3Wrapper_Res_HiDpi=y

is sufficient.


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
53 minutes ago, Musashi said:

None, it was my own stupidity :lol:. I had overlooked that you have to press control+printsceen FIRST to start the process.

... my fault, i've not explained well in the OP :D

1 hour ago, Musashi said:

However : In the example, the process can be started multiple times and I miss an exit option. Hopefully I did not overlook something again.

hmmm this is not intentional, thanks for reporting it, I will look into the matter...

1 hour ago, Musashi said:

Thinner borderlines would be better, as @UEZ has already pointed out.

I agree with both of you, ... I'm working on it ..

 

Thanks again for your feedback.


small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt....

Share this post


Link to post
Share on other sites

thanks a lot @UEZ for these references, I will try to make good use of them ... :graduated:


small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt....

Share this post


Link to post
Share on other sites

A new version a bit simplified and corrected. see first post.


small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt....

Share this post


Link to post
Share on other sites
3 hours ago, Chimp said:

A new version a bit simplified and corrected. see first post.

Works without problems (Win7-64 SP1 and AutoIt 3.3.14.0) 👍


Musashi-C64.png

"In the beginning the Universe was created. This has made a lot of people very angry and been widely regarded as a bad move."

Share this post


Link to post
Share on other sites

@Chimp if you add 

#AutoIt3Wrapper_Res_HiDpi=y

it will work, too, when DPI is <> 100% but only if compiled.


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

Hi @Musashi, Many thanks for testing.

Hi @UEZ, Thanks for that tip, appreciated, directive added on the listing in first post. (...I don't know how to test it) :think:


small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt....

Share this post


Link to post
Share on other sites
58 minutes ago, Chimp said:

Hi @UEZ, Thanks for that tip, appreciated, directive added on the listing in first post. (...I don't know how to test it) :think:

On the naked desktop press the rmb and select "Display Settings" (Impostazioni display). There approx. in the middle you can find "Scale an layout" (Scalare un layout). Below you can change the dpi settings "Change the size of text, apps, and other items" (Cambiare la dimensione del testo, delle applicazioni e di altri elementi), e.g. to 125%.

Afterwards test your script by running the script directly without compiling it first and then with compiled version.

 


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

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • 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.


    • By Alexxander
      I have lot's of images like this
       
       
      http://postimg.org/image/uz24d8z27/
      http://postimg.org/image/5isx6mc61/
       
      i would like to crop the page number (the arabic number on the top of the page)
      so it would be something like this ...

       
      any ideas ?
       
       
       
       
    • By GreenCan
      This is a visual Crop Tool,
      Version 1.0.0.5

      Load the image in the Crop GUI Move the cross-hair to the upper left corner where to start cropping Mark the rectangle with left mouse button, release Adjust the position with left mouse, release (right mouse = start over) Press enter Image is saved in same folder, same format, with '_cr' added to file name As simple as that.
      Updated script,
       Visual Crop UDF 1.0.0.4 examples.au3
       Visual Crop UDF 1.0.0.4.au3 (No obscuration of non-selected  area)
       Visual Crop UDF 1.0.0.5.au3   (with obscuration)
      Ver 1.0.0.1
      Avoid trespassing the edge of the GUI while selecting the crop area. Ver 1.0.0.4
      Mark crop area in any direction Resizing Corner grabbers (use with Ctrl Left Mouse button) Mouse cursor changes over move and resizing corner grabbers Redraw when left mouse clicking outside of crop area (restart crop), right Mouse click, same result. Magnifier de-/selectable with Ctrl-M or F2. (original function by Melba23)     Note:
              without image ratio: Magnifier remains visible till the crop area has been marked
              with image ratio: Magnifier is only visible until the rectangle appears, first corner has been marked.
      Ver 1.0.0.5
      Obscure non crop area, did some hard thinking and found my way...  
      Missing still:
      ? Enjoy
       
      GreenCan
      Related:

       
    • By wakillon
      Easily Crop a picture to a wanted dimension
      and set your Windows desktop background wallpaper without stretching or distorting it.

      Drag'n drop a Picture for load it.
      Drag it for position it and use mouse wheel for zoom - unzoom it.(TouchPad users need to plug a Mouse )
      Select dimensions and format you want for save your wallpaper.
      Pictures with transparency are supported.
      By default Pictures are saved on your desktop.

      Tips :
      Hold Left Ctrl key for move the photo more slowly.
      Hold Left Shift key for move the photo more quickly.
      Hold Left Shift key for Zoom/UnZoom more quickly.
      Hold Left Shift key when drag'n drop photo for work with a best quality. (Moves and Zoom are more slow)

      Executable : WallpaperCropper.exe
    • By wakillon
      WallpaperCropper
      Easily Crop a picture to a wanted Screen dimension
      and  set your Windows desktop background wallpaper without stretching or distorting it.

            
              Does your desktop background picture look stretched ?
              Do you find it time-consuming to crop pictures to the right proportions for your desktop ?
              WallpaperCropper is the solution.
              Crop and set any picture easily to your desktop dimensions in some few clicks.
              Don't waste time loading big, slow photo-editing software to manually crop it or resize it.
              Don't stay stuck with the choices Windows gives you !
              Drag'n drop a Picture for load it.
              Drag it for position it and use mouse wheel for zoom - unzoom it.(TouchPad users need to plug a Mouse )
              Select dimensions and format you want for save your wallpaper.
              Pictures with transparency are supported.
              By default Pictures are saved on your desktop.
       
              Tips :
              Hold Left Ctrl key for move the photo more slowly.
              Hold Left Shift key for move the photo more quickly.
              Hold Left Shift key for Zoom/UnZoom more quickly.
              Hold Left Shift key when drag'n drop photo for work with a best quality. (Moves and Zoom are more slow)
       
      All externals files are included in script, and all Buttons were made online with chimply.com the easy and free buttons Generator !
      Previous downloads : 70 
      source : WallpaperCropper 1.0.1.5.au3
      executable : WallpaperCropper.exe.html
      (Once this html file downloaded, double click on it for start the download)
       
      Hope you will like it ! 
×
×
  • Create New...