2017-10-18 5 views
2

バッファに32ビットイメージをロードしてから、色値を対応するアルファで事前に乗算してブレンドに使用します。画像のアルファを効率よく事前に組み立てる

次のように動作しますが、これを実行するより効率的な方法があるかどうかは疑問です。

画像データは、このタイプのポインタです:

typedef struct rgba_pixel 
{ 
    uint8_t r; 
    uint8_t g; 
    uint8_t b; 
    uint8_t a; 
} rgba_pixel; 

rgba_pixel * image_data; 

for (i = 0; i < length; i++) 
{ 
    if (image_data[i].a == 0) 
     image_data[i].r = image_data[i].g = image_data[i].b = 0; 
    else if (image_data[i].a < 255) 
    { 
     alpha_factor = image_data[i].a/255.0; 
     image_data[i].r = image_data[i].r * alpha_factor; 
     image_data[i].g = image_data[i].g * alpha_factor; 
     image_data[i].b = image_data[i].b * alpha_factor; 
    } 
} 
+1

image_dataとalpha_factorの型の定義を表示できますか? –

+0

が定義に追加されました.alpha_factorはdoubleです。 – phenompbg

答えて

3

はあなたのargbコンポーネントがunsigned charであることを考えると、あなたは(乗算を整数とshr 8を使用する浮動小数点乗算を回すことにより、パフォーマンスを向上させることができます255で除算する代わりに255で除算):

for (i = 0; i < length; i++) 
{ 
    if (image_data[i].a == 0) 
     image_data[i].r = image_data[i].g = image_data[i].b = 0; 
    else if (image_data[i].a < 255) 
    { 
     image_data[i].r = (unsigned short)image_data[i].r * image_data[i].a >> 8; 
     image_data[i].g = (unsigned short)image_data[i].g * image_data[i].a >> 8; 
     image_data[i].b = (unsigned short)image_data[i].b * image_data[i].a >> 8; 
    } 
} 

これは、1 fp除算と3 fp乗算を変換します3つの整数乗算と3つのビットシフトに変換します。

行うことができる別の改良は、ピクセルデータのための組合構造体を使用している:

typedef union rgba_pixel 
{ 
    struct { 
     uint8_t r; 
     uint8_t g; 
     uint8_t b; 
     uint8_t a; 
    }; 

    uint32_t u32; 
} rgba_pixel; 

そして一度にR、G、Bにゼロを割り当てる:

//image_data[i].r = image_data[i].g = image_data[i].b = 0; 
image_data[i].u32 = 0; //use this instead 

https://godbolt.org/によるとx86-64 gcc 7.2であり、後者は-O3でより少ない命令を生成する。どのコースが実際にはより速くなるか遅くなるか。

もう1つの考慮すべきことは、部分ループアンローリング、すなわちループ反復ごとに複数(例えば4個)のピクセルを処理することである。行が幅4の倍数であることが保証されている場合は、追加チェックを行わなくても行います。

+0

ありがとう、私はこのショットを与える – phenompbg

+0

else ifは、alphaが255の場合、何もしないことです。 alpha_factorは1.0になります – phenompbg

+0

ああ、私の間違い。また私はいくつかの追加の考えを加えました。 –

関連する問題