Seite 1 von 1
Wo ist Image im Speicher?
Verfasst: 13.09.2024 10:02
von margro
Hallo,
ich will ein Icon, welches ich etwa hiermit lade:
aus dem Speicher holen, um es dann in Base64 zu Encoden, also soetwas wie EncodeImage(). Leider geht dies nur mit gedrawten Images, nicht aber mit Image-Handles, soweit ich das verstanden habe

. Wie komme ich nun an die Speicheradresse des Icons?
MfG
Re: Wo ist Image im Speicher?
Verfasst: 13.09.2024 23:49
von jacdelad
Windows gibt beim Erstellen ein Handle zurück. Das Handle ist das gleiche, was du mit ImageID(MyImage) bekommst. Du kannst das Icon also einfach in PureBasic-Image zeichnen:
Code: Alles auswählen
Procedure GetIcon(Icon.i)
Protected BM.BITMAP,Info.ICONINFO,MyIcon.i,MyImage.i
MyIcon=LoadIcon_(#Null,Icon)
GetIconInfo_(MyIcon,Info)
GetObject_(Info\hbmColor,SizeOf(BM),BM)
MyImage=CreateImage(#PB_Any,BM\bmWidth,BM\bmHeight,32,#PB_Image_Transparent)
StartDrawing(ImageOutput(MyImage))
DrawingMode(#PB_2DDrawing_AlphaBlend)
DrawImage(MyIcon,0,0)
StopDrawing()
DeleteObject_(Info\hbmColor)
DeleteObject_(Info\hbmMask)
DeleteObject_(MyIcon)
ProcedureReturn MyImage
EndProcedure
Image.i=GetIcon(#IDI_ASTERISK)
OpenWindow(0,0,0,100,100,"",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
StartDrawing(WindowOutput(0))
DrawingMode(#PB_2DDrawing_AlphaBlend)
DrawImage(ImageID(Image),0,0)
StopDrawing()
Repeat
Until WaitWindowEvent()=#PB_Event_CloseWindow
...ich weiß jetzt aber nicht genau, wie man die Transparenz mitnimmt (ich hab da immer Probleme). Das wird sicher noch jemand korrigieren.
Re: Wo ist Image im Speicher?
Verfasst: 14.09.2024 17:51
von margro
Ja, schonmal danke für die Mühe, jacdelad. Aber ich wollte nur herausbekommen, wo das hImage / Image-ID bzw. das Icon sich im Speicher befindet. Ich habe hier was von idle gefunden, aber irgendwie komme ich damit nicht klar:
https://www.purebasic.fr/english/viewtopic.php?t=84151
Re: Wo ist Image im Speicher?
Verfasst: 15.09.2024 15:15
von margro
@jacdelad
So hier

:
Code: Alles auswählen
OpenWindow(0,0,0,100,100,"",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
StartDrawing(WindowOutput(0))
DrawImage(LoadIcon_(#Null, #IDI_APPLICATION),0,0)
StopDrawing()
Repeat
Until WaitWindowEvent()=#PB_Event_CloseWindow
Re: Wo ist Image im Speicher?
Verfasst: 17.09.2024 15:21
von jacdelad
Ja schon klar, das ist die vereinfachte Form meines Quelltexts (der den Vorteil hat, dass man das Bild noch weiterverarbeiten kann). Was hat das aber mit "wo ist mein Bild im Speicher" zu tun?
Übrigens war die Nutzung des WindowOutput nur zu Demozwecken, ich würde im richtigen Programm ein ImageGadget oder CanvasGadget nehmen.
Re: Wo ist Image im Speicher?
Verfasst: 18.09.2024 08:15
von margro
@jacdelad
Das hat mit
"...ich weiß jetzt aber nicht genau, wie man die Transparenz mitnimmt" zu tun.
@all
Unter meiner früheren Version von Win11 kann man keine weiteren Ordner zur Statusleiste hinzufügen. Darum musste ich mir eine Anwendung basteln, mit der ich auf die Schnelle Zugriff auf wichtige Programme habe. Dabei stellte sich heraus, dass das Laden der EXE-Symbole ziemlich lange dauert. Also habe ich mir gedacht, diese in eine Prefs-Datei als Base64-Code zu speichern. Das ist jetzt umgesetzt worden. Wer sich dafür interessiert, hier ein lauffähiges Codebeispiel:
Code: Alles auswählen
EnableExplicit
UsePNGImageDecoder()
UsePNGImageEncoder()
Procedure IconToImage(Pfad$)
Protected Icon.SHFILEINFO, Image
SHGetFileInfo_(Pfad$, #FILE_ATTRIBUTE_NORMAL, @Icon, SizeOf(SHFILEINFO), #SHGFI_ICON|#SHGFI_SMALLICON|#SHGFI_USEFILEATTRIBUTES)
Image = CreateImage(#PB_Any, 16, 16, 32, #PB_Image_Transparent)
If IsImage(Image)
If StartDrawing(ImageOutput(Image))
DrawImage(Icon\hIcon, 0, 0)
StopDrawing()
EndIf
EndIf
ProcedureReturn Image
EndProcedure
Procedure.s ImageToBase64(Image)
Protected Len, *MemoryID, Base64$
*MemoryID = EncodeImage(Image, #PB_ImagePlugin_PNG)
If *MemoryID
Len = MemorySize(*MemoryID)
If Len
Base64$ = Base64Encoder(*MemoryID, Len)
EndIf
FreeMemory(*MemoryID)
EndIf
ProcedureReturn Base64$
EndProcedure
Procedure Base64ToImage(Base64$)
Protected Len, *MemoryID, Image
Len = StringByteLength(Base64$)
If Len
*MemoryID = AllocateMemory(Len+SizeOf(Character))
If *MemoryID
Len = Base64Decoder(Base64$, *MemoryID, Len)
If Len
Image = CatchImage(#PB_Any, *MemoryID, Len)
EndIf
FreeMemory(*MemoryID)
EndIf
EndIf
ProcedureReturn Image
EndProcedure
Define Base64$ = "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACxElEQVQ4y42TXUiTURjHX7oshAjCSvswazrXu6bpwrFFmnkhjCDt86Ybg26yArvICDMiNOxDFjnD74/26WtOnbqtFqlzzrk2t8VMTArCLTNWYTa//p29iPDeVAd+cDjnPL/nOc/hUKbihJtDZcLRGXeL+0tAN/4vZt/pPaU3LhdIJJLEpKSkGKqzQoxnFyn0PdwGiyLuv9DcyRnMzJQWyGSyBMpQngzDLQrfPvvwv0NbcTosFIlLJamp6VRXhQBdZVxBOBzGxMQE/H4/PB4PQqEQR9By79Q8ny9SZND8I1R3pRC95ZvWBcFgEC6XC0Z7AFbrS6itDmj17fD7htYFrXfzF3g8ofKgICmLMj5Kg/lxLCuIZo4GB0Oz7MEFwsjvCORnzuOJsha+cQtZWeEKeqvEsCr3soJo2RZHAKvRSgjeSAS5cjmKq3vQ9sqOxroqrCzPcAV9CgkGGoVE4GWzDziH8YME+wmZUikOZYiRI8/HyAsGOt0gIj/NXEH/UxlsagkROEjDRqEb9MC+BNgigGkOYD4B3R+Agbce6DUMfs01cQUmZRYcTA4RWDE9PQaVRgvL1yVYSOPVk4BxGnCTOWP1oV9fjJWlN1yBuSYbTkMeERhJ0QE4HN2obdOC8X6Es4fB68AUG2zUPcDcZBE5Y2UFycl0DUfgMV8lm85o3+EaU6G5QcnemdFb0KsuwozrJFZXush+N5pvH4sk7qdrRTSdwwqmnIUw3OezdiD6VCYsL3Zgcb6ZUE+oI2t6goagwmDrcWRLpZ08Hv/EuqDlCvkPCnqNA2sI1khZg7/O8xLpdx6PLqT6SoS298MXMFK9Abb63RhuTIC9aR8cKhpOrQgu5jDcBhk8PVnw9uXCZ86DqebSwjn50dGU5NRrVHy8IGPrLvr65jhRQ8z2tPaNsaKOvxGzQ8Rs2Zmm2sNLrxQK08/+AT7DtgPNEOzeAAAAAElFTkSuQmCC"
If OpenWindow(0, 0, 0, 50, 200, "Window", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ButtonImageGadget(1, 0, 0, 100, 50, ImageID(Base64ToImage(Base64$)))
ButtonImageGadget(2, 0, 50, 100, 50, ImageID(IconToImage(#PB_Compiler_Home + "examples/sources/Data/CdPlayer.ico")))
ButtonImageGadget(3, 0, 100, 100, 50, ImageID(Base64ToImage(ImageToBase64(IconToImage(#PB_Compiler_Home + "examples/sources/Data/CdPlayer.ico")))))
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf