VC++でGDI+ そにょ5 〜画像の描画1〜

さて、前回までで読み込んだ画像を描画しよう。描画にはGraphics::DrawImageメソッドを用る。リファレンスのままだと使いにくいので、目的別に分類してみる。
dstは描画先の画像、srcは描画する画像を意味する。メソッドの返値はすべてStatusである。デフォルト引数は見本からは省略して、その後で述べる。

単純描画

dstの左上の位置(dstX, dstY)に描画する。srcの画像は原寸大でクライアント領域に収まる分だけ描画される。

DrawImage(Image *srcImage, INT dstX, INTdstY);
DrawImage(Image *srcImage, REAL dstX, REAL dstY);
DrawImage(Image *srcImage, const Point &dstPoint);
DrawImage(Image *srcImage, const PointF &dstPoint);

拡大縮小

srcの全体を、幅dstWidth、高さdstHeightに拡大または縮小して、dstの(dstX, dstY)に描画する。

DrawImage(Image *srcImage, INT dstX, INT dstY, INT dstWidth, INT dstHeight);
DrawImage(Image *srcImage, REAL dstX, REAL dstY, REAL dstWidth, REAL dstHeight);
DrawImage(Image *srcImage, const Rect &dstrect);
DrawImage(Image *srcImage, const RectF &dstrect);

切取描画

srcの(srcX, srcY)から幅srcWidth、高さsrcHeightだけ切り取って、dstの(dstX, dstY)に描画する。

DrawImage(Image *srcImage, INT dstX, INT dstY, INT srcX, INT srcY, INT srcWidth, INT srcHeight);
DrawImage(Image *srcImage, REAL dstX, REAL dstY, REAL srcX, REAL srcY, REAL srcWidth, REAL srcHeight);

第8引数は Unit srcUnit = UnitPixel 。普通はPixel単位で処理するので特に気にしなくて良い。

切取+拡大縮小

srcの領域srcRectを、dstの領域dstRectに描画する。

DrawImage(Image *srcImage, RectF &dstRect, RectF &srcRect);

第4引数は Unit srcUnit = UnitPixel 。
第5引数は ImageAttributes *imageAttributes = NULL 。srcに加工を行いたいときに用いる。


srcの(srcX, srcY)から幅srcWidth、高さsrcHeightだけ切り取り、dstの領域dstRectに描画する。こちらはオプションが追加されている。

DrawImage(Image *srcImage, const Rect &dstRect, INT srcX, INT srcY, INT srcWidth, INT srcHeight);
DrawImage(Image *srcImage, const RectF &dstRect, REAL srcX, REAL srcY, REAL srcWidth, REAL srcHeight);

第7引数は Unit srcUnit = UnitPixel 。
第8引数は ImageAttributes *imageAttributes = NULL 。
第9引数は DrawImageAbort callback = NULL。描画をキャンセルするためのコールバックメソッドを指定する。多分使うことはない。
第10引数は VOID *callbackData = NULL。第9引数に指定されるメソッドによって使用される追加データのポインタを指定する。

変形(拡大縮小・平行四辺形・回転)

平行四辺形に変形をする。具体的には、srcの左上、右上、左下の3点についてdstでの座標をPointの配列で指定する。これを利用すれば拡大や回転も行える。

DrawImage(Image *srcImage, const Point *dstPoints, INT count);
DrawImage(Image *srcImage, const PointF *dstPoints, INT count);

第2引数はPointの配列である。これは3要素を持ち(Point[3])、順に、左上、右上、左下を示す。
第3引数は指定したPointの数である。これは必ず3でなくてはならないが、デフォルト引数ではないので明示的に指定しなくてはならない。

Point dstPoints[3] = {Point(0, 0), Point(400, 200), Point(100, 300)};
graphics.DrawImage(&image, dstPoints, 3);

切取+変形

srcの(srcX, srcY)から幅srcWidth、高さsrcHeightだけ切り取り、dstPointsで指定される平行四辺形に変形して描画する。countは必ず3を指定する。

DrawImage(Image *srcImage, const Point *dstPoints, INT count, INT srcX, INT srcY, INT srcWidth, INT srcHeight);
DrawImage(Image *srcImage, const PointF *dstPoints, INT count, REAL srcX, REAL srcY, REAL srcWidth, REAL srcHeight);

第8引数は Unit srcUnit = UnitPixel 。
第9引数は ImageAttributes *imageAttributes = NULL 。
第10引数は DrawImageAbort callback = NULL 。
第11引数は VOID *callbackData = NULL 。


次回はこのメソッドを用いて回転させる関数を書いてみよう。