どうせ後で忘れるので自分用にメモっておこう。
サンプルコードは、都合によりりManaged C++です。
DrawImageメソッドの自動スケーリング §
System::Drawing::Graphics::DrawImageメソッドは、画像を描画します。
その際、画像データが持つ解像度情報を参照し、自動的に適切なサイズにスケーリングを行います。つまり、以下のようなコードで描画を行うと、300dpiとして作成した画像ファイルを72dpi扱いの画面に表示させると、ピクセル等倍ではなく縮小されます。
System::Drawing::Rectangle srcRect(画像のピクセルサイズそのものを指定);
g->DrawImage(p->image,0,0,srcRect,System::Drawing::GraphicsUnit::Pixel);
DrawImageUnscaledメソッドの自動スケーリング §
DrawImageと並んで、DrawImageUnscaledメソッドが存在しますが、Unscaledという言葉にピクセル等倍を期待しても裏切られます。ここでいうUnscaledとは見かけ上のサイズ変更しないことであり、それを達成するために画像の拡大縮小が行われます。
ピクセル等倍を堅持するには §
結論から言えば、描画側に対して、どのサイズで描いて欲しいのかを明示することで、ピクセル等倍の描画を実現できます。
一例を以下に示します。
System::Drawing::Rectangle targetRect(画像のピクセルサイズそのものを指定);
g->DrawImage(p->image,targetRect,targetRect,System::Drawing::GraphicsUnit::Pixel);
このコードと、上手く行かなかったコードの相違点は、描画側を座標のみ示すか、矩形(座標+サイズ)を示すかの相違です。
感想 §
昔ながらのWindows APIに慣れすぎて、とりあえずBitBltで等倍転送。拡大縮小は特別にStretchBltを使う……とすり込まれた人(つまり私)は要注意ですね。
え? そんな人はもはや滅多にいない? 失礼しました~。