2012-02-19 2 views
1

Intputで最速の方法:整数[0,4095] 12bits。
出力:{A、B、C}のすべてのチューブ[0,255]整数[0,4095] tuble {A、B、C}に12bits C++

A、B、Cは0〜255で与えられ、255は4ビットで15になります。理由は、私は0から255まで定義されたRGBを持つColor構造体を構築したいということです。

解決策は、入力をビットシフトして4組の3組を抽出し、次に17を(255/15 | = 1111(2進数))。あなたは、この最速を計算する方法を

自分のソリューション:すべての入力0の

QColor mycolor(int value) 
{ 
if(value > 0xFFF) 
    value = 0xFFF; 

int a=0,b=0,c=0; 
a = (value & 0xF) * 17; 
b = ((value&(0xF<<4))>>4) *17; 
c = ((value&(0xF<<8))>>8) *17; 
return QColor(c,b,a); 
} 



cv::Mat cv_image(10,10,CV_16U,cv::Scalar::all(1)); 
QImage image(cv_image.data, 10,10,QImage::Format_RGB444); 
QPainter p(&image); 
p.setPen(mycolor(255)); 
p.drawLine(0,0,9,0); 
p.setPen(mycolor(4095)); 
p.drawLine(0,1,9,1); 
p.setPen(mycolor(0)); 
p.drawLine(0,2,9,2); 
p.setPen(mycolor(10000)); 
p.drawLine(0,3,9,3); 


********* Start testing of Test1 ********* 
Config: Using QTest library 4.7.4, Qt 4.7.4 
PASS : Test1::initTestCase() 
[255, 255, 255, 255, 255, 255, 255, 255, 255, 255; 
    4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095; 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0; 
    4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095; 
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1; 
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1; 
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1; 
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1; 
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1; 
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 
PASS : Test1::test1() 
+0

12ビットではなく16. –

答えて

3

まず... 4096は、実際には12ビットであり、これは理解し質問が容易になります。あなたは計算の類似性を見つけることができますので、私も青のためのビットシフトを保持している

int val; // 0...4096 
int red = ((val&(255<<8))>>8)*17; 
int green = ((val&(255<<4))>>4)*17; 
int blue = ((val&(255<<0))>>0)*17; 

:ここでは一つの可能​​な解決策です。お役に立てれば。

+0

テストするとうまくいきます。なぜ右シフトと左シフトの両方を理解する必要があります。ちょうど私が思い付いたことを追加しましたが、それでもまだテックセットはありません –

+0

あなたはval&111100000000を計算するので右にビットシフトする必要がありますので、結果は 00000000となり、赤の値の後に12個のゼロがあります。 –

+0

その0xFと255ではなく。 –

1

入力から最初の4ビットを取得するには、を1111とし、入力を右に4ビットシフトして処理を繰り返します。 0から15の範囲で3つの整数が得られます。

それを[0,255]の値に変換したい場合は、すべてを左に4ビットシフトし、ORの数値を1111(簡素化のため)にシフトします。

A = (input&15)<<4|15; 
input >>= 4; 
B = (input&15)<<4|15; 
input >>= 4; 
C = (input&15)<<4|15; 

か(あなたは0が0にマッピングする場合)

A = input&15; 
A = A<<4|A; 
input >>= 4; 
B = input&15; 
B = B<<4|B; 
input >>= 4; 
C = input&15; 
C = C<<4|C; 
1

あなたはもっと自分の色分けされた12ビット値を解析するために労働組合を使用することができます。

union colorCoding 
{ 
    unsigned int val:12; 
    struct 
    { 
    unsigned int red:4; 
    unsigned int blue:4; 
    unsigned int green:4; 
    }; 
}; 
+0

ありがとうございます。私のカラー実装はQtのQColorです。私はCV_16Uとqt形式RGB444用のopencv Mat Qimage変換に取り組んでいます。 –

+0

このケースではどれくらい効果があるのか​​分かりませんが、一般的にこの方法では使用しないでください。構造体はメンバ変数間に任意のパディングを追加することができ、未定義の動作につながります。 – howardh

関連する問題