yuv420p形式の画像を90度回転させる方法を知る必要があります。これをrgbに変換し、ローテーションして再度yuvに再変換するオプションは実行できません。アルゴリズムでさえ役に立ちます。
よろしく、アニルーダ。
yuv420p形式の画像を90度回転させる方法を知る必要があります。これをrgbに変換し、ローテーションして再度yuvに再変換するオプションは実行できません。アルゴリズムでさえ役に立ちます。
よろしく、アニルーダ。
画像が yuv420 平面の場合、画像データはこのようにエンコードされます。平面とは、最初に y セクションがあり、次に U セクションが続き、次に V セクションが続くことを意味します。
画像の幅 w と画像の高さ h を考慮します。
画像の合計サイズは w*h*3/2 です
ルミネセンスとも呼ばれる Y セクションは w*h を占めます。
Y セクションの 2x2 ブロックごとに U ピクセルと V ピクセルがあります。
次に U セクションがあり、(w/2)*(h/2) を占め、イメージの先頭から w*h のオフセットに配置されます。
V セクションが続き、(w/2)*(h/2) を占め、(w*h)+((w*h)/4) のオフセットで配置されます。
画像を 90 度回転するには、基本的にこの w*h 配列を h*w の配列にコピーします。
上記の投稿で述べたように、上記の 3 つの Y、U、V ブロックをそれぞれ個別にコピーするだけです。
Yセクションから始めます。コピーされる最初のピクセルはソース配列の (h-1)*w にあります。これをコピー先配列の (0,0) にコピーします。2 番目のピクセルは (h-2)*w などです...
U セクションと V セクションは (w/2)*(h/2) のみであることに注意してください。
次にUセクションをコピーします。コピーされる最初のピクセルは、ソース配列の (w*h)+(((h/2)-1)*(w/2)) にあります。これを (h*w)+(0,0) にコピーします。宛先配列。2 番目のピクセルは (w*h)+(((h/2)-2)*(w/2)) にあり、以下同様...
最後に 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 度回転した画像が含まれています。
平面 YUVではないと思いますが、すでにそうである場合は非常に簡単です(最初と最後の手順をスキップしてください)。YUV 4:2:0 平面を使用するつもりでしたが、なぜ問題があるのかわかりません。
Y
、U
、V
平面を別々に回転します。その場合、各ブロックの「色」( U
、 ) 情報は同じに保たれます。V
画像のサイズが 4 の倍数である場合、これは常に正常に機能します。そうでない場合は、注意してください...
YUV420pは確かに平面だと思います。
AviSynth のソース コードを試してみてください。ターン (回転) 関数は、turn.cpp と turnfunc.cpp にあります。