1

yuv420p形式の画像を90度回転させる方法を知る必要があります。これをrgbに変換し、ローテーションして再度yuvに再変換するオプションは実行できません。アルゴリズムでさえ役に立ちます。

よろしく、アニルーダ。

4

3 に答える 3

3

画像が yuv420 平面の場合、画像データはこのようにエンコードされます。平面とは、最初に y セクションがあり、次に U セクションが続き、次に V セクションが続くことを意味します。

画像の幅 w と画像の高さ h を考慮します。

  1. 画像の合計サイズは w*h*3/2 です

  2. ルミネセンスとも呼ばれる Y セクションは w*h を占めます。

  3. Y セクションの 2x2 ブロックごとに U ピクセルと V ピクセルがあります。

  4. 次に U セクションがあり、(w/2)*(h/2) を占め、イメージの先頭から w*h のオフセットに配置されます。

  5. V セクションが続き、(w/2)*(h/2) を占め、(w*h)+((w*h)/4) のオフセットで配置されます。

画像を 90 度回転するには、基本的にこの w*h 配列を h*w の配列にコピーします。

上記の投稿で述べたように、上記の 3 つの Y、U、V ブロックをそれぞれ個別にコピーするだけです。

  1. Yセクションから始めます。コピーされる最初のピクセルはソース配列の (h-1)*w にあります。これをコピー先配列の (0,0) にコピーします。2 番目のピクセルは (h-2)*w などです...

  2. U セクションと V セクションは (w/2)*(h/2) のみであることに注意してください。

  3. 次にUセクションをコピーします。コピーされる最初のピクセルは、ソース配列の (w*h)+(((h/2)-1)*(w/2)) にあります。これを (h*w)+(0,0) にコピーします。宛先配列。2 番目のピクセルは (w*h)+(((h/2)-2)*(w/2)) にあり、以下同様...

  4. 最後に V セクションをコピーします。コピーされる最初のピクセルは、ソース配列の ((w*h)+(w*h/4))+(((h/2)-1)*(w/2)) にあり、これを (h にコピーします。 *w)+(w*h/4)+(0,0) 先の配列。2 番目のピクセルは ((w*h)+(w*h/4))+(((h/2)-2)*(w/2)) にあり、以下同様...

このようにして得られた Destination Array には、90 度回転した画像が含まれています。

于 2012-04-04T04:03:52.620 に答える
1

平面 YUVではないと思いますが、すでにそうである場合は非常に簡単です(最初と最後の手順をスキップしてください)。YUV 4:2:0 平面を使用するつもりでしたが、なぜ問題があるのか​​わかりません。

  1. 最初に平面に変換します。平面にスペースを割り当て、パックされた YUV形式に従って適切な場所にバイトを配置します。
  2. YUV平面を別々に回転します。その場合、各ブロックの「色」( U、 ) 情報は同じに保たれます。V
  3. プレーンを再結合して、最初に持っていた正しいパック YUVを再取得します

画像のサイズが 4 の倍数である場合、これは常に正常に機能します。そうでない場合は、注意してください...

于 2010-06-29T05:48:06.077 に答える
0

YUV420pは確かに平面だと思います。

AviSynth のソース コードを試してみてください。ターン (回転) 関数は、turn.cpp と turnfunc.cpp にあります。

http://www.avisynth.org/

于 2010-06-29T05:57:24.840 に答える