ImageGadget() Bilder mit Transparenz

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Tsuki-Namida
Beiträge: 633
Registriert: 17.11.2005 13:27
Kontaktdaten:

ImageGadget() Bilder mit Transparenz

Beitrag von Tsuki-Namida »

Hallo,
die meisten wissen ja das, dass ImageGadget() nur *.ico Dateien unterstützt wenn es um die Transparenz geht.

Meine Frage ist, gibt es eine Möglichkeit und zum Beispiel *.png oder wahlweise auch *.gif Dateien zu verwenden das deren Transparenz auch angenommen wird und nicht einfach weiß dargestellt wird?

Mir würde ggf. auch eine *.dll Datei helfen wenn diese ein Image mit Transparenz in ein Icon konvertieren kann mit vernünftigen Ergebnis...

Ich hoffe das es da was gibt.....

Liebe Grüße
Bild
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Könnte sein, das Dir dieses weiter hilft. Hab's selbst aber nicht getestet.

http://www.purebasic.fr/english/viewtop ... magegadget

http://purebasic.fr/english/viewtopic.p ... 582#243582

Gruß, Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Tsuki-Namida
Beiträge: 633
Registriert: 17.11.2005 13:27
Kontaktdaten:

Beitrag von Tsuki-Namida »

an sehn werde ich es mir noch muss jetzt leider weg -.-
ich hoffe das man das auf ein fenster machen kann werde aber erst später testen....

ggf ich bin weiterhin ofen für vorschläge/tips/lösungen :)

Liebe Grüße
Bild
Benutzeravatar
Tsuki-Namida
Beiträge: 633
Registriert: 17.11.2005 13:27
Kontaktdaten:

Beitrag von Tsuki-Namida »

@Falko
dein Vorschlag ist zuwar nicht schlecht aber es funktioniert leider nicht so wie ich mir das vorstelle...

es wird zwar die transparentz von dem *.png Image unterstützt aber es wird nur in 8 bit dargestellt und nicht in 32/24bit.... zudem sind die farben verfäscht -.-
und ich bekomme es nicht auf ein frnster drauf damit ich damit arbeiten kann wie zum beispiel "Imagegadget()"


@all
bitte verzeit meine rechtschreibschweche.... aber ist es nötig das hier so auszubreiten? T-T zudem hilft es mir nicht bei mein oben geposteten problem...
Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

@Offtopic

entschuldige, tut mir leid. war halt irgendwie so komisch, die formulierung. nimms nicht persönlich.


@Topic
in dem ersten verlinkten thread sind ein paar nicht-funktionierende codes drin.
erst der hier macht es anscheinend richtig:
http://www.purebasic.fr/english/viewtop ... 814#211814

in dem zweiten thread schreibt SofT MANiAC, dass man keine Farbe (0,0,0) in dem PNG haben soll für sein beispiel.

+Offtopic
das Bild in deiner Signatur wird nicht angezeigt.
> The requested URL /PB-Signatur.png was not found on this server.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Soweit ich das nun testen konnte als auch das passende 32-Bit-PNG aus der
Seite mit Schwarzen Hintergrund transparent gemacht habe funktioniert es
ohne Farbverfälschungen. Zudem ist dieser Source kürzer und ohne GDI.
Beide machen das gleiche. Nur wird das mit Hilfe #WS_EX_LAYERED des Windows erzeugt.

Bild

Code: Alles auswählen

UsePNGImageDecoder()
img = LoadImage(#PB_Any, "scaled.png")
OpenWindow(0,0,0,300,300,"",#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_BorderLess)

SetWindowLong_(WindowID(0),#GWL_EXSTYLE,GetWindowLong_(WindowID(0),#GWL_EXSTYLE)|#WS_EX_LAYERED)

hDC = StartDrawing(ImageOutput(img))
sz.SIZE
sz\cx = ImageWidth(img)
sz\cy = ImageHeight(img)
ContextOffset.POINT
BlendMode.BLENDFUNCTION
BlendMode\SourceConstantAlpha = 255
BlendMode\AlphaFormat = 1
UpdateLayeredWindow_(WindowID(0), 0, 0, @sz, hDC, @ContextOffset, 0, @BlendMode, 2)
StopDrawing()
ImageGadget(0,0,0,0,0,ImageID(img))
HideWindow(0,0)
Repeat:E=WaitWindowEvent():Delay(5):Until(E=#PB_Event_CloseWindow):End
Diesen 32-Bit-Pinguin kann man mit der Maus überall verschieben und er bleibt transparent.

Gruß Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Aber um das PNG auf ein Windows zu bekommen, kann man es am besten
mit diesen passenden Source machen. Ich habe ihn noch etwas
modifiziert, da dieser noch sehr alt war :lol:
Originalsource hier: http://www.purebasic.fr/english/viewtop ... 669#113669

Die PNG als Beispiel, siehe vorherigen Eintrag. Bitte diesen Pinguin als
scaled.png kopieren, falls der Name hier nicht durchkommt.


Ich nenne diesen neuen Source mal: Transparent_PNG.pb

Code: Alles auswählen

;OriginalSource von http://www.purebasic.fr/english/viewtopic.php?p=113669#113669

Procedure DrawTransparentImage(DC, Bitmap, x, y, Width, Height, TransparentColor)
  maskDC = CreateCompatibleDC_(DC)
  tempDC = CreateCompatibleDC_(DC)
  SourceDC = CreateCompatibleDC_(DC)
  SelectObject_(SourceDC, Bitmap)
  hMaskBmp = CreateBitmap_(Width, Height, 1, 1, 0)
  hTempBmp = CreateCompatibleBitmap_(DC, Width, Height)
  hMaskBmp = SelectObject_(maskDC, hMaskBmp)
  hTempBmp = SelectObject_(tempDC, hTempBmp)
  TransparentColor= SetBkColor_(SourceDC, TransparentColor)
  BitBlt_ (maskDC, 0, 0, Width, Height, SourceDC, 0, 0, #SRCCOPY)
  SetBkColor_(SourceDC, TransparentColor)
  BitBlt_ (tempDC, 0, 0, Width, Height, maskDC, 0, 0, #SRCCOPY)
  BitBlt_ (DC, x, y, Width, Height, tempDC, 0, 0, #MERGEPAINT)
  BitBlt_ (maskDC, 0, 0, Width, Height, maskDC, 0, 0, #NOTSRCCOPY)
  BitBlt_ (tempDC, 0, 0, Width, Height, SourceDC, 0, 0, #SRCCOPY)
  BitBlt_ (tempDC, 0, 0, Width, Height, maskDC, 0, 0, #MERGEPAINT)
  BitBlt_ (DC, x, y, Width, Height, tempDC, 0, 0, #SRCAND)
  DeleteObject_ (hMaskBmp)
  DeleteObject_ (hTempBmp)
  DeleteDC_ (maskDC)
  DeleteDC_ (tempDC)
  DeleteDC_ (SourceDC)
EndProcedure

UsePNGImageDecoder()
h=OpenWindow(0,0,0,500,500,"EM Lite",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
SetWindowColor(0,RGB(255,255,255))

;CreateGadgetList(h)
ii=ImageGadget(0,50,50,84,100,0)
i=LoadImage(0,"scaled.png")
;get the color
StartDrawing(ImageOutput(0)):c=Point(1,1):StopDrawing()

Structure _rect ;API stucture for rectangles !
  left.l
  top.l
  right.l
  bottom.l
EndStructure
;Create a new rect and set the values
rect._rect
rect\left=0
rect\top=0
rect\right=84
rect\bottom=100
;create a new brush for the rectangle
;br=CreateSolidBrush_(RGB(255,255,255)); Hier für den Hintergrund die passende Farbe wählen.
br=CreateSolidBrush_(GetWindowColor(0))
;I am using api for the DC StartDrawing isnt working :(
DC=GetDC_(ii)
;create a new DC for handle the transparent image
tDC=CreateCompatibleDC_(DC)
btm=CreateCompatibleBitmap_(DC, ImageWidth(0),ImageHeight(0))
SelectObject_(tDC,btm)
;draw a background color on the new DC
FillRect_(tDC,rect,br)
;Draw the sprite on new DC
DrawTransparentImage(tDC,ImageID(0),0,0,ImageWidth(0),ImageHeight(0),c)
;Clip the image from new DC to old DC , 40 is the start cliping left i used
BitBlt_ (DC,0,0,84,100,tDC,0,0,#SRCCOPY)
;delete the new DC and Bitmap and release the DC
DeleteObject_ (btm)
DeleteDC_ (tDC)
ReleaseDC_(ii,DC)
Repeat:Until WaitWindowEvent()=16 
Gruß, Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Antworten