4

私はこれが以前に行われた予感がありますが、私はこれについて完全に素人であり、正しい質問をする方法がわかりません. だから私がやろうとしていることを説明します...

不明な ARGB カラーがあります。たとえば、黒 0x000000 と白 0xFFFFFF など、2 つの既知の不透明な背景色の上に表示される絶対 RGB 値しか知りません。したがって、例を続けると、ARGB カラーが 0x000000 で表示されたときに RGB 0x000080 と同等であることがわかっていて、同じ ARGB カラーが 0xFFFFFF で表示されたときに RGB 0x7F7FFF と同等であることがわかっている場合、元の ARGB カラーを計算する方法はありますか?は?

それともこれも可能ですか?

4

2 に答える 2

2

したがって、(a,r,g,b) を (r1,g1,b1) の上に置くと (R1,G1,B1) が得られ、(r2,g2,b2) の上に置くと (R2,G2) が得られることがわかります。 、B2)。言い換えると、ここでは、a の範囲が 0 から 1 の単位で作業します。(1-a)r1+ar=R1、(1-a)r2+ar=R2 などです。この 2 つを引いて、(1-a)(r1-r2)=R1-R2 を取得し、したがって a=1-(R1-R2)/(r1-r2) を取得します。aがわかれば、他のすべてを解決できます。

{R,G,B} の 3 つすべてに対してその計算を実行して得られる a の値を実際に計算し、それらまたは何かを平均して、丸め誤差の影響を減らす必要があります。実際、a = 1 - [(R1-R2)sign(r1-r2) + (G1-G2)sign(g1-g2) + (B1-B2)sign(b1-b2)] を取ることをお勧めします。 / (|r1-r2|+|g1-g2|+|b1-b2)、これはより信頼性の高い色をより高く重み付けすることになります。

たとえば、r = (R1-(1-a)r1)/a = (R2-(1-a)r2)/a となります。これら 2 つは、a、r、g、b に無限精度の値がある場合は等しくなりますが、実際にはわずかに異なる場合があります。それらの平均: r = [(R1+R2)-(1-a)(r1+r2)]/2a。

a の値がたまたま非常に小さい場合、r、g、b についてかなり信頼できない情報しか得られません。(a=0 の制限では、まったく情報が得られず、それについて何もできないことは明らかです。) 0..255 の範囲外の数値を取得する可能性があります。クリッピングよりもうまくできると思います。

特定の例でどのように機能するかを次に示します。(r1,g1,b1)=(0,0,0); (r2,g2,b2)=(255,255,255); (R1、G1、B1)=(0,0,128); (R2、G2、B2)=(127,127,255)。したがって、a = 1 - [127+127+127]/[255+255+255] = 128/255 となり、これは a の実際に可能な 256 の値の 1 つです。(そうでない場合は、おそらくこの段階で丸めるべきです。)

ここで r = (127-255*127/255)*255/256 = 0; 同様に g = 0; b = (383-255*127/255)*255/256 = 255.

したがって、ARGB カラーは 80,00,00,FF でした。

于 2011-03-29T09:44:34.737 に答える
1

背景色として黒と白を選択することは、計算の容易さと結果の正確さの両方の点で最良の選択です。表記乱用だらけで……。

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

1 番目から 2 番目を引くと...

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

そう

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

および RGB = (a(RGB))/a = 0x000080/a = 0x0000FF

他の背景色を選択しても、非常によく似たことができます。a が小さく、2 つの背景色が近いほど、RGBA 値を正確に判断できなくなります。A=0 または 2 つの背景色が同じという極端なケースを考えてみましょう。

于 2011-03-29T10:27:55.637 に答える