Bilder zusammenfügen - Wie ARGB verrechnen?
Übersicht

![]() |
M0rgensternBetreff: Bilder zusammenfügen - Wie ARGB verrechnen? |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo Leute,
Ich bin gerade für nen Kumpel dabei ein Programm zu schreiben, mit dem man Bilder zusammenfügen kann. Also ein kleineres Bild soll über ein größeres drübergelegt werden und das neue Bild abgespeichert werden. Dazu lade ich die beiden Bilder als Pixmaps in den Speicher und mache folgendes: Code: [AUSKLAPPEN] Function AddImages:TPixmap(pPix1:TPixmap, pPix2:TPixmap)
Local newPix:TPixmap = TPixmap.Create(pPix1.width, pPix1.height, pPix1.format) Local tsStream:TStream = WriteFile("Out.txt") 'Datei um Werte zu speichern For Local iX:Int = 0 To (newPix.width - 1) For Local iY:Int = 0 To (newPix.height - 1) If (iX < pPix2.width) And (iY < pPix2.height) Then Local argb1:Int = pPix2.ReadPixel(iX, iY) Local argb2:Int = pPix1.ReadPixel(iX, iY) Local added:Int = AddARGB(argb1, argb2, tsStream) newPix.WritePixel(iX, iY, added) Else newPix.WritePixel(iX, iY, pPix1.ReadPixel(iX, iY)) EndIf Next Next Return newPix End Function BlitzMax: [AUSKLAPPEN] Function AddARGB:Int(argb1:Int, argb2:Int, pStream:TStream = Null) Das Problem, das ich jetzt habe ist: In meinem Wasserzeichen ist schwarzer, halbtransparenter Text. Das heißt der hat einen RGB Wert von 0,0,0. So wie ich oben rechne wird also nur das andere Bild übernommen, und der Text wird nicht eingezeichnet. Kann mir bitte jemand sagen, wie ich die beiden argb Werte miteinander verrechnen muss, damit das eine Bild (dessen Hintergrund transparent ist) über dem anderen liegt und die Transparent des oberen Bildes beachtet wird? Lg, M0rgenstern |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Frage: Warum zeichnest du das nicht einfach auf den Backbuffer und grabst dann das Ergebnis?
![]() |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hey Xeres, Danke.
Das scheint wirklich schneller und einfacher zu gehen. Das Problem ist nur: Scheinbar werden halbtransparente Farben nicht beachtet. Also Teile im Bild die halbtransparent sind werden gar nicht gezeichnet, bzw. die schwarze Schrift wird total zerteilt. Gibts da ne Möglichkeit das anders zu machen? Lg, M0rgenstern |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nicht SetBlend(ALPHABLEND) vergessen! | ||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Propellator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Da du sowieso binäre Operationen vornimmst, wäre es eventuell empfehlenswert den PixelPtr der Pixmap zu nehmen und dann die einzelnen Bytes zu OR-en (mit |). Wobei ich mir beim Or unsicher bin. ![]() |
||
Propellator - Alles andere ist irrelephant.
Elefanten sind die Könige der Antarktis. |
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hmm, auf anhieb würde ich es wie das "Additive Blendingn mit alpha" aus OpenGl lösen.
falls du den befehl glBlendfunc Kennst: GL_SRC_ALPHA, GL_ONE -> heißt im klartext, farbkomponenten von dem "oberen" bild (wasserzeichen?) werden mit dem ALPHAwert von dem oberen bild skaliert (bedenke: die werte sollten zwischen 0 und 1 liegen, am ende wieder *255 gerechnet werden^^) Die farbkomponenten vom "unteren" bild werden nicht verändert ( bzw alle werden *1 genommen). Auszug aus der DGL wiki: Zitat: Im folgenden sind Rq, Gq, Bq und Aq die Farbkomponenten des Fragmentes, dass neu dazukommt. Rz, Gz, Bz und Az sind die Farbkomponenten des bereits im Framebuffer enthaltenen Pixels und Rn, Gn, Bn und An sind die Farbkomponenten des sich ergebenden Fragmentes. Alle Werte sind skaliert auf einen Bereich von 0.0 bis 1.0, inklusive. Die Ergebnisswerte werden danach auf den Bereich 0.0 bis 1.0 geclampt.
(anmerkung: Fragment ist dein "oberes Bild", Framebuffer ist dein "unteres Bild") Zitat: Additives Blending (mit Alpha)
Das funktioniert eigentlich genauso wie das andere additive Blending, nur wird hier der Alphawert des neuen Fragmentes beachtet. Rn = Rz + Rq * Aq; Gn = Gz + Gq * Aq; Bn = Bz + Bq * Aq; An = Az + Aq * Aq; Die beiden Konstanten hierfür sind GL_SRC_ALPHA und GL_ONE. Ich hab dazu mal ein kleines beispiel geschrieben, hoffentlich verständlich. Allerdings ist mir auf die schnelle nicht eingefallen, wie die farbwerte am ende miteinander verrechnet. also hab ich von der DGL wiki die formel für Additives Blending mit alpha rausgekramt und hoffentlich richtig umgesetzt ^^ BlitzMax: [AUSKLAPPEN] SuperStrict Edit: Was? Oh schreck oO Da war ich aber mal langsam! Bist du vorher nicht auf die idee gekommen, es auf den Backbuffer zu zeichnen und zu Grabben? *g* Ich dachte, das hat einen besonderen grund, warum du das selbst machen willst ^^ Naja, ich lass mein gekritzel stehen. |
||
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Xeres hat Folgendes geschrieben: Nicht SetBlend(ALPHABLEND) vergessen!
Ha, das wars. Habs zwar ganz am Anfang so eingestellt, habe aber zwischendurch Graphics() aufgerufen und da wars dann natürlich wieder weg. Vielen Dank an alle. Klappt jetzt. @PhillipK: Nein ich hab wirklich nicht an GrabImage gedacht. Lg, M0rgenstern. |
||
![]() |
klin |
![]() Antworten mit Zitat ![]() |
---|---|---|
Für diejenigen, wo auf grafische Obefläche verzichten müssen:
https://www.blitzforum.de/foru...hp?t=27981 hatte es bei mir probiert und es funktioniert 1A =) Ist halt eine elegante Lösung. Man kann auch einfach pixmap.Paste() machen. Aber dann wird oft, wegen Transperenz, ein Loch rein gemacht. Klin |
||
![]() |
Jan_Ehemaliger Admin |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich möchte Kurz die Theorie dahinter erläutern, falls das hier jemand mal in der Suche mal findet.
zuerst müssen alle Ebenen sotiert werden, d.H. die hinterste ebne zuerst. weiterhin sollte man unbedingt mit Floats rechnen und es am ende in einen integer umwandeln. Es kann verschiedene hintergrundfarben geben! weiter geht man dann alle ebenen von hinten nach vorne durch. Code: [AUSKLAPPEN] farber=(unterefarber*(255.0-alpha)+(oberefarber*alpha)/(255.0))
farbeg=(unterefarbeg*(255.0-alpha)+(oberefarbeg*alpha)/(255.0)) farbeb=(unterefarbeb*(255.0-alpha)+(oberefarbeb*alpha)/(255.0)) Damit können Farbtöne gegeben werden oder auch komplett überdeckt. Lg. Jan_ |
||
between angels and insects |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group