2011-07-08 13 views
0

yuv画像を別のyuv画像にオーバーレイしたい。 640x480のイメージがある場合、ソースイメージの右下に小さなサイズのイメージをオーバーレイしたいとします。 助けてください。yuv画像を別の画像に重ねる

+0

YUV画像には、平面および双平面のもの、完全または縮小色情報(422または420など)のバリエーションが多数あります。手元にあるフォーマットについていくらか詳しく説明できますか? – Codo

+0

こんにちは、Codo ... yuv 420 planerのためのアイデアを今すぐお寄せください – arccc

+0

あなたはすべての画像フォーマットについてこの質問を再入力しますか? –

答えて

2

プレーナYUV 420イメージは、640 x 480バイトのYサンプルと、それに続く320 x 240バイトのUサンプルと、320 x 240バイトのVサンプルから構成されます。各2x2ブロックの色情報はすべてのピクセルではないので、すべての画像サイズは2の倍数であると仮定します(それ以外の場合ははるかに複雑になります)。

さらに、私は行の最後、YとUの間、またはUとVのサンプルの間にパディングがないと仮定します。

void copyRect(unsigned char* targetImage, int targetWidth, int targetHeight, 
    unsigned char* sourceImage, int sourceWidth, int sourceHeight, 
    int sourceLeft, int sourceTop, 
    int width, int height, 
    int targetLeft, int targetTop) 
{ 
    // Y samples 
    unsigned char* tgt = targetImage + targetTop * targetWidth + targetLeft; 
    unsigned char* src = sourceImage + sourceTop * sourceWidth + sourceLeft; 
    for (int i = 0; i < height; i++) { 
     memcpy(tgt, src, width); 
     tgt += targetWidth; 
     src += sourceWidth; 
    } 

    // U samples 
    tgt = targetImage + targetHeight * targetWidth 
     + (targetTop/2) * (targetWidth/2) + (targetLeft/2); 
    src = sourceImage + sourceHeight * sourceWidth 
     + (sourceTop/2) * (sourceWidth/2) + (sourceLeft/2); 
    for (int i = 0; i < height/2; i++) { 
     memcpy(tgt, src, width/2); 
     tgt += targetWidth/2; 
     src += sourceWidth/2; 
    } 

    // V samples 
    tgt = targetImage + targetHeight * targetWidth + (targetHeight/2) * (targetWidth/2) 
     + (targetTop/2) * (targetWidth/2) + (targetLeft/2); 
    src = sourceImage + sourceHeight * sourceWidth + (sourceHeight/2) * (sourceWidth/2) 
     + (sourceTop/2) * (sourceWidth/2) + (sourceLeft/2); 
    for (int i = 0; i < height/2; i++) { 
     memcpy(tgt, src, width/2); 
     tgt += targetWidth/2; 
     src += sourceWidth/2; 
    } 
} 

コードをコンパイルしようとしたことはありません。だから保証はありません。

パラメータは次のとおり

targetImage:他の画像をtargetHeigt

targetWidthにコピーされ、ターゲット画像の画素データ:対象画像の寸法

sourceImage:一部が他のイメージにコピーされるソースイメージのピクセルデータ

sourceWidth、sourceHeight:ソース画像の寸法

sourceLeftsourceTop

をコピーする領域のソース画像内の位置を左上、:のサイズコピーする領域

targetLeft,targetTop:領域がコピーされる対象画像内の左上位置

+0

Codo、どうしてこのコードをコンパイルしようとしたことはありませんか?あなたはちょうど座って、頭から書いたことを意味しますか? :) – Ulterior

+0

はい。私はわずかなバグを検出し修正し、パラメータの説明を追加しました。 – Codo

関連する問題