Можно ли вернуть предварительно примененную альфа-смесь и найти исходный цвет?

У меня есть цвет 0xADADAD, изначально он был белым, теперь он серый, потому что он был смешан с альфа-каналом 30% (0,3 альфа) черного + неизвестное исходное значение. В этом случае я знаю из множества проб и ошибок, что исходный цвет был 0xF8F8F8.

Проблема в том, что у меня есть более 20 других цветов, которые нужно исправить, но у меня нет точного способа найти исходные цвета. Есть ли формула, которую я могу сделать, чтобы понять это? Это вообще возможно?

Учитывая, что они оба в шестнадцатеричном формате, если применить линейное преобразование, числа в позициях 1, 3 и 5 (если они основаны на 1) будут сдвинуты вниз на 5, а числа в 2, 4 и 6 сдвинуты на 5. Произошло ли какое-либо другое преобразование, по одному примеру невозможно сказать
Является ли позиция 1 0xA, поэтому я должен вычесть из нее значение в позиции 5 (также 0xA) или фактическое число 5? Мы сдвигаем биты? Извините, эти термины меня смущают.
@AlienX: «0x» — это префикс, указывающий, что вы имеете дело со значениями с основанием 16 (он же HEX). Также в качестве префикса обычно используется «x» или «#». Шестнадцатеричный цвет RGB представляет собой триплет из (3) двухсимвольных значений. Итак, «первая позиция» в вашем примере — это Red Value=AD (не 0xA). Иногда вы увидите, что кто-то использует сокращение для таких значений, как «FFF», на самом деле это «x0F0F0F».
Мой пост действительно звучал так, будто я не знаю, что такое hex? Это по-прежнему ничего не меняет, если позиция 1, 2, 3 - это мои шестнадцатеричные значения, что, черт возьми, такое позиция 4, 5 и 6?

Ответы (1)

Да, возможно, я быстро изменил код в этом посте и придумал следующий очень небрежный код python 2.X:

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()

И вы получаете окно, которое позволяет вам ввести альфу, результирующий цвет и фон.

введите описание изображения здесь

Изображение 1 : Диалог программы