rootx Posted February 29, 2016 Posted February 29, 2016 (edited) This script creates a list of images and their description, you can also rotate images and save them in the right quality. I would like to update the image in the Listview, when it is rotated by Gui2. I tried to find a good solution, but without success. Could someone help me, thanks. expandcollapse popup#include <APIResConstants.au3> #include <GuiTab.au3> #include <MsgBoxConstants.au3> #include <File.au3> #include <FileConstants.au3> #include <Array.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <WinAPI.au3> #include <GuiListView.au3> #include <GuiImageList.au3> #include <GDIPlus.au3> Global $hGUI2 = 1111,$hGUI1, $hButton3 ,$hButton1,$hButton2,$hButton3,$flip,$image2 _imagelist() Func _imagelist() Global $inimg = @ScriptDir&"\img.ini" Global $idListview, $hImage Local $aArray2 = _FileListToArrayRec(@ScriptDir, "*.jpg", $FLTAR_FILES, 1, $FLTAR_SORT,$FLTAR_FULLPATH) $fileArray4 = UBound($aArray2) -1 If $fileArray4 > 0 Then $hGUI1 = GUICreate("Image Album List "&$fileArray4, 800, 600) $idListview = GUICtrlCreateListView("", 2, 2, 800, 600, BitOR($LVS_SHOWSELALWAYS, $LVS_NOSORTHEADER, $LVS_REPORT)) _GUICtrlListView_SetExtendedListViewStyle($idListview, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES, $LVS_EX_DOUBLEBUFFER)) ; block resizing of columns ControlDisable($hGUI1, "", HWnd(_GUICtrlListView_GetHeader($idListview))) GUISetState() ; Load images $hImage = _GUIImageList_Create(64, 64,5,3) _GUICtrlListView_SetImageList($idListview, $hImage) ; Add columns _GUICtrlListView_AddColumn($idListview, "Image", 64) _GUICtrlListView_AddColumn($idListview, "Path", 350) _GUICtrlListView_AddColumn($idListview, "Caption",365) ;_GUICtrlListView_HideColumn($idListview, 1) _GDIPlus_Startup() Local $GDIpBmpLarge,$GDIpBmpResized,$GDIbmp For $y = 1 To $fileArray4 $ini = IniWrite($inimg,$aArray2[$y],"caption",$aArray2[$y]) ;<<< run only the first time, then put a comment $GDIpBmpLarge = _GDIPlus_ImageLoadFromFile($aArray2[$y]) ;GDI+ image! $GDIpBmpResized = _GDIPlus_ImageResize($GDIpBmpLarge, 64,64) ;GDI+ imagez $GDIbmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($GDIpBmpResized) ;GDI image! $img = _GUIImageList_Add($hImage, $GDIbmp) _GUICtrlListView_SetImageList($idListview, $hImage, 1) ;Add items _GUICtrlListView_AddItem($idListview, "", $img) ;load image inside listview _GUICtrlListView_AddSubItem($idListview, $y-1,$aArray2[$y],1) _GUICtrlListView_AddSubItem($idListview, $y-1,IniRead($inimg,$aArray2[$y],"caption",""),2) ;load caption inside listview ;Clean _GDIPlus_BitmapDispose($GDIpBmpLarge) ;release GDI+ image! _GDIPlus_BitmapDispose($GDIpBmpResized);release GDI+ image! _WinAPI_DeleteObject($GDIbmp);release Obj! Next GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") While 1 $aMsg = GUIGetMsg(1) Switch $aMsg[1] Case $hGUI1 Switch $aMsg[0] Case $GUI_EVENT_CLOSE ExitLoop GUIDelete($hGUI1) EndSwitch Case $hGUI2 Switch $aMsg[0] Case $GUI_EVENT_CLOSE GUIDelete($hGUI2) GUICtrlSetState ($idListview,$GUI_ENABLE) Case $hButton1 $flip = 1 rotate($image2,$flip) Case $hButton2 $flip = 4 rotate($image2,$flip) Case $hButton3 $flip = 6 rotate($image2,$flip) EndSwitch EndSwitch WEnd ;cleanup resources _GDIPlus_Shutdown() Else MsgBox("","","Images folder are empty") EndIf EndFunc Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam) #forceref $hWnd, $iMsg, $wParam Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $tInfo, $hWndListView = $idListview If Not IsHWnd($idListview) Then $hWndListView = GUICtrlGetHandle($idListview) $tNMHDR = DllStructCreate($tagNMHDR, $lParam) $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom")) $iIDFrom = DllStructGetData($tNMHDR, "IDFrom") $iCode = DllStructGetData($tNMHDR, "Code") Switch $hWndFrom Case $hWndListView Switch $iCode Case $NM_DBLCLK ; Sent by a list-view control when the user double-clicks an item with the left mouse button $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam) $path = IniRead("cfg.ini","PAGE","sourcedir","") Local $iItemText = _GUICtrlListView_GetItemText($idListview, DllStructGetData($tInfo, "Index"),2) Local $sValue = InputBox("Edit Image", "Enter your description.", ""," M100",400,150) Local $iIndex = _GUICtrlListView_GetSelectedIndices($idListview) _GUICtrlListView_SetItemText($idListview,$iIndex,$sValue,2) If $sValue <> "" Then IniWrite($inimg,_GUICtrlListView_GetItemText($idListview, DllStructGetData($tInfo, "Index"),1),"caption",$sValue) Else _GUICtrlListView_SetItemText($idListview,$iIndex,$iItemText,3) EndIf Case $LVN_COLUMNCLICK ; A column was clicked Local $tInfo = DllStructCreate($tagNMLISTVIEW, $lParam) _GUICtrlListView_SortItems($idListview, _GUICtrlListView_GetItemText($idListview, DllStructGetData($tInfo, "Index"),1)) Case $NM_RCLICK ; Sent by a list-view control when the user clicks an item with the right mouse button $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam) $image2 = _GUICtrlListView_GetItemText($idListview, DllStructGetData($tInfo, "Index"),1) Global $colrbt = 0xFF0CAA, $colortxbt = 0xFFFFFF $hGUI2 = GUICreate($image2, 800, 650, -1, -1);create a test gui to display the image $hButton1 = GUICtrlCreateButton("Rotate", 10, 610, 120, 30) GUICtrlSetBkColor(-1, $colrbt) GUICtrlSetColor(-1,$colortxbt) $hButton2 = GUICtrlCreateButton("Flip Horizontally", 140, 610, 120, 30) GUICtrlSetBkColor(-1, $colrbt) GUICtrlSetColor(-1,$colortxbt) $hButton3 = GUICtrlCreateButton("Flip Vertically", 270, 610, 120, 30) GUICtrlSetBkColor(-1, $colrbt) GUICtrlSetColor(-1,$colortxbt) GUISetState(@SW_SHOW) rotate($image2,0) GUICtrlSetState ($idListview,$GUI_DISABLE) Return 0 ; allow the default processing EndSwitch EndSwitch Return $GUI_RUNDEFMSG EndFunc ;==>WM_NOTIFY Func rotate($image2,$flip) _GDIPlus_Startup() Local $hImagex, $tData, $tParams $hImagex = _GDIPlus_ImageLoadFromFile($image2) $imgX = _GDIPlus_ImageGetWidth($hImagex) $imgY = _GDIPlus_ImageGetHeight($hImagex) $himage_Clone = _GDIPlus_BitmapCloneArea($hImagex, 0, 0, $imgX, $imgY,$GDIP_PXF24RGB) _GDIPlus_ImageDispose($hImagex) _GDIPlus_ImageRotateFlip($himage_Clone,$flip) Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI2) ;create a graphics object from a window handle $hImage_new2 = _GDIPlus_ImageResize($himage_Clone, 800,600) _GDIPlus_GraphicsDrawImage($hGraphics, $hImage_new2, 0, 0) ;display rotated image ;Change image quality $clsid = _GDIPlus_EncodersGetCLSID("JPG");type $tParams = _GDIPlus_ParamInit(1) $tData = DllStructCreate("int Quality") DllStructSetData($tData, "Quality", 100) ;quality 0-100 $pData = DllStructGetPtr($tData) _GDIPlus_ParamAdd($tParams, $GDIP_EPGQUALITY, 1, $GDIP_EPTLONG, $pData) $pParams = DllStructGetPtr($tParams) ;Save the new resized image. _GDIPlus_ImageSaveToFileEx($himage_Clone, $image2, $clsid, $pParams) ;clean _GDIPlus_ImageDispose($himage_Clone) _GDIPlus_GraphicsDispose($hGraphics) _GDIPlus_ImageDispose($hImage_new2) _GDIPlus_Shutdown() EndFunc Edited March 1, 2016 by rootx
UEZ Posted February 29, 2016 Posted February 29, 2016 (edited) Use _GUIImageList_Replace function to replace the image in the image list. The image must be in GDI format! Btw, I don't know why this function is not in the help file although it is in GuiImageList.au3... ; #NO_DOC_FUNCTION# ============================================================================================================= ; Name...........: _GUIImageList_Replace ; Description ...: Replaces an image with an icon or cursor ; Syntax.........: _GUIImageList_ReplaceIcon ( $hWnd, $iIndex, $hIcon ) ; Parameters ....: $hWnd - Handle to the control ; $iIndex - Index of the image to replace. ; $hImage - Handle to the bitmap that contains the image ; $hMask - A handle to the bitmap that contains the mask. ; +If no mask is used with the image list, this parameter is ignored ; Return values .: Success - True ; Failure - False ; Author ........: Gary Frost (gafrost) ; Modified.......: ; Remarks .......: The _GUIImageList_Replace function copies the bitmap to an internal data structure. ; Be sure to use the _WinAPI_DeleteObject function to delete $hImage and $hMask after the function returns. ; Related .......: ; Link ..........: ; Example .......: ; =============================================================================================================================== Func _GUIImageList_Replace($hWnd, $iIndex, $hImage, $hMask = 0) Local $aResult = DllCall("comctl32.dll", "bool", "ImageList_Replace", "handle", $hWnd, "int", $iIndex, "handle", $hImage, "handle", $hMask) If @error Then Return SetError(@error, @extended, False) Return $aResult[0] <> 0 EndFunc ;==>_GUIImageList_Replace Edited February 29, 2016 by UEZ Please don't send me any personal message and ask for support! I will not reply! Selection of finest graphical examples at Codepen.io The own fart smells best! ✌Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!¯\_(ツ)_/¯ ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ
rootx Posted February 29, 2016 Author Posted February 29, 2016 (edited) Thx UEZ, it should work... but obviously I'm doing something wrong please look here ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> test expandcollapse popup#include <APIResConstants.au3> #include <GuiTab.au3> #include <MsgBoxConstants.au3> #include <File.au3> #include <FileConstants.au3> #include <Array.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <WinAPI.au3> #include <GuiListView.au3> #include <GuiImageList.au3> #include <GDIPlus.au3> Global $hGUI2 = 1111,$hGUI1, $hButton3 ,$hButton1,$hButton2,$hButton3,$flip,$image2 _imagelist() Func _imagelist() Global $inimg = @ScriptDir&"\img.ini" Global $idListview, $hImage Local $aArray2 = _FileListToArrayRec("C:\Users\rootx10\Desktop\x", "*.jpg", $FLTAR_FILES, 1, $FLTAR_SORT,$FLTAR_FULLPATH) $fileArray4 = UBound($aArray2) -1 If $fileArray4 > 0 Then $hGUI1 = GUICreate("Image Album List "&$fileArray4, 800, 600) $idListview = GUICtrlCreateListView("", 2, 2, 800, 600, BitOR($LVS_SHOWSELALWAYS, $LVS_NOSORTHEADER, $LVS_REPORT)) _GUICtrlListView_SetExtendedListViewStyle($idListview, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES, $LVS_EX_DOUBLEBUFFER)) ; block resizing of columns ControlDisable($hGUI1, "", HWnd(_GUICtrlListView_GetHeader($idListview))) GUISetState() ; Load images $hImage = _GUIImageList_Create(64, 64,5,3) _GUICtrlListView_SetImageList($idListview, $hImage) ; Add columns _GUICtrlListView_AddColumn($idListview, "Image", 64) _GUICtrlListView_AddColumn($idListview, "Path", 350) _GUICtrlListView_AddColumn($idListview, "Caption",365) ;_GUICtrlListView_HideColumn($idListview, 1) _GDIPlus_Startup() Local $GDIpBmpLarge,$GDIpBmpResized,$GDIbmp For $y = 1 To $fileArray4 $ini = IniWrite($inimg,$aArray2[$y],"caption",$aArray2[$y]) ;<<< run only the first time, then put a comment $GDIpBmpLarge = _GDIPlus_ImageLoadFromFile($aArray2[$y]) ;GDI+ image! $GDIpBmpResized = _GDIPlus_ImageResize($GDIpBmpLarge, 64,64) ;GDI+ imagez $GDIbmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($GDIpBmpResized) ;GDI image! $img = _GUIImageList_Add($hImage, $GDIbmp) _GUICtrlListView_SetImageList($idListview, $hImage, 1) ;Add items _GUICtrlListView_AddItem($idListview, "", $img) ;load image inside listview _GUICtrlListView_AddSubItem($idListview, $y-1,$aArray2[$y],1) _GUICtrlListView_AddSubItem($idListview, $y-1,IniRead($inimg,$aArray2[$y],"caption",""),2) ;load caption inside listview ;Clean _GDIPlus_BitmapDispose($GDIpBmpLarge) ;release GDI+ image! _GDIPlus_BitmapDispose($GDIpBmpResized);release GDI+ image! _WinAPI_DeleteObject($GDIbmp);release Obj! Next GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") While 1 $aMsg = GUIGetMsg(1) Switch $aMsg[1] Case $hGUI1 Switch $aMsg[0] Case $GUI_EVENT_CLOSE ExitLoop GUIDelete($hGUI1) EndSwitch Case $hGUI2 Switch $aMsg[0] Case $GUI_EVENT_CLOSE GUIDelete($hGUI2) GUICtrlSetState ($idListview,$GUI_ENABLE) Case $hButton1 $flip = 1 rotate($image2,$flip) Case $hButton2 $flip = 4 rotate($image2,$flip) Case $hButton3 $flip = 6 rotate($image2,$flip) EndSwitch EndSwitch WEnd ;cleanup resources _GDIPlus_Shutdown() Else MsgBox("","","Images folder are empty") EndIf EndFunc Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam) #forceref $hWnd, $iMsg, $wParam Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $tInfo, $hWndListView = $idListview If Not IsHWnd($idListview) Then $hWndListView = GUICtrlGetHandle($idListview) $tNMHDR = DllStructCreate($tagNMHDR, $lParam) $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom")) $iIDFrom = DllStructGetData($tNMHDR, "IDFrom") $iCode = DllStructGetData($tNMHDR, "Code") Switch $hWndFrom Case $hWndListView Switch $iCode Case $NM_DBLCLK ; Sent by a list-view control when the user double-clicks an item with the left mouse button $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam) $path = IniRead("cfg.ini","PAGE","sourcedir","") Local $iItemText = _GUICtrlListView_GetItemText($idListview, DllStructGetData($tInfo, "Index"),2) Local $sValue = InputBox("Edit Image", "Enter your description.", ""," M100",400,150) Local $iIndex = _GUICtrlListView_GetSelectedIndices($idListview) _GUICtrlListView_SetItemText($idListview,$iIndex,$sValue,2) If $sValue <> "" Then IniWrite($inimg,_GUICtrlListView_GetItemText($idListview, DllStructGetData($tInfo, "Index"),1),"caption",$sValue) Else _GUICtrlListView_SetItemText($idListview,$iIndex,$iItemText,3) EndIf Case $LVN_COLUMNCLICK ; A column was clicked Local $tInfo = DllStructCreate($tagNMLISTVIEW, $lParam) _GUICtrlListView_SortItems($idListview, _GUICtrlListView_GetItemText($idListview, DllStructGetData($tInfo, "Index"),1)) Case $NM_RCLICK ; Sent by a list-view control when the user clicks an item with the right mouse button $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam) $image2 = _GUICtrlListView_GetItemText($idListview, DllStructGetData($tInfo, "Index"),1) Global $colrbt = 0xFF0CAA, $colortxbt = 0xFFFFFF $hGUI2 = GUICreate($image2, 800, 650, -1, -1);create a test gui to display the image $hButton1 = GUICtrlCreateButton("Rotate", 10, 610, 120, 30) GUICtrlSetBkColor(-1, $colrbt) GUICtrlSetColor(-1,$colortxbt) $hButton2 = GUICtrlCreateButton("Flip Horizontally", 140, 610, 120, 30) GUICtrlSetBkColor(-1, $colrbt) GUICtrlSetColor(-1,$colortxbt) $hButton3 = GUICtrlCreateButton("Flip Vertically", 270, 610, 120, 30) GUICtrlSetBkColor(-1, $colrbt) GUICtrlSetColor(-1,$colortxbt) GUISetState(@SW_SHOW) rotate($image2,0) GUICtrlSetState ($idListview,$GUI_DISABLE) Return 0 ; allow the default processing EndSwitch EndSwitch Return $GUI_RUNDEFMSG EndFunc ;==>WM_NOTIFY Func rotate($image2,$flip) _GDIPlus_Startup() Local $hImagex, $tData, $tParams $hImagex = _GDIPlus_ImageLoadFromFile($image2) $imgX = _GDIPlus_ImageGetWidth($hImagex) $imgY = _GDIPlus_ImageGetHeight($hImagex) $himage_Clone = _GDIPlus_BitmapCloneArea($hImagex, 0, 0, $imgX, $imgY,$GDIP_PXF24RGB) _GDIPlus_ImageDispose($hImagex) _GDIPlus_ImageRotateFlip($himage_Clone,$flip) Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI2) ;create a graphics object from a window handle $hImage_new2 = _GDIPlus_ImageResize($himage_Clone, 800,600) _GDIPlus_GraphicsDrawImage($hGraphics, $hImage_new2, 0, 0) ;display rotated image $tParams = _GDIPlus_ParamInit(1) $tData = DllStructCreate("int Quality") DllStructSetData($tData, "Quality", 100) ;quality 0-100 $pData = DllStructGetPtr($tData) _GDIPlus_ParamAdd($tParams, $GDIP_EPGQUALITY, 1, $GDIP_EPTLONG, $pData) ;Save the new resized image. _GDIPlus_ImageSaveToFileEx($himage_Clone, $image2, $clsid, $pParams) ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> test Local $iIndex2 = _GUICtrlListView_GetSelectedIndices($idListview) $GDIbmpx = _GDIPlus_BitmapCreateHBITMAPFromBitmap($GDIpBmpResizedx) ;GDI image! _GUIImageList_ReplaceIcon($idListview, $iIndex2,$GDIbmpx) ;clean _GDIPlus_ImageDispose($himage_Clone) _GDIPlus_GraphicsDispose($hGraphics) _GDIPlus_ImageDispose($hImage_new2) _GDIPlus_Shutdown() EndFunc Edited April 20, 2017 by rootx
UEZ Posted February 29, 2016 Posted February 29, 2016 Try these lines and it should work: Local $iIndex2 = _GUICtrlListView_GetSelectedIndices($idListview) $GDIpBmpResizedx = _GDIPlus_ImageResize($hImage_new2, 64, 64) ;GDI+ imagez $GDIbmpx = _GDIPlus_BitmapCreateHBITMAPFromBitmap($GDIpBmpResizedx) ;GDI image! _GUIImageList_Replace($hImage, $iIndex2, $GDIbmpx) rootx 1 Please don't send me any personal message and ask for support! I will not reply! Selection of finest graphical examples at Codepen.io The own fart smells best! ✌Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!¯\_(ツ)_/¯ ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ
kid1519 Posted April 20, 2017 Posted April 20, 2017 Hello @rootx and @UEZ Can i develop your code like my picture attached is It possible or impossible? I want rename pictures like list name
rootx Posted April 20, 2017 Author Posted April 20, 2017 ?? You can, try to do it, and then, post your code if you want others to help you.
vadivelero Posted April 21, 2017 Posted April 21, 2017 Local $iIndex2 = _GUICtrlListView_GetSelectedIndices($idListview) $GDIpBmpResizedx = _GDIPlus_ImageResize($hImage_new2, 64, 64) ;GDI+ imagez $GDIbmpx = _GDIPlus_BitmapCreateHBITMAPFromBitmap($GDIpBmpResizedx) ;GDI image! _GUIImageList_Replace($hImage, $iIndex2, $GDIbmpx) try above Best Collection wallpapers at HD Wallpapers. categories of Natural, Vehicle,Paintings and ect wallpapers and images Pictures.
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now