Jump to content

how to put image to clipboard from file


Go to solution Solved by Nine,

Recommended Posts

SmartNote is a screen snip tool to take fast Screenshot (Note)  with OCR ability from Tesseract
for create new note  ALT_key and Left_mouse_button

I met some issues

One is that I didn't find out how to put image to clipboard from file

and I use the ms-paint for this

 

and the other is with the context menu array

I don't know if there is a more efficient way to handle it

 

#AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7
;~ ScriptName=SmartNote2.au3

#include <MsgBoxConstants.au3>
#include <ScreenCapture.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <TrayConstants.au3>
#include <Misc.au3>
#include <Array.au3>

;tray entry to exit script
Opt("TrayMenuMode", 3) ;0=append, 1=no default menu, 2=no automatic check, 4=menuitemID  not return
Opt("TrayOnEventMode", 1) ; Enable TrayOnEventMode.
TrayCreateItem("Exit")
TrayItemSetOnEvent(-1, "ExitScript")
TraySetIcon("mmcndmgr.dll", -106)

Global $mPos, $gPos[4], $Active_title, $ghost_gui, $block_gui, $Active_hWnd
Global $hDLL = DllOpen("user32.dll")
;~ array to hold the Contextmenu data
Global $NoteGui[1][10]

$NoteGui[0][0] = 0 ; Note_Handle cnt
$NoteGui[0][1] = "jpgPath"
$NoteGui[0][2] = "ID_PicCtrl"
$NoteGui[0][3] = "ID_ContextMenu"
$NoteGui[0][4] = "ID_cMenuCopy"
$NoteGui[0][5] = "ID_cMenuSave"
$NoteGui[0][6] = "ID_cMenuOpen"
$NoteGui[0][7] = "ID_cMenuOCR-eng"
$NoteGui[0][8] = "ID_cMenuOCR-eng+ell"
$NoteGui[0][9] = "ID_cMenuClose"

;~ HotKeySet("{PGUP}", "NoteGui_display") ; * <----   contex array info

; make ghost gui
$ghost_gui = GUICreate("ghost_gui", 100, 100, 1, 1, $WS_POPUP, BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST))
GUISetBkColor("0xFFFF00") ; $COLOR_YELLOW
WinSetTrans($ghost_gui, "", 50)

; make mouse block gui
$block_gui = GUICreate("ghost_gui", 200, 200, 1, 1, $WS_POPUP, BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST))
WinSetTrans($block_gui, "", 0)

; Check for leftover files
Global $iFileExists = FileExists(@ScriptDir & "\tmp")
If $iFileExists Then
    FileDelete(@ScriptDir & "\tmp\*.*")
Else
    DirCreate(@ScriptDir & "\tmp")
EndIf

; loop until program exit
Global $aMsg, $strLen
;*********************************************************************************************
While 1

    $Active_title = WinGetTitle("[ACTIVE]")
    $Active_hWnd = WinGetHandle($Active_title)

    ; whait ALT_key and Left_mouse_button _IsPressed  ; *  <-- ; for create new note  ALT_key and Left_mouse_button ; *  <-- 
    If _IsPressed("12", $hDLL) And _IsPressed("01", $hDLL) Then
        $mPos = MouseGetPos()
        $gPos[0] = $mPos[0]
        $gPos[1] = $mPos[1]

        ; Wait until mouse key is released.
        While _IsPressed("01", $hDLL)
            Sleep(250)

            $mPos = MouseGetPos()
            $gPos[2] = $mPos[0]
            $gPos[3] = $mPos[1]

            ; show ghost gui
            GUISetState(@SW_SHOW, $ghost_gui)
            WinMove($ghost_gui, "", $gPos[0], $gPos[1], $gPos[2] - $gPos[0], $gPos[3] - $gPos[1])

            ; show ghost gui
            GUISetState(@SW_SHOW, $block_gui)
            WinMove($block_gui, "", $mPos[0] - 100, $mPos[1] - 100)
        WEnd

        GUISetState(@SW_HIDE, $ghost_gui)
        GUISetState(@SW_HIDE, $block_gui)
        CreateNew_NoteGui($gPos)  ; create new note

    EndIf

    $Active_title = WinGetTitle("[ACTIVE]")
    $Active_hWnd = WinGetHandle($Active_title)

    $aMsg = GUIGetMsg()
    If $aMsg = 0 Or $aMsg = $GUI_EVENT_MOUSEMOVE Then ContinueLoop
    Switch $aMsg

        ; Copy to Clipboard
        Case 6, 17, 28, 39, 50, 61, 72, 83, 94, 105, 116, 127, 138, 149, 160, 171, 182, 193, 204, 215, 226, 237, 248, 259, 270, 281, 292, 303, 314, 325, 336, 347, 358
            _PicToClip($Active_title)

            ; Save as...
        Case 7, 18, 29, 40, 51, 62, 73, 84, 95, 106, 117, 128, 139, 150, 161, 172, 183, 194, 205, 216, 227, 238, 249, 260, 271, 282, 293, 304, 315, 326, 337, 348, 359
            SaveFileDlg()

            ; Open
        Case 8, 19, 30, 41, 52, 63, 74, 85, 96, 107, 118, 129, 140, 151, 162, 173, 184, 195, 206, 217, 228, 239, 250, 261, 272, 283, 294, 305, 316, 327, 338, 349, 360
            ShellExecute($Active_title)

            ; OCR - eng
        Case 10, 21, 32, 43, 54, 65, 76, 87, 98, 109, 120, 131, 142, 153, 164, 175, 186, 197, 208, 219, 230, 241, 252, 263, 274, 285, 296, 307, 318, 329, 340, 351, 362
            _Tesserac($Active_title, "eng")

            ; OCR - eng + ell
        Case 11, 22, 33, 44, 55, 66, 77, 88, 99, 110, 121, 132, 143, 154, 165, 176, 187, 198, 209, 220, 231, 242, 253, 264, 275, 286, 297, 308, 319, 330, 341, 352, 363
            ; More LangCode  -->  https://tesseract-ocr.github.io/tessdoc/Data-Files-in-different-versions.html
            _Tesserac($Active_title, "eng+ell")

            ; Close
        Case 13, 24, 35, 46, 57, 68, 79, 90, 101, 112, 123, 134, 145, 156, 167, 178, 189, 200, 211, 222, 233, 244, 255, 266, 277, 288, 299, 310, 321, 332, 343, 354, 365
            $strLen = StringLen(@ScriptDir & "\tmp\image_")
            If StringLeft($Active_title, $strLen) = @ScriptDir & "\tmp\image_" Then
                GUIDelete($Active_hWnd)
                FileDelete($Active_title)
                NoteGui_DeleteBy_cMenuClose($aMsg)
                ConsoleWrite("- WinClose " & $Active_hWnd & " & FileDelete " & $Active_title & @CRLF)
            EndIf

    EndSwitch

WEnd
;*********************************************************************************************

;--------------------------------------------------------------------------------------------
Func ExitScript()  ; exit program
    DllClose($hDLL)
    Exit
EndFunc   ;==>ExitScript
;--------------------------------------------------------------------------------------------
Func CreateNew_NoteGui($gPos)  ; create new note gui

;~  ;$NoteGui[0][0] = Note_Handle
;~  ;$NoteGui[0][1] = jpgPath
;~  ;$NoteGui[0][2] = ID_PicCtrl
;~  ;$NoteGui[0][3] = ID_ContextMenu
;~  ;$NoteGui[0][4] = ID_cMenuClose
;~  ;$NoteGui[0][5] = ID_cMenuSave
;~  ;$NoteGui[0][6] = ID_
;~  ;$NoteGui[0][7] = ID_
;~  ;$NoteGui[0][8] = ID_
;~  ;$NoteGui[0][9] = ID_

    Local $n, $gW, $gH

    ReDim $NoteGui[UBound($NoteGui) + 1][10]
    $NoteGui[0][0] += 1

    $n = $NoteGui[0][0]

    $gW = $gPos[2] - $gPos[0]
    $gH = $gPos[3] - $gPos[1]

    ; create note GUI
    $NoteGui[$n][0] = GUICreate($NoteGui[$n][1], $gW, $gH, $gPos[0], $gPos[1], $WS_POPUP, BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST))

    ; jpg Path for _ScreenCapture_Capture
    $NoteGui[$n][1] = @ScriptDir & "\tmp\image_" & $NoteGui[$n][0] & ".jpg"
    _ScreenCapture_Capture($NoteGui[$n][1], $gPos[0], $gPos[1], $gPos[2], $gPos[3])

    ; set jpg Path as GUI title
    WinSetTitle($NoteGui[$n][0], "", $NoteGui[$n][1])

    $NoteGui[$n][2] = GUICtrlCreatePic($NoteGui[$n][1], 0, 0, 0, 0, -1, $GUI_WS_EX_PARENTDRAG)
    GUICtrlCreateLabel("", 0, 0, $gW, $gH, $SS_GRAYFRAME)  ;just for $SS_GRAYFRAME

    ; Creates a context menu
    $NoteGui[$n][3] = GUICtrlCreateContextMenu($NoteGui[$n][2])
    ; MenuItem for the context menu
    $NoteGui[$n][4] = GUICtrlCreateMenuItem("Copy to Clipboard", $NoteGui[$n][3])
    $NoteGui[$n][5] = GUICtrlCreateMenuItem("Save as...", $NoteGui[$n][3])
    $NoteGui[$n][6] = GUICtrlCreateMenuItem("Open", $NoteGui[$n][3])
    GUICtrlCreateMenuItem("", $NoteGui[$n][3]) ; separator
    $NoteGui[$n][7] = GUICtrlCreateMenuItem("OCR - eng", $NoteGui[$n][3])
    $NoteGui[$n][8] = GUICtrlCreateMenuItem("OCR - eng+ell", $NoteGui[$n][3])
    GUICtrlCreateMenuItem("", $NoteGui[$n][3]) ; separator
    $NoteGui[$n][9] = GUICtrlCreateMenuItem("Close", $NoteGui[$n][3])

    ; Display the GUI.
    GUISetState(@SW_SHOW, $NoteGui[$n][0])

    Return $NoteGui[$n][0]

EndFunc   ;==>CreateNew_NoteGui
;--------------------------------------------------------------------------------------------
Func SaveFileDlg() ; Save file Dialog
    ; Create a constant variable in Local scope of the message to display in FileSaveDialog.
    Local Const $sMessage = "Choose a filename."

    ; Display a save dialog to select a file.
    Local $sFileSaveDialog = FileSaveDialog($sMessage, @ScriptDir & "\SET\", "image (*.jpg)", $FD_PATHMUSTEXIST)
    If @error Then
        ; Display the error message.
        ;MsgBox($MB_SYSTEMMODAL, "", "No file was saved.")
    Else
        ; Retrieve the filename from the filepath e.g. Example.jpg
        Local $sFileName = StringTrimLeft($sFileSaveDialog, StringInStr($sFileSaveDialog, "\", $STR_NOCASESENSEBASIC, -1))

        ; Check if the extension .jpg is appended to the end of the filename.
        Local $iExtension = StringInStr($sFileName, ".", $STR_NOCASESENSEBASIC)

        ; If a period (dot) is found then check whether or not the extension is equal to .jpg
        If $iExtension Then
            ; If the extension isn't equal to .jpg then append to the end of the filepath.
            If Not (StringTrimLeft($sFileName, $iExtension - 1) = ".jpg") Then $sFileSaveDialog &= ".jpg"
        Else
            ; If no period (dot) was found then append to the end of the file.
            $sFileSaveDialog &= ".jpg"
        EndIf

        ; Display the saved file.
        ConsoleWrite("You saved the following file:" & @CRLF & $sFileSaveDialog & @CRLF)

        FileCopy($Active_title, $sFileSaveDialog, $FC_OVERWRITE + $FC_CREATEPATH)

    EndIf
EndFunc   ;==>SaveFileDlg
;--------------------------------------------------------------------------------------------
Func NoteGui_display()
    _ArrayDisplay($NoteGui, "$NoteGui")
EndFunc   ;==>NoteGui_display
;--------------------------------------------------------------------------------------------
Func NoteGui_DeleteBy_cMenuClose($cMenuClose) ; NoteGui_DeleteBy_cMenuClose
    For $i = 1 To $NoteGui[0][0]
        If $cMenuClose = $NoteGui[$i][4] Then
            ExitLoop
        EndIf
    Next
    _ArrayDelete($NoteGui, $i)
    $NoteGui[0][0] -= 1
EndFunc   ;==>NoteGui_DeleteBy_cMenuClose
;--------------------------------------------------------------------------------------------
Func _PicToClip($Path) ; use ms-paint to copy image to clipboard
    ;Local $aPos = WinGetPos("[ACTIVE]")
    ShellExecute(@WindowsDir & "\system32\mspaint.exe", $Path, "", "open", @SW_HIDE)

    Local $MsPaint
    $MsPaint = WinWait("[CLASS:MSPaintApp]")
    WinActivate($MsPaint)
    Send("^a")
    Send("^c")
    WinClose($MsPaint)
EndFunc   ;==>_PicToClip
;--------------------------------------------------------------------------------------------
Func _Tesserac($ImagePath, $lang) ; perform ocr

;~ ; More LangCode  -->  https://tesseract-ocr.github.io/tessdoc/Data-Files-in-different-versions.html
;~ ; thanks to JohnOne  -->  https://www.autoitscript.com/forum/topic/174483-tesseract-simple-example/
;~ ; more info at  -->  https://tesseract-ocr.github.io/tessdoc/Command-Line-Usage.html#simplest-invocation-to-ocr-an-image
;~ ; Of course you will have to install it first. --> https://github.com/UB-Mannheim/tesseract/wiki
;~ ; I tried it in Windows 10 Pro 64-bit with the version of 32bit  -->  https://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-w32-setup-v5.2.0.20220712.exe

    Local $ResultTextPath, $OutPutPath, $TesseractExePath, $Result
    $ResultTextPath = @ScriptDir & "\Result"
    $OutPutPath = $ResultTextPath & ".txt"
    $TesseractExePath = "C:\Program Files (x86)\Tesseract-OCR\tesseract.exe"

    ShellExecuteWait($TesseractExePath, '"' & $ImagePath & '" "' & $ResultTextPath & '" -l ' & $lang & ' --psm 6', "", "", @SW_HIDE)
    ConsoleWrite($TesseractExePath & ' "' & $ImagePath & '" "' & $ResultTextPath & '" -l ' & $lang & ' --psm 6' & @CRLF)

    If @error Then
        Exit MsgBox($MB_OK + $MB_TOPMOST + $MB_ICONERROR, "Error", @error)
    EndIf

    $Result = FileRead($OutPutPath)

    MsgBox($MB_OK + $MB_TOPMOST, "OCR Result", $Result)
    ClipPut($Result)
    $mPos = MouseGetPos()
    ToolTip("The text was copied to the clipboard", $mPos[0] - 50, $mPos[1] - 20)
    Sleep(2000)
    ToolTip("")

    FileDelete($OutPutPath)
EndFunc   ;==>_Tesserac

 

Edited by ioa747

I know that I know nothing

Link to comment
Share on other sites

  • Solution

Maybe this ?

#include <GDIPlus.au3>
#include <Clipboard.au3>

_GDIPlus_Startup()
Local $hImage = _GDIPlus_ImageLoadFromFile("torus.jpg")
Local $hBitmap1 = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
_GDIPlus_ImageDispose($hImage)

Local $hBitmap2 = _WinAPI_CopyImage($hBitmap1, $IMAGE_BITMAP, 0, 0, $LR_COPYDELETEORG+$LR_COPYRETURNORG)
_WinAPI_DeleteObject($hBitmap1)
_GDIPlus_Shutdown()

_ClipBoard_Open(0)
_ClipBoard_Empty()
_ClipBoard_SetDataEx( $hBitmap2, $CF_BITMAP)
_ClipBoard_Close()
_WinAPI_DeleteObject($hBitmap2)

 

Edited by Nine
corrected a small bug
Link to comment
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
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...