Bild auf anderes aufstempeln (Transparenz)

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
WPö
Moderator
Beiträge: 669
Registriert: 27.05.2008 12:44
Wohnort: Oberland
Kontaktdaten:

Bild auf anderes aufstempeln (Transparenz)

Beitrag 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ö
Ich glaube nur der Statistik, die ich selbst gefälscht habe!
Meine Netzpräsenz: WPö.de
PB5.31 auf LMDE und Pentium T7200 2,00GHz, 4GB DDR2, ATI X1400.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Bild auf anderes aufstempeln (Transparenz)

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
WPö
Moderator
Beiträge: 669
Registriert: 27.05.2008 12:44
Wohnort: Oberland
Kontaktdaten:

Re: Bild auf anderes aufstempeln (Transparenz)

Beitrag 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ö
Ich glaube nur der Statistik, die ich selbst gefälscht habe!
Meine Netzpräsenz: WPö.de
PB5.31 auf LMDE und Pentium T7200 2,00GHz, 4GB DDR2, ATI X1400.
Antworten