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:

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

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 :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

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