inververs
AutoIT Гуру
- Сообщения
- 2,135
- Репутация
- 465
Еще один способ сохранения картинок из браузера IE.
Есть ограничения:
[list type=decimal]
[*]Работает в последних версиях браузера >= 9
[*]Изображения должны быть одного домена с документом.
[/list]
Примеры:
1. Сохранение на диск
2. Отображение в GUI
Есть ограничения:
[list type=decimal]
[*]Работает в последних версиях браузера >= 9
[*]Изображения должны быть одного домена с документом.
[/list]
Код:
Func _IEImageGetBinary($oImg)
Local $canvas = $oImg.document.createElement("canvas")
If Not IsObj($canvas) Then Return SetError(1, 0, 0)
$canvas.width = $oImg.width
$canvas.height = $oImg.height
Local $ctx = $canvas.getContext('2d')
$ctx.drawImage($oIMG, 0, 0)
Local $rawData = $canvas.toDataURL()
Local $a64Code = StringRegExp($rawData, '(?<=base64,).*$', 1)
If Not IsArray($a64Code) Then Return SetError(2, 0, 0)
Local $bData = _Base64Decode($a64Code[0])
Return SetError(@error, 0, $bData)
EndFunc ;==>_IEImageGetBinary
Func _Base64Decode($input_string)
Local $struct = DllStructCreate("int")
Local $a_Call = DllCall("Crypt32.dll", "int", "CryptStringToBinary", _
"str", $input_string, _
"int", 0, _
"int", 1, _
"ptr", 0, _
"ptr", DllStructGetPtr($struct, 1), _
"ptr", 0, _
"ptr", 0)
If @error Or Not $a_Call[0] Then Return SetError(3, 0, "")
Local $a = DllStructCreate("byte[" & DllStructGetData($struct, 1) & "]")
$a_Call = DllCall("Crypt32.dll", "int", "CryptStringToBinary", _
"str", $input_string, _
"int", 0, _
"int", 1, _
"ptr", DllStructGetPtr($a), _
"ptr", DllStructGetPtr($struct, 1), _
"ptr", 0, _
"ptr", 0)
If @error Or Not $a_Call[0] Then Return SetError(4, 0, "")
Return DllStructGetData($a, 1)
EndFunc ;==>_Base64Decode
Примеры:
1. Сохранение на диск
Код:
#include <IE.au3>
$oIE = _IECreate('http://autoit-script.ru/', 1, 1, 1, 0)
If @error Then Exit 99
$oIMGs = _IEImgGetCollection($oIE)
For $oImg In $oIMGs
If StringInStr($oImg.src, 'redirect.png') Then ExitLoop
Next
Example1($oImg)
Func Example1($oImg)
# Сохранение в файл
Local $bData = _IEImageGetBinary($oImg)
Local $hFile = FileOpen('1.png', 2 + 16)
FileWrite($hFile, $bData)
FileClose($hFile)
ShellExecute('1.png')
EndFunc
2. Отображение в GUI
Код:
#include <GDIPlus.au3>
#include <IE.au3>
$oIE = _IECreate('http://autoit-script.ru/', 1, 1, 1, 0)
If @error Then Exit 99
$oIMGs = _IEImgGetCollection($oIE)
For $oImg In $oIMGs
If StringInStr($oImg.src, 'redirect.png') Then ExitLoop
Next
Example2($oImg)
Func Example2($oImg)
# Отображение на форме
Local $Form1 = GUICreate("Form1", 118, 115, 192, 124)
Local $Pic1 = GUICtrlCreatePic("", 8, 8, 100, 100)
GUISetState(@SW_SHOW)
Local $bData = _IEImageGetBinary($oImg)
_GDIPlus_Startup()
Local $hImage = _GDIPlus_BitmapCreateFromMemory ($bData)
Local $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
_GDIPlus_Shutdown()
Local Const $STM_SETIMAGE = 0x172
_WinAPI_DeleteObject(GUICtrlSendMsg($Pic1, $STM_SETIMAGE, $IMAGE_BITMAP, $hBitmap))
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case -3
_WinAPI_DeleteObject($hBitmap)
_GDIPlus_BitmapDispose($hImage)
Exit
EndSwitch
WEnd
EndFunc