Question

J'ai un pressentiment de ce qui a été fait avant, mais je suis un total profane à ce sujet et ne savez pas comment commencer à poser la bonne question.Je vais donc vous décrire ce que je suis en train de faire...

J'ai un inconnu ARGB de la couleur.Je ne connais que son absolue valeur RVB comme affiché sur les deux connu opaque couleurs d'arrière-plan, par exemple la noire 0x000000 et blanc 0xFFFFFF.Ainsi, pour reprendre l'exemple, si je sais que l'ARGB de la couleur RVB 0x000080 équivalent lors de l'affichage de plus de 0x000000 et je sais que la même ARGB de la couleur RVB 0x7F7FFF équivalent lors de l'affichage de plus de 0xFFFFFF, est-il un moyen de calculer ce que l'original ARGB de la couleur est?

Ou est-ce encore possible???

Était-ce utile?

La solution

Donc, vous savez que le putain (a, r, g, b) sur (R1, G1, B1) vous donne (R1, G1, B1) et que le placer (R2, G2, B2) vous donne (R2, G2 , B2). En d'autres termes - d'ailleurs je vais travailler ici en unités où A varie de 0 à 1 - vous savez (1-a) R1 + Ar = R1, (1-A) R2 + AR = R2, etc. Prenez ces deux-là et soustrayez: vous obtenez (1-A) (R1-R2) = R1-R2 et donc A = 1- (R1-R2) / (R1-R2). Une fois que vous le savez, vous pouvez tout travailler le reste.

Vous devez réellement calculer les valeurs de A que vous obtenez en faisant ce calcul sur les trois {r, g, b} et en moyenne ou quelque chose, pour réduire les effets de l'erreur de rond. En fait, je vous recommanderais de prendre un signe du signe (((R1-R2) (R1-R2) + (G1-G2) (G1-G2) + (B1-B2) (B1-B2)] / (| r1-r2 | + | g1-g2 | + | b1-b2), ce qui équivaut à la pondération les couleurs les plus fiables.

Vous avez maintenant, par exemple, r = (r1- (1-a) r1) / a = (r2- (1-a) r2) / a. Ces deux seraient égaux si vous aviez des valeurs de précision infinie pour a, r, g, b, mais bien sûr dans la pratique, elles peuvent différer légèrement. Eux en moyenne: r = [(r1 + r2) - (1-a) (r1 + r2)] / 2a.

Si votre valeur de A est très petite, vous n'obtiendrez que des informations assez peu fiables sur r, g, b. (Dans la limite où a = 0 Vous n'obtiendrez aucune information, et vous ne pouvez évidemment rien faire à ce sujet.) Il est possible que vous obteniez des chiffres en dehors de la plage 0..255, auquel cas je ne Pensez que vous pouvez faire mieux que la simple coupe.

Voici comment cela fonctionne pour votre exemple particulier. (R1, G1, B1) = (0,0,0); (R2, G2, B2) = (255 255 255); (R1, G1, B1) = (0,0,128); (R2, G2, B2) = (127,127,255). Donc a = 1 - [127 + 127 + 127] / [255 + 255 + 255] = 128/255, qui se trouve être l'une des 256 valeurs réellement possibles de a. (Si ce n'était pas le cas, nous devrions probablement le contourner à ce stade.)

Maintenant r = (127-255 * 127/255) * 255/256 = 0; De même g = 0; et b = (383-255 * 127/255) * 255/256 = 255.

Donc, notre couleur Argb était de 80,00,00, ff.

Autres conseils

Le choix du noir et blanc que les couleurs d'arrière-plan est le meilleur choix, à la fois pour faciliter les calculs et la précision du résultat.Avec beaucoup de l'abus de notation....

  • un(RVB) + (1-a)0xFFFFFF = 0x7F7FFF
  • un(RVB) + (1-a)0x000000 = 0x000080

En soustrayant la seconde dès la première...

  • (1-a)0xFFFFFF = 0x7F7FFF-0x000080 = 0x7F7F7F

Donc

  • (1-un) = 0x7F/0xFF
  • a = (0xFF-0x7F)/0xFF = 0x80/0xFF
  • A = 0x80

et RVB = (a(RVB))/a = 0x000080/a = 0x0000FF

Vous pouvez faire quelque chose de très similaire avec d'autres choix de couleur d'arrière-plan.Le plus petit une est et la de plus près, les deux couleurs de fond sont le moins de précision, vous serez en mesure de déterminer la valeur RGBA.Considérons le cas extrême où A=0 ou lorsque les deux couleurs de fond sont les mêmes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top