Bereiche eines Bildes mit einer transparenten Farbe versehen, wie geht man da vor?



  • Folgendes Problem.

    Ich möchte ein Programm schreiben, welches bestimmte Bereiche eines Bildes, das auf dem Monitor dargestellt werden soll leicht mit einem bestimmten
    Farbton einfärbt und das Resultat auf dem Monitor darstellt.
    Die Datei des Bildes ist schreibgeschützt und darf auch nicht verändert werden,
    das einfärben sollte also nur das laufende Programm betreffen.

    Es soll so aussehen, das der eingefärbte Bereich des Bildes immer noch
    zu sehen ist, dieser Bereich sollte also nicht mit einer Farbe komplett übermalt werden sondern nur so ne art transparente Farbschicht über diesen Bereich legen.
    Also so, als würde man diesen Bildbereich mit einer rosaroten Brille anschauen.

    Wie macht man so etwas am besten?
    Wie ist die beste Vorgehensweise dafür?

    Auch sollte es möglich sein, das Bild in seinem Originalzustand wiederherstzustellen bzw. falls möglich, dieses erst gar nicht zu verändern, sondern nur ne Farbschicht darüberzublenden.

    Wichtig: Es handelt sich hier um eine reine 2d Anwendung mit GTK+, es wird also weder DirectX noch OpenGL verwendet.



  • Auch in 2D Anwendungen kann man DX oder OpenGL verwenden. Aber welche API verwendest du sonst? SDL? Allegro? oder gar GDI? Die Prinzipielle Vorgehensweise ist die, das du das Bild in den Speicher liest, jeden Pixel des Bereichs durchgehst und mit der Farbe blendest.



  • kenn gtk nicht, aber wenn es mehrere renderdurchläufe und alphablending unterstützt, müsstest du nur ein halbtransparentes quadrat/dreieck/etc über die einzufärbende stelle zeichen



  • Ich weiß zwar nicht wie man das damit macht, aber Prinzipiell musst du einfach nur eine Transparence Map haben, die den entsprechenden Bereich bedeckt und andere Bereiche Freihält. Pixel für Pixel berechnest du dann den entsprechenden Farbton dazwischen.



  • ChockoCookie schrieb:

    Auch in 2D Anwendungen kann man DX oder OpenGL verwenden. Aber welche API verwendest du sonst? SDL? Allegro? oder gar GDI? Die Prinzipielle Vorgehensweise ist die, das du das Bild in den Speicher liest, jeden Pixel des Bereichs durchgehst und mit der Farbe blendest.

    Zur Darstellung nehme ich GTK+, das bietet mir ein Drawarea Widget an, in welchem
    ich beliebige Grafische Elemente (von Bildern bis zu Pixel) unterbringen kann.

    Ursprügnlich wollte ich dafür die SDL nehmen, aber da das eine Anwendung (und kein eigentliches Spiel) ist und ich mir die Arbeit mit der GUI sparen möchte nehme ich jetzt lieber die GTK+ Library.

    Das mit der Prinzipiellen Vorgehensweise habe ich mir auch so überlegt,
    nur wie mache ich das eigentliche Blenden?

    Wenn ich z.b. ein Graustufenbild hätte, das nur heller gemacht werden soll,
    dann ist es einfach, dann muß man nur den einen Grauwert eines Pixels etwas erhöhen, aber wie ändert man den Farbton eines farbigen Pixels ohne das man dabei den ursprünglichen Ausdruck des Bildes verliert (weil einfach mit rot überschreiben geht ja nicht)?

    Das Z.B. ein blauer Pixel, der ja aus 3 Werten (RGB) besteht, nun einen roten Farbton bekommt?



  • Auf 2-d Basis ist das bestimmt ziemlich langsam, da man jedes Pixel einzeln durchgehen und berechnen muss. Auf 3-d <basis kann man das Hardwarebeschleunigt machen.



  • Also wenn ich es auf 3d Basis machen würde, dann nur mit OpenGL da die Anwendung Crossplattform fähig sein muß.

    Nur, welches GUI Toolkit könnt ihr mir für OpenGL empfehlen?

    Zum Einfärben:
    Ich habe jetzt mal etwas mit den RGB Farben für das Bild mit einem Bildbearbeitungprogramm herumgepielt.
    Kann es sein, das man zum Einfärben eines Bildes, das z.B. rot gefärbt werden soll
    lediglich die RGB Werte von Grün und Blau auf 0 setzen muß?
    So hat das nämlich der "einfärben"-Filter dieses Programms (Gimp) gemacht.

    Die Vorgehensweise wäre also folgendermaßen:
    1. Erstellen eins Structs mit 3 Variablen für die Farben rot grün und blau
    vom Typ unsigned char.
    2. Anlegen eines Arrays vom Typ dieses Structs, das groß genug ist, damit das zu ladene Bild reinpaßt.
    Bei einem Bild mit einer Auflösung von 256*256 Pixel wäre das also
    ein Array mit einer Indexgröße von 65536.
    3. Darin wird dann das zu ladende Bild abgelegt.

    So, nun haben wir das Bild.
    Zum Einfärben müßte ich jetzt das Bild in ein weiteres Array der gleichen Größe und gleichen Typs speichern und dabei, bei den Bereichen welche eingefärbt werden sollen einfach die Rot und Grün Werte auf 0 setzen.

    Habe ich da richtig gedacht?
    Wenn ihr eine bessere Vorgehensweise wißt, dann nur her damit.



  • Kann es echt so schwer sein? Einfach ein neues Bild erstellen, in dem diese bestimmten Pixel aus Ursprungsfarbe und "Rosarot" linear interpoliert sind.

    Bitte lesen. Danke.

    Bye, TGGC (Reden wie die Großen)



  • TGGC schrieb:

    Kann es echt so schwer sein? Einfach ein neues Bild erstellen, in dem diese bestimmten Pixel aus Ursprungsfarbe und "Rosarot" linear interpoliert sind.

    Bitte lesen. Danke.

    Ich zitiere Data:

    Interpolieren, Werte zwischen zwei Werten, Durchschnitt, Zwischenwert ermitteln, mathematisch formuliert in Form von (X1 + X2) / 2....

    Fazit:

    Dein Link ist unangebracht da du selber zu einer falschen Schlußfolgerung kommst
    und das Problem nicht lösen kannst.

    Und ja, das Problem ist, wenn man es noch nie gemacht hat und einen möglichst optimalen Lösungsweg haben möchte, auf den ersten Blick nicht so einfach, denn auch deine von dir vorgeschlagene Idee, den 1. Pixel mit dem 2. Pixel zu addieren und daraus dann den Mittelwert zu bilden, siehe Interpolation ist vollkommen falsch.

    Denn wenn du z.B. einen grünen Hintergrund hast
    und dazu einen roten Farbton dazuaddierst und danach den Durschnitt bildest,
    dann entsteht dadurch beileibe kein rot gefärbtes Bild sondern
    im ersten Schritt erstmal ein kräftiges Gelb und nach der Bildung des Mittelwerts ein häßliches Dunkelgrün.

    Das kannst du ganz leicht mit jedem beliebigen Bildbearbeitungsprogramm nachprüfen.
    Mit deiner Methode erzielt man also definitiv keinen rot eingefärbten Bereich.

    Nun kommen wir zu meiner weiter oben beschriebenen Methode, in einem Bildbearbeitungsprogamm funktioniert diese Methode nachweislich, nur könnte es sein, das die Art und Weise wie ich das implementieren wollte nicht die schnellste Methode war.
    Was ich auch gestern nach meinem letzten Beitrag herausgefunden habe.

    Die eleganteste Lösung ist nämlich, die Pixel eines Bereich den man einfärben will mit einer Maske bestehend aus roten Pixeln zu mulitplizieren,
    denn dadurch fliegen die Grün und Blau Werte weg bzw. werden auf null gesetzt, da 0 mal irgendetwas schließlich wieder null ergibt. Und das
    war auch vergleichbar mit meiner vorherigen Idee, die Grün und Blau Werte einzeln auf 0 zu setzen, nur ist meine jetzige letzten endes gewählte Methode
    mit der einfachen Multiplikation besser.

    Aber eine Multiplikation ist keine Interpolation, du hast es also selber nicht gewußt wie es geht.
    Bevor du also irgendwelche Kommentare die auf dämliche Links verweisen
    postest, solltest du dich erstmal selber mit der Materie auskennen
    ansonsten kannst du dir die Verlinkung zu so nem Müll nämlich sparen.

    Ich habe nichts dagegen wenn man konstruktive Antworten liefert oder
    welche, die auch mal falsch sein können, aber falsche Antworten zu liefern und
    dann noch mit einem Arroganten Link zu behaupten die Weisheit mit Löffeln gefressen zu haben ist dann definitiv nicht mehr aktzeptabel.



  • Bei deiner Methode wird aus grün nur schwarz aber dafür wird aus blau schwarz. Das ist ein Filter und keine Transparenz.

    Bitte lesen. Danke.

    P.S.: Ich kann die Enter Taste bedienen. Ich habe die Weisheit mit Löffeln gefressen.

    Bye, TGGC (Reden wie die Großen)



  • TGGC schrieb:

    Bei deiner Methode wird aus grün nur schwarz aber dafür wird aus blau schwarz. Das ist ein Filter und keine Transparenz.

    Die grün und blau Anteile sollen bei einem Bild ja auch weitgehend entfernt werden wenn man einen vernünftigen Rot Ton hinbekommen möchte.

    Und irgendwelche Wortbrocken wie "Transparenz" in die Runde zu schmeißen
    bringt auch nichts, das kann jeder, so schlau reden könnte ich auch
    wenn ich aber dich frage wie das intern wirklich abläuft dann kommt nix von dir
    rüber, echt arm.
    Erkläre doch mal einen Algorithmus Schritt für Schritt mit dem man rot gefärbte Transparenz hinbekommt, ich bin mal gespannt was jetzt als Antwort von dir kommt.

    Und bitte keine Wortbrocken wie, in DirectX geht das mit dem und dem Befehl.
    Ich will das möglichst auf einer generellen Grundlagenebene erklärt bekommen.



  • Ich spreche über Transparenz, weil du danach gefragt hast. Wie (Alpha-)Transparenz "intern wirklich abläuft", habe ich ja erklärt. Vielleicht solltest du mal lesen, was hier so geschrieben ist.

    P.S.: Ich kann die Enter Taste bedienen. Ich habe die Weisheit mit Löffeln gefressen.

    Bye, TGGC (Zu viele Primitive hier.)



  • TGGC schrieb:

    Ich spreche über Transparenz, weil du danach gefragt hast. Wie (Alpha-)Transparenz "intern wirklich abläuft", habe ich ja erklärt.

    Wo hast du das erklärt?

    Ich habe die Suchfunkion schon benutzt und nichts gefunden
    das den Transparenz Effekt auf der untersten Grundlagen Ebene erklärt.

    Überall heißt es nimm Fuktion aus API XY die macht das für dich wenn du diese Funktion so oder so anwendest.
    Toll, auf solche Erklärungen kann ich bei meiner Problemstellung verzichten.

    Vielleicht will ich so einen Algorithmus, der das kann auch selber in meine eigene 2d Anwendung integrieren ohne auf externes Zeugs zurückgreifen zu müssen.

    Und deine antwort auf Transparenz:

    Also ich würde erstmal die entsprechenden Abschnitte der DXSDK Doku lesen (und verstehen!). Danach kann man alles schön mit dem MFCtex-Tool ausprobieren.

    http://www.c-plusplus.net/forum/viewtopic.php?t=90022&postdays=0&postorder=asc&highlight=transparenz&start=10

    Ist ebenfalls unbrauchbar, da ich kein Windows habe und besagtest Tool nicht nutzen kann.



  • Für dich nochmal zum Mitmeißeln: Lineare Interpolation.

    P.S.: Ich kann die Enter Taste bedienen. Ich habe die Weisheit mit Löffeln gefressen.

    Bye, TGGC (NP Intelligenz)



  • sry sdj, aber TGGC hat recht >_<



  • Das ist so per Definition. 😎

    Bye, TGGC (NP Intelligenz)



  • life schrieb:

    sry sdj, aber TGGC hat recht >_<

    Falls er wirklich recht haben sollte, dann wäre die Schlußfolgerung,
    daß er unfähig ist anderen Menschen bei ihren Computerfragen zu helfen
    was auch zur Folge hat, daß er unfähig ist in einem Team zu arbeiten.
    Womit wir aber gleich zur nächsten Frage kommen die lautet:
    Warum postet er hier überhaupt? Er kann es sich im Prinzip ja sparen, ihn versteht sowieso keiner.

    So etwas ist noch schlimmer als jemand der nur mittelmäßig gut ist,
    denn während der Mittelmäßige bei einer Firma noch genommen wird,
    ist der andere oben beschriebene in sich gekehrte Stubenhocker
    der sein ganzes Wissen für sich alleine behält, als es seinem Team
    mitzuteilen für die Teamarbeit unbrauchbar.
    So etwas braucht keine Firma.

    Außerdem, Wissen das mit ins Grab genommen wird ist wertlos.



  • TGGC schrieb:

    Für dich nochmal zum Mitmeißeln: Lineare Interpolation.

    Schön, du kannst sogar Wörter wiederholen.



  • Viele Menschen leben im Internet die Seiten ihres Charakters aus, die im "normalen" Leben zu kurz kommen. So könnte TGGC z.b. im normalen Leben eher schüchtern sein, während er hier einen auf arrogant macht. Aber wirklich Rückschlüsse auf den Charakter einer Person, die du nur vom Internet her kennst, kannst du nicht machen.



  • Ach Mann, dann heul doch. Du vergisst wohl, das du hier was von uns willst und nicht umgekehrt. Ausserdem bist du nicht mein Arbeitsteam oder sowas, sondern ich beschäftige mich in meiner Freizeit und gratis mit dir und deinem "Problem". Ich poste hier weil es nicht nur undankbare, faule Idioten gibt, die Unbekannte beleidigen, weil sie nicht den Arsch geküsst bekommen.

    P.S.: Ich kann die Enter Taste bedienen. Ich habe die Weisheit mit Löffeln gefressen.

    Bye, TGGC (NP Intelligenz)


Anmelden zum Antworten