Jump to content

How convert image in memory to PNG _ScreenCapture


Recommended Posts

Hello.

I create a function that saves the log to an html file.
File html are included picture (conversion to Base64)

Everything works OK.
But I do the actions:

  • screenshot to the png file (smaller than bmp) per disk (  _ScreenCapture_Capture(@ScriptDir & "\screenshot.png")  )
  • convert image from disk to base64

I need help to optimize the script:

  1. - screenshot to memory (do not save to disk)
  2. - convert this object to png in memory
  3. - invoking the conversion of png image from memory to base64

The first step _ScreenCapture_Capture("") create handle to an HBITMAP in memory
How to convert image in memory to png?
How to use Func _ConvertToBase64

I attach my code

#include <ScreenCapture.au3>
#include <Date.au3>


Global $RaportFileName = @YEAR & "-" & @MON & "-" & @MDAY & "_" & @HOUR & "_" & @MIN & "_" & @SEC & ".html"

$text = "This is first line text" & @CRLF &"and this is next line"

_Raport($text, 1)
FileWrite(@ScriptDir & "\" & $RaportFileName, "</pre></html>")



; #FUNCTION# ====================================================================================================================
; Name ..........: _Raport
; Description ...:
; Syntax ........: _Raport($sText1[, $Screen = 0])
; Parameters ....: $sText1              - a string value.
;                  $Screen              - [optional] an unknown value. Default is 0.
;                                          0 - Default - do not screenshot
;                                          1 - added screenshot full desktop
; Return values .: None
; Author ........: Your Name
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _Raport($sText1, $Screen=0)
    Local $sText = ""
    Local $sHead = ""
    ; Define HTML file header and style
    $sHead = '<html>' & @CRLF & '<head><meta charset="utf-8"></head>' & @CRLF
    $sHead = $sHead & '<style>img{border:3px solid #FF0000;}</style>' & @CRLF
    $sHead = $sHead & '<style>pre{font-family: monospace;}</style>' & @CRLF
    $sHead = $sHead & '<style>pre{font-size: large;}</style>' & @CRLF
    $sHead = $sHead & '<pre>' & @CRLF

    If NOT FileExists(@ScriptDir & "\" & $RaportFileName) Then ; If file Raport not exist then create
        FileOpen(@ScriptDir & "\" & $RaportFileName, 258)
        FileWrite(@ScriptDir & "\" & $RaportFileName, $sHead)
    EndIf
    If StringInStr($sText1, @CRLF) > 0 Then ; @CRLF (ENTER) change the @CRLF and 11 space (indentation on width "[GG:MM:SS] ")
        $sText1 = StringReplace($sText1, @CRLF, @CRLF & '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;')
    EndIf

    $sText = $sText & $sText1
    If $Screen <> 0 Then
        _ScreenCapture_Capture(@ScriptDir & "\screenshot.png")
        $sText = $sText & @CRLF & '<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' & '<img src="data:image/png;base64,' & _ConvertToBase64(@ScriptDir & "\screenshot.png") & '"/>'
    EndIf

    FileWrite(@ScriptDir & "\" & $RaportFileName, "[" & _NowTime(5) & "]&nbsp;" & $sText & "<br><br>"&@CRLF)    ; write to file Raport
EndFunc

Func _ConvertToBase64($fFile)
    ;Xroot 2011
    ;ClipPut("")
    ;$FN=@ScriptDir & "\screenshot.png"
    $FN=$fFile
    $dat=FileRead(FileOpen($FN,16))
    $objXML=ObjCreate("MSXML2.DOMDocument")
    $objNode=$objXML.createElement("b64")
    $objNode.dataType="bin.base64"
    $objNode.nodeTypedValue=$dat
    ClipPut("")
    $Wynik = ""
    ;ClipPut($objNode.Text)
    $Wynik = $objNode.Text
    Return $Wynik
EndFunc

P.S.
Excuse me my not good English.

Link to comment
Share on other sites

Try this :

#include <ScreenCapture.au3>
#include <GDIPlus.au3>
#include <Date.au3>
#include <Memory.au3>

Global $RaportFileName = @YEAR & "-" & @MON & "-" & @MDAY & "_" & @HOUR & "_" & @MIN & "_" & @SEC & ".html"

$text = "This is first line text" & @CRLF &"and this is next line"

_Raport($text, 1)
FileWrite(@ScriptDir & "\" & $RaportFileName, "</pre></html>")

; #FUNCTION# ====================================================================================================================
; Name ..........: _Raport
; Description ...:
; Syntax ........: _Raport($sText1[, $Screen = 0])
; Parameters ....: $sText1              - a string value.
;                  $Screen              - [optional] an unknown value. Default is 0.
;                                          0 - Default - do not screenshot
;                                          1 - added screenshot full desktop
; Return values .: None
; Author ........: Your Name
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _Raport($sText1, $Screen=0)
    Local $sText = ""
    Local $sHead = ""
    ; Define HTML file header and style
    $sHead = '<html>' & @CRLF & '<head><meta charset="utf-8"></head>' & @CRLF
    $sHead = $sHead & '<style>img{border:3px solid #FF0000;}</style>' & @CRLF
    $sHead = $sHead & '<style>pre{font-family: monospace;}</style>' & @CRLF
    $sHead = $sHead & '<style>pre{font-size: large;}</style>' & @CRLF
    $sHead = $sHead & '<pre>' & @CRLF

    If NOT FileExists(@ScriptDir & "\" & $RaportFileName) Then ; If file Raport not exist then create
        FileOpen(@ScriptDir & "\" & $RaportFileName, 258)
        FileWrite(@ScriptDir & "\" & $RaportFileName, $sHead)
    EndIf
    If StringInStr($sText1, @CRLF) > 0 Then ; @CRLF (ENTER) change the @CRLF and 11 space (indentation on width "[GG:MM:SS] ")
        $sText1 = StringReplace($sText1, @CRLF, @CRLF & '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;')
    EndIf

    $sText = $sText & $sText1
    If $Screen <> 0 Then
        Local $hBitMap = _ScreenCapture_Capture("")
        _GDIPlus_Startup()
        Local $hImage = _GDIPlus_BitmapCreateFromHBITMAP ($hBitMap)
        Local $bString = Image2BinaryString($hImage)
        $sText = $sText & @CRLF & '<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' & '<img src="data:image/png;base64,' & _
          _ConvertToBase64($bString) & '"/>'
        _GDIPlus_ImageDispose($hImage)
        _WinAPI_DeleteObject($hBitMap)
        _GDIPlus_Shutdown()

    EndIf

    FileWrite(@ScriptDir & "\" & $RaportFileName, "[" & _NowTime(5) & "]&nbsp;" & $sText & "<br><br>"&@CRLF)    ; write to file Raport
EndFunc

Func _ConvertToBase64($bString)
    $objXML=ObjCreate("MSXML2.DOMDocument")
    $objNode=$objXML.createElement("b64")
    $objNode.dataType="bin.base64"
    $objNode.nodeTypedValue=Binary($bString)
    Return $objNode.Text
EndFunc

Func Image2BinaryString($hBitmap) ; based on UEZ code
Local $sImgCLSID, $tGUID, $tParams, $tData

  $sImgCLSID = _GDIPlus_EncodersGetCLSID("PNG")
  $tGUID = _WinAPI_GUIDFromString($sImgCLSID)

  Local $hStream = _WinAPI_CreateStreamOnHGlobal()
  _GDIPlus_ImageSaveToStream($hBitmap, $hStream, DllStructGetPtr($tGUID))
  Local $hMemory = _WinAPI_GetHGlobalFromStream($hStream)
  Local $iMemSize = _MemGlobalSize($hMemory)
  Local $pMem = _MemGlobalLock($hMemory)
  $tData = DllStructCreate("byte[" & $iMemSize & "]", $pMem)
  Local $bData = DllStructGetData($tData, 1)
  _WinAPI_ReleaseStream($hStream)
  _MemGlobalFree($hMemory)
  Return $bData

EndFunc

 

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

×
×
  • Create New...