Что нового

Сохранить изображение из IE

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Еще один способ сохранения картинок из браузера IE.
Есть ограничения:
[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
 

Driver

Новичок
Сообщения
13
Репутация
0
Не хватает недостающие include приложить. (из "упаковки" не работает)
Гуглом не нашел то, что надо.
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Сама по себе функция _IEImageGetBinary не требует никаких других include
И она работает из коробки ;)
 

Driver

Новичок
Сообщения
13
Репутация
0
Странно, в версии v3.3.8.1 что-то у меня не работает + еще поиск _GDIPlus_BitmapCreateFromMemory вообще завел в какие-то дебри, но так и не заработал.
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
_GDIPlus_BitmapCreateFromMemory в библиотеке GDI появилась в бете.


Добавлено:
Сообщение автоматически объединено:

Вот если что, ее код
Код:
;==================================================================================================================================
; Author ........: UEZ
; Modified.......: progandy
;===================================================================================================================================
Func _GDIPlus_BitmapCreateFromMemory($bImage, $hHBITMAP = False)
	If Not IsBinary($bImage) Then Return SetError(1, 0, 0)
	Local $aResult = 0
	Local Const $memBitmap = Binary($bImage) ;load image saved in variable (memory) and convert it to binary
	Local Const $iLen = BinaryLen($memBitmap) ;get binary length of the image
	Local Const $GMEM_MOVEABLE = 0x0002
	$aResult = DllCall("kernel32.dll", "handle", "GlobalAlloc", "uint", $GMEM_MOVEABLE, "ulong_ptr", $iLen) ;allocates movable memory ($GMEM_MOVEABLE = 0x0002)
	If @error Then Return SetError(4, 0, 0)
	Local Const $hData = $aResult[0]
	$aResult = DllCall("kernel32.dll", "ptr", "GlobalLock", "handle", $hData)
	If @error Then Return SetError(5, 0, 0)
	Local $tMem = DllStructCreate("byte[" & $iLen & "]", $aResult[0]) ;create struct
	DllStructSetData($tMem, 1, $memBitmap) ;fill struct with image data
	DllCall("kernel32.dll", "bool", "GlobalUnlock", "handle", $hData) ;decrements the lock count associated with a memory object that was allocated with GMEM_MOVEABLE
	If @error Then Return SetError(6, 0, 0)
	Local Const $hStream = _WinAPI_CreateStreamOnHGlobal($hData) ;creates a stream object that uses an HGLOBAL memory handle to store the stream contents
	If @error Then Return SetError(2, 0, 0)
	Local Const $hBitmap = _GDIPlus_BitmapCreateFromStream($hStream) ;creates a Bitmap object based on an IStream COM interface
	If @error Then Return SetError(3, 0, 0)
	DllCall("oleaut32.dll", "long", "DispCallFunc", "ptr", $hStream, "ulong_ptr", 8 * (1 + @AutoItX64), "uint", 4, "ushort", 23, "uint", 0, "ptr", 0, "ptr", 0, "str", "") ;release memory from $hStream to avoid memory leak
	If $hHBITMAP Then
		Local Const $hHBmp = __GDIPlus_BitmapCreateDIBFromBitmap($hBitmap) ;supports GDI transparent color format
		_GDIPlus_BitmapDispose($hBitmap)
		Return $hHBmp
	EndIf
	Return $hBitmap
EndFunc   ;==>_GDIPlus_BitmapCreateFromMemory
 

Driver

Новичок
Сообщения
13
Репутация
0
Что так и не могу найти: _IEImageGetBinary
В стандартных IE.au3 ее нет. :stars:

з.ы. Спасибо за _GDIPlus_BitmapCreateFromMemory!
 

Driver

Новичок
Сообщения
13
Репутация
0
OffTopic:
:rofl: Мдааа)))
Пардоньте :smile:
"Молод, не опытен... исправлюсь"
 

filautdinov

Знающий
Сообщения
96
Репутация
9
Все прекрасно работает, но вопрос почему изоражение сохраняется обрезанное чать изображения с конца обрезано, как исправить?
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Замените на это:
Код:
$canvas.width = $oImg.clientWidth
    $canvas.height = $oImg.clientHeight
 
Верх