2016-05-12 5 views
4

私は24ビットのビットマップを読んでいます:RGBイメージで赤と青を交換して明るさを保つ方法は?

var P: PByteArray; 
... 
for y:=0 to Bmp.Height-1 do begin 
    P := Bmp.ScanLine[y]; 
    for x:=0 to Bmp.Width-1 do begin 
     R := P[3*x+2]; 
     G := P[3*x+1]; 
     B := P[3*x ]; 

は今、私はBGRでRGBを交換:私は私のイメージに赤い何かを持っていた場合

 P[3*x+2] := B; 
     P[3*x+1] := G; 
     P[3*x ] := R; 

は、だから、今青だし、どのような青だったことは赤です。しかし、問題は明るさの変化で、新しい画像は元の画像より暗くなったり明るくなったりします。 出力画像を入力画像と同じ明るさ/暗色にするにはどうすればよいですか?

+2

線形に変換、光度関数と重みを:https://en.wikipedia.org/wiki/Relative_luminance –

+0

@J ...だから私は、その後、古い輝度、新しい輝度を計算し、古い/新しいを分割しなければなりません新しいBと新しいRにこの値を掛けますか? – Tom

+0

はい、新しい輝度=古い輝度ですが、RGB値ではなく、輝度関数のR/B重みを入れ替えます。 –

答えて

1

最初にRGBからHSLに変換することをお勧めします。
次に、colorwheel(別名色相、下記参照)を回して赤を青に変換し、RGBに戻します。
これは輝度を保持するはずです。

デルファイの単位は、VCL.GraphUtilです。

あなたが使用することができます。
procedure ColorRGBToHLS(clrRGB: TColorRef; var Hue, Luminance, Saturation: Word);function ColorHLSToRGB(Hue, Luminance, Saturation: Word): TColorRef;

フエ

色相合理自明であり、赤、0から始まります。その価値が増すにつれて、それは虹の色を通ります。私は何GraphUtils出力をテストしていませんが、円は256度を持っている場合値は次のとおりです。

  • レッド0
  • オレンジ20
  • イエロー40
  • グリーン80
  • シアン120
  • ブルー160
  • バイオレット180
  • マゼンタ200
  • ピンク220

これは、エンバカデロではなくHSLの非標準HLSを使用していますが、それが人生だと役に立たないです。

+0

ありがとう、私はこのアプローチを試み、青色のイメージを持っていますが、それはソースの赤色のものほど明るくありません:http://pastebin.com/zG2PgFFU – Tom

+1

上記の機能の詳細をチェックし、輝度wikiデータを使用して微調整できますか? – Johan

関連する問題