YUV420形式の画像ファイルを回転させてみたい 3




さて、YUV画像回転の話

 3回目

プログラム説明の

続きである。



コンソールアプリは、普通に実行するとコマンドプロンプト画面が速攻で消えるので、

何が行われたかがわからなくなる。

return 0; の前に、 system("pause"); を書いておく、とこんな方法もあるらしい。

そんなわけで  main() を公開してみる。

int main(int argc, char *argv[])
{
        // 引数は 画像ファイル(フルパス)  画像の横サイズ 画像の縦サイズの3つ
cout << "This is Yuv Image Rotate Sample." << endl;
int width = atoi(argv[2]);
int height = atoi(argv[3]);

unsigned char *org_data = NULL;
FILE *fp = NULL;
errno_t err;
err = fopen_s(&fp, argv[1], "rb");  // 元画像ファイルをセキュアにオープン
if (err == 0) {
        // 内部ではバイナリデータとして扱うためコピー
fseek(fp, 0L, SEEK_END);
long fsize = ftell(fp);
rewind(fp);
org_data = new unsigned char[fsize];
fread(org_data, sizeof(unsigned char), fsize, fp);
fclose(fp);
}
else {
       // エラー処理は真面目にやっていない
printf("The file was not opened\n");
}

YuvImageRotate YuvIR;  // インスタンス生成

int img_size = 0;
int img_width = 0;
int img_height = 0;

// 180度回転させると正しい画像になる
YuvIR.SetYuvRawData(3, org_data, width, height);
unsigned char *img1 = YuvIR.GetRotatedYuvRawData(&img_size, &img_width, &img_height);
if (img1 != NULL) printf("%02X %02X %02X %02X\n", *img1, *(img1 + 1), *(img1 + 2), *(img1 + 3));
printf("rotated(180) size:%d, width:%d, height:%d\n", img_size, img_width, img_height);

// 90度時計回りに回転させると正しい画像になる
YuvIR.SetYuvRawData(6, org_data, width, height);
unsigned char *img2 = YuvIR.GetRotatedYuvRawData(&img_size, &img_width, &img_height);
if (img2 != NULL) printf("%02X %02X %02X %02X\n", *img2, *(img2 + 1), *(img2 + 2), *(img2 + 3));
printf("rotated(090) size:%d, width:%d, height:%d\n", img_size, img_width, img_height);

// 270度時計回りに回転させると正しい画像になる
YuvIR.SetYuvRawData(8, org_data, width, height);
unsigned char *img3 = YuvIR.GetRotatedYuvRawData(&img_size, &img_width, &img_height);
if (img3 != NULL) printf("%02X %02X %02X %02X\n", *img3, *(img3 + 1), *(img3 + 2), *(img3 + 3));
printf("rotated(270) size:%d, width:%d, height:%d\n", img_size, img_width, img_height);

//reversion test
YuvIR.SetYuvRawData(2, org_data, width, height);
unsigned char *img4 = YuvIR.GetRotatedYuvRawData(&img_size, &img_width, &img_height);
if (img4 != NULL) printf("%02X %02X %02X %02X\n", *img4, *(img4 + 1), *(img4 + 2), *(img4 + 3));
printf("rotated(000) size:%d, width:%d, height:%d\n", img_size, img_width, img_height);

 // deleteのあとはNULLを代入しておくのが望ましいが、後は終わるだけなので省略
if (img1 != NULL) delete[] img1;
if (img2 != NULL) delete[] img2;
if (img3 != NULL) delete[] img3;
if (img4 != NULL) delete[] img4;
if (org_data != NULL) delete[] org_data;

system("pause"); // 続行するには何かキーを押してください...と表示される

return 0;
}

実行すると、期待通りデスクトップに4つのファイルが出力された。

全部開いてみるとこんな具合になる。




lena さんが4人...









次回は、main()で使用しているメンバ関数の説明 に続く


今日の名言
明朗は心の中に日光を照らし続ける。そして心を絶え間なく静けさで満たす。
                                 ジョセフ・アディソン

人生は将棋のようなものだ。自分の手中にあるものはチャンスではなく、
駒の進め方だ。
                                 テレンティウス

外からの出来事が人の運の良し悪しに大いに関係することは確かだ。
これには、他人の好意、機会、関係者の死、その人の美徳ゆえの機会などが
入る。だが、自分の運をどう発展させていくかの問題は、その人の手中にしかない。
                                 フランシス・ベーコン

君の運が破れた時は、私の言葉を思い出せ。
「運命の良し悪しにかかわらず、全てに満足することだ」
                                 ロバート・ヘリック