Seite 1 von 1

Bild auf anderes aufstempeln (Transparenz)

Verfasst: 15.05.2012 11:50
von WPö
Moin!

Stehe mal wieder tierisch auf'm Schlauch. Ich möchte einen Stempel (Img1) auf ein gleichgroßes Bild Img2 aufdrücken und evtl. die Transparenz einstellen. Der Witz dabei ist, daß das bisherige Programm den Hintergrund (Img2) auch bei vollständiger Transparenz im Stempel (Img1) verblaßt. Genau das will ich nicht, sondern nur, daß dort der Hintergrund unbeeinflußt bleibt.

Code: Alles auswählen

EnableExplicit
Define.l Img1, Img2, Out, sb, Rot
Define.s Text
Define.f r1,r2,w45,w135
sb = 40

Img1 = CreateImage(#PB_Any, 400,400, 32)
Img2 = CreateImage(#PB_Any, 400,400, 32)
If Img1 = 0 Or Img2 = 0
  MessageRequester("Fehler!", "Konnte Bild von 400x400 Bildpunkten nicht öffnen. Speicherplatzmangel?", #PB_MessageRequester_Ok)
  End
EndIf
Out = ImageOutput(Img1)
StartDrawing(Out)
Box(0,0, 400,400, RGBA(255,255,255,0))
Rot = RGBA(255,0,0,255)
FrontColor(Rot)
DrawingMode(#PB_2DDrawing_Outlined|#PB_2DDrawing_AlphaClip)
Circle(200,200, 200, Rot)
Circle(200,200, (200-sb), Rot)
DrawingMode(#PB_2DDrawing_AlphaClip)
FillArea(sb/2,200, -1, Rot)
r1 = (200-sb-2)
r2 = sb/2
w45 = Radian(45)
w135 = Radian(135)
LineXY(200-r1*Cos(w45)+r2*Cos(w135),200+r1*Sin(w45)-r2*Sin(w135), 200+r1*Cos(w45)+r2*Cos(w135),200-r1*Sin(w45)-r2*Sin(w135), Rot)
LineXY(200-r1*Cos(w45)-r2*Cos(w135),200+r1*Sin(w45)+r2*Sin(w135), 200+r1*Cos(w45)-r2*Cos(w135),200-r1*Sin(w45)+r2*Sin(w135), Rot)
FillArea(200-(200-sb-2)*Cos(w45),200+(200-sb-2)*Sin(w45), -1, Rot)
StopDrawing()

Out = ImageOutput(Img2)
StartDrawing(Out)
Box(0,0, 400,400, RGBA(255,255,255,255))
Box(150,175, 100,50, RGB(0,0,0))
DrawingMode(#PB_2DDrawing_AlphaBlend)
DrawAlphaImage(ImageID(Img1), 0,0, 228)
StopDrawing()

UsePNGImageEncoder()
SaveImage(Img2, "C:\Stop.png", #PB_ImagePlugin_PNG, 10, 32)
FreeImage(Img2)
FreeImage(Img1)
End
Wie ich mich kenne, übersehe ich nur eine Kleinigkeit. Hat jemand 'ne Idee? Ich gehe jetzt erstmal 'ne Runde spazieren. /:->

Gruß - WPö

Re: Bild auf anderes aufstempeln (Transparenz)

Verfasst: 15.05.2012 12:23
von STARGÅTE
Da ich leider nicht verstehe, was du eigentlich machen willst, hier nur ein paar Gundsachen:
  • Wenn du ein wirklich leeres (auch voll transparentes) Bild erstellen willst, solltest du

    Code: Alles auswählen

    CreateImage(#PB_Any, 400,400, 32|#PB_Image_Transparent)
    verwenden
  • Dieser Code hier:

    Code: Alles auswählen

    StartDrawing(Out)
    Box(0,0, 400,400, RGBA(255,255,255,0))
    macht kein transparentes weiß!
    Damit du den Alpha-Kanal direkt "schreiben" kannst, musst du #PB_2DDrawing_AllChannels als DrawingMode nutzen.
  • Dein Bild verblasst vermutlich, weil du halt keinen transparenten Stempel hast, sonden einen echt weißen Hintergrund.

Re: Bild auf anderes aufstempeln (Transparenz)

Verfasst: 15.05.2012 13:09
von WPö
Jawoll, Sternengatter!

Das war's. Ein paar kleine Anpassungen - und schon geht's. Zu blöd, denn es war eigentlich nur ein Anfängerfehler. Zur Vollständigkeit (für die, die auch nach solcher Funktionalität suchen):

Code: Alles auswählen

EnableExplicit
Define.l Img1, Img2, Out, sb, Rot
Define.s Text
Define.f r1,r2,w45,w135
sb = 40

Img1 = CreateImage(#PB_Any, 400,400, 32|#PB_Image_Transparent)
Img2 = CreateImage(#PB_Any, 400,400, 32|#PB_Image_Transparent)
If Img1 = 0 Or Img2 = 0
  MessageRequester("Fehler!", "Konnte Bild von 400x400 Bildpunkten nicht öffnen. Speicherplatzmangel?", #PB_MessageRequester_Ok)
  End
EndIf
Out = ImageOutput(Img1)
StartDrawing(Out)
DrawingMode(#PB_2DDrawing_AllChannels)
Box(0,0, 400,400, RGBA(255,255,255,0))
Rot = RGBA(255,0,0,255)
FrontColor(Rot)
DrawingMode(#PB_2DDrawing_Outlined|#PB_2DDrawing_AllChannels)
Circle(200,200, 200, Rot)
Circle(200,200, (200-sb), Rot)
FillArea(sb/2,200, -1, Rot)
r1 = (200-sb-2)
r2 = sb/2
w45 = Radian(45)
w135 = Radian(135)
LineXY(200-r1*Cos(w45)+r2*Cos(w135),200+r1*Sin(w45)-r2*Sin(w135), 200+r1*Cos(w45)+r2*Cos(w135),200-r1*Sin(w45)-r2*Sin(w135), Rot)
LineXY(200-r1*Cos(w45)-r2*Cos(w135),200+r1*Sin(w45)+r2*Sin(w135), 200+r1*Cos(w45)-r2*Cos(w135),200-r1*Sin(w45)+r2*Sin(w135), Rot)
FillArea(200-(200-sb-2)*Cos(w45),200+(200-sb-2)*Sin(w45), -1, Rot)
StopDrawing()

Out = ImageOutput(Img2)
StartDrawing(Out)
DrawingMode(#PB_2DDrawing_AllChannels)
Box(0,0, 400,400, RGBA(255,255,255,255))
Box(150,175, 100,50, RGBA(0,0,255,255))
DrawingMode(#PB_2DDrawing_AlphaBlend)
DrawAlphaImage(ImageID(Img1), 0,0, 228)
StopDrawing()

UsePNGImageEncoder()
SaveImage(Img2, "C:\Stop.png", #PB_ImagePlugin_PNG, 10, 32)
FreeImage(Img2)
FreeImage(Img1)
End
DANKE! :allright:

Gruß - WPö