0

libswscalePIX_FMT_YUYV422タイプのイメージを水平方向にミラーリングしようとしています。ピクセルあたり16ビットの各行に単純なループを使用すると、色が間違ってしまいます。たとえば、青いオブジェクトはオレンジ色になります。これが私のコードです:

   typedef unsigned short YUVPixel; // 16 bits per pixel
    for (int y = 0; y < outHeight; y++)
    {
        YUVPixel *p1 = (YUVPixel*)pBits + y * outWidth;
        YUVPixel *p2 = p1 + outWidth - 1;
        for (int x = 0; x < outWidth/2; x++) // outWidth is image width in pixels
        {
            // packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr
            unsigned short tmp;
            tmp = *p1;
            *p1 = *p2;
            *p2 = tmp;
        }
    }

次に、YUVPixelを32ビットタイプとして再定義し、それに応じてループを変更してみました。これにより正しい色になりますが、隣接するピクセルが入れ替わっているように見えます。何かアイデアはありますか、私はこれで完全に迷っていますか?

4

1 に答える 1

0

32ビットYUVPixelタイプを使用したアプローチは優れていました。移動した後、そのピクセル構造内の2つのY値を交換することを確認するだけで済みます。例:

Y0 U Y1 V
                move to new position      
          -------------------------------->
                                            Y0 U Y1 V
                                              <swap>
                                            Y1 U Y0 V

U値とV値は両方とも、2ピクセル構造全体に対して有効であり、Y値を反転する必要があります。

于 2012-01-31T14:55:14.467 に答える