Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   Resources.au3 - загрузить файл из ресурсов _GDIPlus_ImageLoadFromFile() (http://forum.oszone.net/showthread.php?t=173918)

FlatX007 23-04-2010 21:57 1399479

Resources.au3 - загрузить файл из ресурсов _GDIPlus_ImageLoadFromFile()
 
Как мне загрузить файл из ресурсов.

Пишу ,что - то вроде этого (перепробовал много вариантов) ничего не получается :(
Код:

$Image = _ResourceGet("IMAGE")
$hImage = _GDIPlus_ImageLoadFromFile($Image)


Creat0R 24-04-2010 00:27 1399591

Цитата:

Цитата FlatX007
Как мне загрузить файл из ресурсов »

Куда потом нужно это применить, вот в чём вопрос. _ResourceGet возвращает указатель на ресурс, а _GDIPlus_ImageLoadFromFile работает с файлом.
Можно конечно сохранить ресурс в файл, используя _ResourceSaveToFile, а можно получить hImage используя _ResourceGetAsImage.

Код:

$hImage = _ResourceGetAsImage("IMAGE")
И конечно же в таких случаях желательно прикреплять ссылку на такие внешние библиотеки как Resources.au3: http://www.autoitscript.com/forum/in...howtopic=51103

FlatX007 24-04-2010 10:40 1399700

_ResourceGetAsImage() я пробовал так .... нет изображения.
Функцией _ResourceSaveToFile() файлы на жеский диск я сохранять не хочу.

А можно рабочий пример ?

Creat0R 24-04-2010 15:58 1399855

Цитата:

Цитата FlatX007
можно рабочий пример ? »

Э нет, это сначала тебе нужно привести пример где оно не работает, как я уже писал:
Цитата:

Цитата Creat0R
Куда потом нужно это применить, вот в чём вопрос »


FlatX007 24-04-2010 16:54 1399886

Вложений: 1
Код:

#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_Run_AU3Check=n
#AutoIt3Wrapper_Run_After=ResHacker.exe -add %out%, %out%, Arrow.jpg, rcdata, Arrow, 0
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

#include <GDIPlus.au3>
#include <Resources.au3>

_GDIPlus_Startup ()
$Image = _ResourceGetAsImage("Arrow")
$hImage = _GDIPlus_ImageLoadFromFile($Image)
$sCLSID = _GDIPlus_EncodersGetCLSID ("JPG")
$tData = DllStructCreate("int Data")
DllStructSetData($tData, "Data", $GDIP_EVTTRANSFORMROTATE90)
$tParams = _GDIPlus_ParamInit(1)
_GDIPlus_ParamAdd ($tParams, $GDIP_EPGTRANSFORMATION, 1, $GDIP_EPTLONG, DllStructGetPtr($tData, "Data"))
_GDIPlus_ImageSaveToFileEx ($hImage, @ScriptDir & "\arrow1.jpg", $sCLSID, DllStructGetPtr($tParams))

$Form1 = GUICreate("", 236, 133)
$Pic1 = GUICtrlCreatePic($hImage, 16, 16, 100, 100) ; Тут должно быть изображение из ресурсов.
$Pic2 = GUICtrlCreatePic(@ScriptDir & "\arrow1.jpg", 120, 16, 100, 100)
;~ $Pic3 = GUICtrlCreatePic("", 16, 16, 100, 100)
;~ _ResourceSetImageToCtrl($Pic3, "Arrow")

GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case -3
            _GDIPlus_ShutDown ()
            Exit
    EndSwitch
WEnd


Sp01LeR 25-04-2010 23:20 1400617

Мне в принципе наверное понятна основная суть проблемы - я недавно тоже пытался реализовать загрузку изображения из памяти и вывод в окно, чтоб не использовать фун-ю FileInstall() с последующей загрузкой из картинки из файла, но, во первых, у меня с недавних пор очень мало свободн. времени, а во вторых, я не очень дружу с типизированными ЯП(а то бы давно уже кодил на С++).
Поэтому попытка реализации пока безуспешна...

Вот, то что удалось нагуглить по теме(ссылки на исходники С++) -
для загрузки BMP, GIF, JPEG/JPG, ICO, WMF, EMF и др. ресурсов
для загрузки PNG

Вот код скопированный из функции _ScreenCapture_Capture ($h_Src_Img - хендл обьекта для копирования):
Код:

Local $hWnd = _WinAPI_GetDesktopWindow()
Local $hDDC = _WinAPI_GetDC($hWnd)
Local $hCDC = _WinAPI_CreateCompatibleDC($hDDC)
Local $hBMP = _WinAPI_CreateCompatibleBitmap($hDDC, $iW, $iH)
_WinAPI_SelectObject($hCDC, $hBMP)
_WinAPI_BitBlt($hCDC, 0, 0, $iW, $iH, $hDDC, $iLeft, $iTop, $h_Src_Img)

Все остальные функции WinAPI нужно обрабатывать через DllCall - у меня в версии 3.3.2.0 для них еще UDF-обертку не прикрутили.

tweakos 26-04-2010 05:52 1400748

Ребята вы чо????????Это же элементарно ... даже удф вот эта не нужна
Цитата:

Цитата Creat0R

Код:

#include <winapi.au3>
#include <Constants.au3 >
#include <gdiplus.au3>
$lib=_WinAPI_LoadLibrary(@systemdir&"\logonui.exe")
$bmp=_WinAPI_LoadImage($lib,100,$IMAGE_BITMAP,0,0,"")
$gui=GUICreate("",@DesktopWidth,@DesktopHeight)
GUISetState()
 _GDIPlus_Startup()
 $hImage = _GDIPlus_BitmapCreateFromHBITMAP ($bmp)
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($gui)
 
_GDIPlus_GraphicsDrawImage($hGraphic,$hImage,0,0)
Sleep(5000)
_WinAPI_FreeLibrary($lib)

FlatX007, Ах да ,конкретно в вашем случае надо вот это
Цитата:

Цитата FlatX007
$Image = _ResourceGetAsImage("Arrow")
$hImage = _GDIPlus_ImageLoadFromFile($Image) »

заменить на это
Код:

$lib=_WinAPI_LoadLibrary(@ScriptFullPath)
$bmp=_WinAPI_LoadImage($lib,100,$IMAGE_BITMAP,0,0,"")
$hImage = _GDIPlus_BitmapCreateFromHBITMAP ($bmp)

А чтобы отобразилась картинка вместо GUICtrlCreatePic использовать _GDIPlus_GraphicsDrawImage.
Ну и добавлять картинку в exe в bmp формате.

FlatX007 26-04-2010 11:42 1400895

Цитата:

Цитата tweakos
tweakos »

Спасибо конечно ... но мне надо добавить jpg изображения, а в последствии png(что бы поддерживало прозрачность)

Yashied 26-04-2010 14:33 1401016

FlatX007, посмотри внимательно на следующий код:

Код:

#Region
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_Run_Au3check=n
#AutoIt3Wrapper_Run_After=ResHacker\ResHacker.exe -add %out%, %out%, Arrow.jpg, rcdata, "Arrow", 0
#EndRegion

#Include <GDIPlus.au3>
#Include <Resources.au3>

_GDIPlus_Startup()
$hImage = _ResourceGetAsImage("Arrow")
$hBitmap1 = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
_GDIPlus_ImageRotateFlip($hImage, 1)
$hBitmap2 = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
_GDIPlus_ImageDispose($hImage)

$Form1 = GUICreate("", 236, 133)
$Pic1 = GUICtrlCreatePic("", 16, 16, 100, 100)
GUICtrlSendMsg(-1, 0x0172, 0, $hBitmap1)
$Pic2 = GUICtrlCreatePic("", 120, 16, 100, 100)
GUICtrlSendMsg(-1, 0x0172, 0, $hBitmap2)
GUISetState(@SW_SHOW)

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case -3
                        _GDIPlus_Shutdown()
                        Exit
        EndSwitch
WEnd

; #FUNCTION# ====================================================================================================================
; Name...........: _GDIPlus_ImageRotateFlip
; Description ...: Rotates and flips an image
; Syntax.........: _GDIPlus_ImageRotateFlip($hImage, $iRotateFlipType)
; Parameters ....: $hImage                  - Pointer to an Image object
;                  $iRotateFlipType - Type of rotation and flip:
;                  |0 - No rotation and no flipping (A 180-degree rotation, a horizontal flip and then a vertical flip)
;                  |1 - A 90-degree rotation without flipping (A 270-degree rotation, a horizontal flip and then a vertical flip)
;                  |2 - A 180-degree rotation without flipping (No rotation, a horizontal flip folow by a vertical flip)
;                  |3 - A 270-degree rotation without flipping (A 90-degree rotation, a horizontal flip and then a vertical flip)
;                  |4 - No rotation and a horizontal flip (A 180-degree rotation followed by a vertical flip)
;                  |5 - A 90-degree rotation followed by a horizontal flip (A 270-degree rotation followed by a vertical flip)
;                  |6 - A 180-degree rotation followed by a horizontal flip (No rotation and a vertical flip)
;                  |7 - A 270-degree rotation followed by a horizontal flip (A 90-degree rotation followed by a vertical flip)
; Return values .: Success      - True
;                  Failure      - False and either:
;                  |@error and @extended are set if DllCall failed
; Remarks .......: None
; Related .......: None
; Link ..........; @@MsdnLink@@ GdipImageRotateFlip
; Example .......; No
; ===============================================================================================================================

Func _GDIPlus_ImageRotateFlip($hImage, $iRotateFlipType)
        Local $aResult = DllCall($ghGDIPDll, "uint", "GdipImageRotateFlip", "hwnd", $hImage, "int", $iRotateFlipType)
        If @error Then Return SetError(@error, @extended, False)
        Return $aResult[0] = 0
EndFunc  ;==>_GDIPlus_ImageRotateFlip



Время: 05:52.

Время: 05:52.
© OSzone.net 2001-