Ist es möglich, die vorab angewendete Alpha-Mischung rückgängig zu machen und die Originalfarbe zu finden?

Ich habe eine Farbe 0xADADAD, sie war ursprünglich weiß, jetzt ist sie grau, weil sie mit 30 % (0,3 Alpha) Schwarz + dem unbekannten Originalwert alpha-gemischt wurde. In diesem Fall weiß ich aus vielen Versuchen und Irrtümern, dass die ursprüngliche Farbe 0xF8F8F8 war

Das Problem ist, dass ich über 20 andere Farben habe, die auf diese Weise korrigiert werden müssen, aber ich habe keine genaue Möglichkeit, die Originalfarben zu finden. Gibt es eine Formel, mit der ich das herausfinden kann? Ist es überhaupt möglich?

Angenommen, sie sind beide Hexadezimal, wenn eine lineare Transformation angewendet würde, würde die Zahl an Position 1, 3 und 5 (wenn sie auf 1 basiert) um 5 nach unten verschoben, während die Zahlen an 2, 4 und 6 verschoben werden um 5 nach oben. Wenn eine andere Transformation stattgefunden hat, ist es unmöglich, anhand eines Beispiels zu sagen
Ist Position 1 0xA, also sollte ich davon den Wert an Position 5 (ebenfalls 0xA) abziehen, oder die eigentliche Zahl 5? Verschieben wir Bits? Entschuldigung, diese Begriffe verwirren mich.
@AlienX: "0x" ist ein Präfix, das anzeigt, dass Sie es mit Basis-16-Werten (auch bekannt als HEX) zu tun haben. Es ist auch üblich, "x" oder "#" als Präfix zu verwenden. Eine RGB-Hex-Farbe ist ein Triplett aus (3) 2-stelligen Werten. "Erste Position" in Ihrem Beispiel ist also Red Value = AD (nicht 0xA). Gelegentlich werden Sie sehen, dass jemand eine Abkürzung für Werte wie "FFF" verwendet, das ist wirklich "x0F0F0F".
Hat sich mein Beitrag wirklich so angehört, als wüsste ich nicht, was Hex ist? Das ändert immer noch nichts, wenn Pos 1, 2, 3 meine Hex-Werte sind, was zum Teufel sind Pos 4, 5 und 6?

Antworten (1)

Ja, es ist möglich, dass ich den Code in diesem Beitrag schnell geändert habe und den folgenden sehr schlampigen Python 2.X-Code erstellt habe:

from Tkinter import *
import struct


def ablend(a, fg, bg):
    return ((1-a)*fg[0]+a*bg[0],
            (1-a)*fg[1]+a*bg[1],
            (1-a)*fg[2]+a*bg[2])

def aunblend(a, result, bg):
    return ((result[0]-a*bg[0])/(1-a),
            (result[1]-a*bg[1])/(1-a),
            (result[2]-a*bg[2])/(1-a))


class findUnblendedColor(object):

    def __init__(self, root):
        self.fg=(0xAD, 0xAD, 0xAD)
        self.bg=(255,255,255)
        self.alpha = 0.3

        l = Label(root, text="alpha:")
        l.grid(row=0, column=0)
        label = '0.3'
        self.a = Text(root, height=1,
                       relief=FLAT,
                       width=20,)
        self.a.insert(1.0, label)
        self.a.grid(row=0, column=1)
        self.a.bind("<Return>", self.update)

        l = Label(root, text="Result:")
        l.grid(row=1, column=0)
        label = '#%02x%02x%02x' % self.fg
        self.e = Text(root, height=1,
                       relief=FLAT,
                       width=20,
                       background=label)
        self.e.insert(1.0, label)
        self.e.grid(row=1, column=1)
        self.e.bind("<Return>", self.update)

        l = Label(root, text="BG:")
        l.grid(row=2, column=0)

        label = '#%02x%02x%02x' % self.bg
        self.b = Text(root, height=1,
                       relief=FLAT,
                       width=20,
                       background=label)
        self.b.insert(1.0, label)
        self.b.grid(row=2, column=1)
        self.b.bind("<Return>", self.update)


        l = Label(root, text="FG:")
        l.grid(row=3, column=0)

        col = aunblend(self.alpha, self.fg, self.bg)
        label = '#%02x%02x%02x' % col
        self.f = Text(root, height=1,
                       relief=FLAT,
                       width=20,
                       background=label)
        self.f.insert(1.0, label)
        self.f.configure(state='disabled')
        self.f.grid(row=3, column=1)


        l = Label(root, text="verify:")
        l.grid(row=4, column=0)

        col = ablend(self.alpha, col, self.bg)
        label = '#%02x%02x%02x' % col
        self.g = Text(root, height=1,
                       relief=FLAT,
                       width=20,
                       background=label)
        self.g.insert(1.0, label)
        self.g.configure(state='disabled')
        self.g.grid(row=4, column=1)



    def update(self, event):
        data = self.e.get(1.0,END)
        self.e.delete(1.0, END)
        self.e.insert(END, data[:-1])

        data2 = self.b.get(1.0,END)
        self.b.delete(1.0, END)
        self.b.insert(END, data2[:-1])

        try:
            self.alpha = float(self.a.get(1.0,END)) 

            self.fg = struct.unpack('BBB',data[1:-1].decode('hex'))
            self.e.configure(background=data[:-1])

            self.bg = struct.unpack('BBB',data2[1:-1].decode('hex'))
            self.b.configure(background=data2[:-1])

            col = aunblend(self.alpha, self.fg, self.bg)
            self.f.configure(state='normal')
            self.g.configure(state='normal')

            if all(i <= 256 and i >= 0 for i in col):
                label = '#%02x%02x%02x' % col
                self.f.configure(background=label)

                col = ablend(self.alpha, col, self.bg)
                label2 = '#%02x%02x%02x' % col
                self.g.configure(background=label2)
            else:
                label = "out of range"
                label2 = "out of range"
            self.f.delete(1.0, END)
            self.f.insert(END, label)
            self.g.delete(1.0, END)
            self.g.insert(END, label2)

            self.f.configure(state='disabled')
            self.g.configure(state='disabled')
        except Exception as ex:
            print "error "+repr(type(ex))
            pass

        return 'break'

root = Tk()
root.title("unblend")
findUnblendedColor(root)

root.mainloop()

Und Sie erhalten ein Fenster, in dem Sie Alpha, resultierende Farbe und Hintergrund eingeben können.

Geben Sie hier die Bildbeschreibung ein

Bild 1 : Dialog des Programms