2011-01-31 4 views
0

私が持っているビットマップイメージでノイズ除去アルゴリズムを実行しようとしています - 関数が私に短い[]を返すので、ビットマップを生成するためint []にキャストしようとしましたが、これを取得します:short []をint []に変換してグレースケールビットマップを作成するにはどうすればよいですか?

http://i.min.us/ickyY6.png, android screenshot with "denoised" brain image in pink, not grayscale

グレースケールであることが望ましくありません。何か案は?

答えて

0

ビットマップのピクセルは、ARGB_8888、RGB_565、ARGB_4444、またはALPHA_8のいずれかを使用してエンコードされます。したがって、戻ってくる短い値は、それらの形式の1つでは、ややピンクのように見える値に対応する必要があります。

グレースケールビットマップが必要な場合は、0〜256の範囲の値しか指定できません(ARGB_8888を使用している場合は、最大8ビットの貴重なカラーコンポーネントです)。したがって、その範囲をその範囲内の値にマップし、RGBコンポーネントごとにその値を複製する必要があります。

+0

私は値が12ビットの範囲内にあると信じていますが、いいグレースケールを取得する方法がわかりません - 0xfffで正規化してからint * 256にキャストしようとしましたがこれですべてが黄色になります。私はまた、このビットマップがARGBだと確信していますが、それ以上のことは分かりません。 –

+0

OK、上位8ビットを取ることによって12ビット値を8ビット値に正規化する: 'val = 0xFF&(val >> 4)'次に、各RGB位置にその8ビット値を複製し、 '0xFF000000 +(val << 16)+(val << 8)+ val' –

+0

' + 'の代わりにビット単位の' or'演算子( '|')を使います。 '0XFF000000'は負の数です。これはRGBコンポーネントを正しく追加しません。 –

2

RGBチャネルのそれぞれで8ビットの強度を複製する代わりに、強度をアルファチャネルとして使用できます。このスキームでは、0は透明(背景色)に対応し、255は完全に不透明(黒色、または任意の色、さらにはピンク色)に対応します。アイデアは、Jason LeBrunの提案と似ています。各値の上位8ビットを取り、24ビット左にシフトしてから、フル強度に使用したい色とビット単位ORします(黒を表現する場合は何も表示しません)完全な強度)。

+1

ではなく、 '|'を使用してください。これはビットマップのメモリ要件を減らすALPHA_8 BitmapConfigを使うことができるという利点があります。 –

+0

私はこれを試してみるつもりですが、他のバグについてはまだ解明されていません。浮動小数点から短く、後ろにコードの型変換の問題があったと思います。見る。ありがとう。 –

関連する問題