プロが教える店舗&オフィスのセキュリティ対策術

動画像を1フレーム毎に1ピクセルずつ右にずらし右にはみでたピクセルは左の欠けた部分にそのまま補完するプログラムを作りたいのですが途中からわかりません;;

ピクセルどどうやって右のやつを左にもっていくのかがさっぱりで・・・どなたかお願いします。

#include <stdio.h>
#include <stdlib.h>

#define x_size 352
#define y_size 288

#define FN 200

typedef struct
{
unsigned char Y[x_size*y_size];
unsigned char U[x_size*y_size/4];
unsigned char V[x_size*y_size/4];
} FRAME;

int main(void)
{
FILE *fpr;
FILE *fpw;
char file_name1[100]="zikken2.yuv";
char file_name2[100]="./out.yuv";
int i, frame_num,j;
FRAME *ref;

if((fpr = fopen(file_name1, "rb")) == NULL){
fprintf(stderr, "Can't open %s in read mode\n", file_name1);
exit(-1);
}

if((fpw = fopen(file_name2, "wb")) == NULL){
fprintf(stderr, "Can't open %s in write mode\n", file_name2);
exit(-1);
}

ref = (FRAME *)malloc(sizeof(FRAME));
/* read from file */

for(frame_num=0; frame_num<FN; frame_num++){

for(i = 0; i<x_size*y_size; i++){
ref->Y[i] = getc(fpr);
}
for(i = 0; i<x_size*y_size/4; i++){
ref->U[i] = getc(fpr);
}
for(i = 0; i<x_size*y_size/4; i++){
ref->V[i] = getc(fpr);
}
/* write to file */

fwrite(ref,1,sizeof(FRAME),fpw);
}

fclose(fpr);
fclose(fpw);
free(ref);

return 0;
}

A 回答 (2件)

こんにちは。


今の状態ですと、単なるファイルコピーですね。
まずは、現在面単位で処理しているところを、行と列に分ける事を考えてみられてはどうでしょうか。
移動するのはそれからですね。
それで、移動するためには次の点をクリアにする必要がありますが、いかがでしょうか。
・プレーンごとのデータフォーマットはどうなっているか
 (352ピクセルが288ライン綺麗に並んでいる?)
・1ピクセル移動するとなると、YとUVの間にズレが生じるが、どうするか。
  案1 UとVを真面目に計算しなおす。
  案2 2ピクセルずつ移動する。
  案3 色差プレーンはズレても目をつぶる。
    (Y 2ピクセルごとにUVは1ピクセル移動する)
 といった作戦が必要かと思います。
    • good
    • 0

データのフォーマットはどのようになっているのでしょうか? つまり, その画像ファイル中にそれぞれのピクセルの情報がどのように入って

いるのでしょうか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!