Что нового

Как заполнить $tagGUID структуру имея только $hImage

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Есть у меня к примеру картинка в $hImage, а какая именно, jpg png или другого формата я не знаю. Как мне узнать ее формат?
Это мне нужно для функции
Код:
_GDIPlus_ImageSaveToStream
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
inververs,
Посмотрите функцию
Код:
_GDIPlus_ImageGetRawFormat()
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
joiner
Не получится так, т.к нельзя взять первые байты на анализ, т.к байтов то нету..

madmasles
Все время возвращает MEMORYBMP
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
inververs [?]
Все время возвращает MEMORYBMP
Ваш код где?
Немного переделал функцию:
Код:
#include <GDIPlus.au3>

Global $sImage = @ScriptDir & '\01.gif', $hImage, $tGUID, $pGUID

If Not FileExists($sImage) Then Exit 13

_GDIPlus_Startup()

$hImage = _GDIPlus_ImageLoadFromFile($sImage)
$tGUID = _GDIPlus_ImageGetRawFormatEx($hImage)
$pGUID = Ptr(@extended)
ConsoleWrite('pGUID: ' & $pGUID & @LF)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()
For $i = 1 To 4
	ConsoleWrite(DllStructGetData($tGUID, $i) & @LF)
Next


Func _GDIPlus_ImageGetRawFormatEx($h_Image)
	Local $a_Res, $t_GUID = DllStructCreate('ulong Data1;ushort Data2;ushort Data3;byte Data4[8]'), _;$tagGUID
			$p_GUID = DllStructGetPtr($t_GUID)

	$a_Res = DllCall($ghGDIPDll, 'uint', 'GdipGetImageRawFormat', 'handle', $h_Image, 'ptr', $p_GUID)
	If (@error) Or ($a_Res[0]) Then Return SetError(1)
	Return SetExtended($p_GUID, $t_GUID)
EndFunc   ;==>_GDIPlus_ImageGetRawFormatEx
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Вот мой код:
Для бета версии только.
Код:
#include <GDIPlus.au3>
#include <Clipboard.au3>
#include <WinAPIDiag.au3>


# example
#include <IE.au3>
;~ Local $oIE = _IECreate('http://images.yandex.by/#!/yandsearch?text=обои&uinfo=ww-1118-wh-742-fw-893-fh-536-pd-1', 1, 1, 1, 0)
Local $oIE = _IECreate('http://images.yandex.by/#!/yandsearch?text=обои&uinfo=ww-1118-wh-742-fw-0-fh-536-pd-1', 1, 1, 1, 0)
Sleep(5000)
Local $oImgs = _IETagNameGetCollection($oIE, 'img')

Local $bData, $hFile,$ext = 'png'
For $oImg In $oImgs
	$bData = _IEImageGetBinary_2($oImg)
	$hFile = FileOpen('images/' & Random() & '.' & $ext, 2 + 8 + 16)
	FileWrite($hFile, $bData)
	FileClose($hFile)
;~ ExitLoop
Next





Func _IEImageGetBinary_2($oImg)
	If Not IsObj($oImg) Then Return SetError(1, 0, 0)
	Local $oCtlRange = $oImg.document.body.createControlRange()
	If Not IsObj($oCtlRange) Then Return SetError(3, 1, 0)
	$oCtlRange.addElement($oImg)
	$oCtlRange.execCommand('Copy', False)
	_ClipBoard_Open(0)
	Local $hBitmap = _ClipBoard_GetDataEx($CF_BITMAP)
	Local $hBITMAPINFO = _ClipBoard_GetDataEx($CF_DIB)
	_ClipBoard_Close()
	ConsoleWrite($hBitmap & @LF)

	Local Const $tagBITMAPINFOHEADER_Beta = "dword biSize;long biWidth;long biHeight;word biPlanes;word biBitCount;" & _
        "dword biCompression;dword biSizeImage;long biXPelsPerMeter;long biYPelsPerMeter;dword biClrUsed;dword biClrImportant;"

	ConsoleWrite($oImg.src & @LF)
	_WinAPI_DisplayStruct ( $hBITMAPINFO ,$tagBITMAPINFOHEADER_Beta )


	_GDIPlus_Startup()

	Local $hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
	_WinAPI_DeleteObject($hBitmap)

	;Нужно узнать формат картинки???, по умолчанию png

	Local $sImgCLSID
	Local $format = _GDIPlus_ImageGetRawFormat ( $hImage )

	Local $ext = 'png'
	Local $aret = StringRegExp($oImg.src,'\.([^.\\/:*?"<>|\r\n]+)$',1)
	If IsArray($aret) Then $ext = $aret[0]
	Local $sImgCLSID = _GDIPlus_EncodersGetCLSID($ext)

	ConsoleWrite($ext & @LF)
	ConsoleWrite($format[0] & @LF)
	ConsoleWrite($format[1] & @LF)
	ConsoleWrite('=========' & @LF)

	Local $tGUID = _WinAPI_GUIDFromString($sImgCLSID)
	Local $pEncoder = DllStructGetPtr($tGUID)

	Local $pStream = _WinAPI_CreateStreamOnHGlobal()

	_GDIPlus_ImageSaveToStream($hImage, $pStream, $pEncoder)
	_GDIPlus_ImageDispose($hImage)

	Local $pData = _WinAPI_GetHGlobalFromStream($pStream)
	Local $pMemory = _MemGlobalLock($pData)
	Local $iSize = _MemGlobalSize($pData)
	Local $bytes = DllStructCreate('byte[' & $iSize & ']', $pMemory)
	Local $binary = DllStructGetData($bytes, 1)

	_MemGlobalUnlock($pMemory)
	_WinAPI_ReleaseStream($pStream)
	_GDIPlus_Shutdown()

	Return SetError(0, 0, $binary)
EndFunc   ;==>_IEImageGetBinary_2
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
inververs,
А если сразу задать формат PNG?
Код:
#include <GDIPlus.au3>
;...
Local $tGUID, $pGUID

$tGUID = DllStructCreate('byte[16]')
DllStructSetData($tGUID, 1, Binary('0xAF3C6BB92807D3119D7B0000F81EF32E'));PNG
$pGUID = DllStructGetPtr($tGUID)
;...
; Проверка:
ConsoleWrite(_WinAPI_StringFromGUID($pGUID) & @LF)
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
madmasles [?]
А если сразу задать формат PNG?
У меня так и было сперва, я сохранял все в png, но потом подумал, что картинки могут быть и в jpg или в другом формате, вот и решил, может есть способ узнать как то формат.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
inververs,
По-моему, $tGUID задает формат для сохраняемого файла, как задали, так и сохранили. Попробуйте сохранить один рисунок в разных форматах. Интересно, что получится?
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
madmasles [?]
По-моему, $tGUID задает формат для сохраняемого файла, как задали, так и сохранили. Попробуйте сохранить один рисунок в разных форматах. Интересно, что получится?
Да, точно, вы правы, когда задаешь $tGUID, то в этом же формате и сохраняет. Смотрел файл в "блокноте". Тогда значит, можно особо не заморачиваьтся с форматом, а сразу задавать нужный.
 
Верх