3 Stimmen

Überlagerung zweier Bilder (als Byte-Arrays)

Leute, ich bin sicher, dass es ganz einfach ist, aber Google hat nicht geholfen...

Hier ist die Aufgabe - ich habe zwei Byte-Arrays (als ARGB), die meine Bilder darstellen. Sie haben die gleiche Größe. Welche Operation sollte ich durchführen (Byte für Byte), um ein Bild über ein anderes zu legen? Das zweite Bild hat eine gewisse Transparenz, die berücksichtigt werden muss.

Um das zu klären, suche ich nach einem Code wie diesem:

          bytes[] result = new bytes[first.Length];
          for(i = 0; i< first.Lenght;i++)
          {
               result[i] = first[i] !!%SOMETHING%!! second[i];
          }

Einfaches Raten wie bitweises ODER (ich weiß - das ist blöd ;) ) funktioniert nicht.

Vielen Dank für Ihre Antworten.

Bearbeiten: Ich kann nicht verwenden, Standard-Bibliothek becouse von Sicherheitsproblemen (alle diese seltsame Manipulationen auftreten, auf Silverlight).

7voto

Aaronaught Punkte 118136

In der Annahme, dass Sie tatsächlich mit Bitmaps arbeiten, werden Sie es wahrscheinlich einfacher finden, die Bibliothek dies für Sie erledigen zu lassen.

En System.Drawing.Graphics Klasse hat eine CompositingMode Eigenschaft, die entweder auf eine der folgenden Eigenschaften gesetzt werden kann SourceCopy (der Standard - überschreibt die Hintergrundfarbe) oder SourceOver (mischt sich mit der Hintergrundfarbe).

Voir MSDN: Verwenden des Kompositionsmodus zur Steuerung der Alpha-Überblendung für weitere Einzelheiten.

Wenn Sie nur die reinen mathematischen Daten wollen, ist Alpha Blending ziemlich einfach. Für einen Alphawert a zwischen 0,0 und 1,0 liegt, sollte das Ergebnis lauten:

(aOld * oldValue) + ((1 - aOld) * aNew * newValue)

Wo oldValue ist der vorherige Wert vor der Überlagerung, newValue ist das, was Sie überlagern wollen, und aOld y aNew sind der alte bzw. der neue Alphawert. Natürlich müssen Sie diese Berechnung für die R-, G- und B-Werte getrennt durchführen.

Siehe auch: Alpha-Compositing (wiki link) für eine ausführlichere Erklärung.


Update: Ich denke, es sollte einfach sein, herauszufinden, wie man dies an den Code im OP anpassen kann, aber ich denke, nicht jeder ist ein Mathe-Mensch.

Ich gehe davon aus, dass die byte[] ist eine sich wiederholende Folge von A-, R-, G- und B-Werten (also Length wäre ein Vielfaches von 4). Wenn das nicht der Fall ist, müssen Sie diesen Code an das von Ihnen verwendete Speicherformat anpassen.

bytes[] result = new bytes[first.Length];
for(i = 0; i < first.Length; i += 4)
{
    byte a1 = first[i];
    byte a2 = second[i];
    byte r1 = first[i+1];
    byte r2 = second[i+1];
    byte g1 = first[i+2];
    byte g2 = second[i+2];
    byte b1 = first[i+3];
    byte b2 = second[i+3];

    byte a = a1 + (255 - a1) * a2 / 255;
    byte r = r1 * a1 / 255 + r2 * (255 - a1) * a2 / 65025;
    byte g = g1 * a1 / 255 + g2 * (255 - a1) * a2 / 65025;
    byte b = b1 * a1 / 255 + b2 * (255 - a1) * a2 / 65025;

    result[i] = a;
    result[i+1] = r;
    result[i+2] = g;
    result[i+3] = b;
}

0voto

xpda Punkte 15262

Ich denke, Sie haben die richtige Idee. Welche Operation Sie verwenden, hängt davon ab, was Sie für die Ausgabe wünschen. Hier sind einige Operationen, die nützlich sind:

  1. Durchschnitt - eine gängige Methode zur Kombination
  2. Minimum
  3. maximal
  4. bitweises Ersetzen
  5. xoder
  6. oder
  7. hinzufügen.
  8. subtrahieren.
  9. Multiplizieren Sie den Wert von Bild 1 mit (Bild 2 skaliert 0 bis 1). Dadurch wird mehr von Bild 1 auf die hellen Stellen von Bild 2 gelegt und weniger auf die dunklen Stellen. Probieren Sie aus, was Ihnen am besten gefällt, oder noch besser, lassen Sie den Benutzer auswählen.

Sie können wahrscheinlich die Transparenz-Bytes hinzufügen oder hinzufügen und eine der anderen Operationen für jede der drei Farben verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X