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



さて、前回は色々と準備に

手間取っていたが

いよいよ回転させる

プログラムに取り組む。



まずは、クラスから

// 単純な構成になっているので、何をするかは名前から大体分かる。
class YuvImageRotate
{
public:
YuvImageRotate();    // コンストラクタ
~YuvImageRotate();  // デストラクタ
        // オリジナル画像データと回転方向の設定する
void SetYuvRawData(int orient, unsigned char *src_data, int width, int height);
        // 回転後の画像データを取得する
unsigned char *GetRotatedYuvRawData(int *raw_size, int *raw_width, int *raw_height);
private:
int m_Angle;
bool m_bHorizon;
int m_Size;
int m_Width;
int m_Height;
unsigned char *m_pRotated;
int m_SrcWidth;
int m_SrcHeight;
unsigned char *m_pSrc;
void getRotateInfo(int);  // 内部処理で使用する回転情報を取得する関数
void invokeReverse();       // 反転を実行する関数
void invokeRotate();         // 回転を実行する関数
};

使い方としては、プログラム実行時に、あるyuv画像をこの角度回転させると

正しい向きになるという情報をパラメータとして与えることにしている。

例えば、Orientation 6  時計回りに90度を指定したとすると、

左の元画像に対し、出力結果は右画像のようになる。

 

なお、簡単なサンプルなので、デスクトップにあるyuv画像を回転後のyuv画像として、

デスクトップにファイルを出力するという形式になっている。

次にコンストラクタと一応書いただけのデストラクタがこちら。

// やることはメンバ変数の初期化だけ
YuvImageRotate::YuvImageRotate() : 
m_Angle(0),
m_bHorizon(false),
m_Size(0),
m_Width(0),
m_Height(0),
m_pRotated(NULL),
m_SrcWidth(0),
m_SrcHeight(0),
m_pSrc(NULL)
{
}

// nothing to do
YuvImageRotate::~YuvImageRotate()
{
}


その他メンバ関数は、全体を通すと意外と長くなってくるので、次回に続く。


今日の名言
今日は新しい日です。この日に注ぎ込んだものは、何でも取り出すことができます。
たとえ失敗を、それも大失敗をやったとしても、またやり直す機会が常にあります。
そして、何度も何度も試みては失敗したとしても、いつでも好きな時に出発し直せる
のです。なぜなら、いわゆる「失敗」とは、倒れることでなく、ちょっと留まるだけのこと
だからです。
                             メアリー・ピックフォード

幸福は人の地位とか財産には関係がない。全く自分の考え方一つで、人は幸福にも
不幸にもなる。だから毎朝自分にとってありがたいもののことを考えて、一日を
はじめることだ。人の未来は自分が今日考えていることに非常に大きく左右される。
だから希望と自信、愛と成功のことばかり考えるのだ。
                             デール・カーネギー

いつも楽しく暮らすよう心がければ、外的環境から完全に、あるいはほとんど
解放される。
                             ロバート・ルイス・スティーヴンソン