Wo ist Image im Speicher?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
margro
Beiträge: 19
Registriert: 17.07.2024 14:25

Wo ist Image im Speicher?

Beitrag von margro »

Hallo,
ich will ein Icon, welches ich etwa hiermit lade:

Code: Alles auswählen

LoadIcon_(#Null, #IDI_ASTERISK) 
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
PureBasic 6.12 LTS (x64) * Windows 11 (x64)
Benutzeravatar
jacdelad
Beiträge: 404
Registriert: 03.02.2021 13:39
Wohnort: Riesa
Kontaktdaten:

Re: Wo ist Image im Speicher?

Beitrag 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.
Guten Morgen, das ist ein schöner Tnetennba!

PureBasic 6.21/Windows 11 x64/Ryzen 7900X/32GB RAM/3 TB SSD
Synology DS1821+/DX517, 130.9TB+50.8TB+2TB SSD
Benutzeravatar
margro
Beiträge: 19
Registriert: 17.07.2024 14:25

Re: Wo ist Image im Speicher?

Beitrag 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
PureBasic 6.12 LTS (x64) * Windows 11 (x64)
Benutzeravatar
margro
Beiträge: 19
Registriert: 17.07.2024 14:25

Re: Wo ist Image im Speicher?

Beitrag von margro »

@jacdelad
So hier :wink: :

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
PureBasic 6.12 LTS (x64) * Windows 11 (x64)
Benutzeravatar
jacdelad
Beiträge: 404
Registriert: 03.02.2021 13:39
Wohnort: Riesa
Kontaktdaten:

Re: Wo ist Image im Speicher?

Beitrag 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.
Guten Morgen, das ist ein schöner Tnetennba!

PureBasic 6.21/Windows 11 x64/Ryzen 7900X/32GB RAM/3 TB SSD
Synology DS1821+/DX517, 130.9TB+50.8TB+2TB SSD
Benutzeravatar
margro
Beiträge: 19
Registriert: 17.07.2024 14:25

Re: Wo ist Image im Speicher?

Beitrag 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
PureBasic 6.12 LTS (x64) * Windows 11 (x64)
Antworten