2005年05月08日
川俣晶の縁側ソフトウェア技術雑記total 8227 count

.NET FrameworkのDrawImageメソッドでピクセル等倍での描画を強制する方法

Written By: 川俣 晶連絡先

 どうせ後で忘れるので自分用にメモっておこう。

 サンプルコードは、都合によりり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を使う……とすり込まれた人(つまり私)は要注意ですね。

 え? そんな人はもはや滅多にいない? 失礼しました~。

Facebook

トラックバック一覧

2007年08月06日自動スケーリングFrom: はじめてのゲーム作り

アルファチャンネル付きのpngを表示させました。 まずは、こんな画像を作成しました。 実はアルファ付きpngを作成したのは初めてだったりします。PhotoshopElements2を持っているけど、全く使いこなせていません。 透過pngファイルの作り方 ブラウザによって... 続きを読む

キーワード【 川俣晶の縁側ソフトウェア技術雑記
【技術雑記】の次のコンテンツ
2005年
05月
08日
.NET Frameworkで現在実行中のアセンブリのフルパス名を得る方法
3days 0 count
total 9280 count
【技術雑記】の前のコンテンツ
2005年
05月
08日
C++/CLIでネイティブな文字列とmanagedな文字列を相互変換する「試行」その2
3days 0 count
total 19091 count

このコンテンツを書いた川俣 晶へメッセージを送る

[メッセージ送信フォームを利用する]

メッセージ送信フォームを利用することで、川俣 晶に対してメッセージを送ることができます。

この機能は、100%確実に川俣 晶へメッセージを伝達するものではなく、また、確実に川俣 晶よりの返事を得られるものではないことにご注意ください。

このコンテンツへトラックバックするためのURL

http://mag.autumn.org/tb.aspx/20050508151130
サイトの表紙【技術雑記】の表紙【技術雑記】のコンテンツ全リスト 【技術雑記】の入手全リスト 【技術雑記】のRSS1.0形式の情報このサイトの全キーワードリスト 印刷用ページ

管理者: 川俣 晶連絡先

Powered by MagSite2 Version 0.36 (Alpha-Test) Copyright (c) 2004-2021 Pie Dey.Co.,Ltd.