Seite 1 von 1

ImageGadget() Bilder mit Transparenz

Verfasst: 26.05.2009 11:47
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

Verfasst: 26.05.2009 13:20
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

Verfasst: 26.05.2009 13:32
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

Verfasst: 27.05.2009 09:56
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...

Verfasst: 27.05.2009 15:55
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.

Verfasst: 27.05.2009 19:06
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

Verfasst: 27.05.2009 20:09
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