C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: PlgBlt の制約? なのか


(過去ログ 100 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■59654 / inTopicNo.1)  PlgBlt の制約? なのか
  
□投稿者/ たくろう (1回)-(2011/06/02(Thu) 22:57:21)

分類:[C/C++] 

■動作/開発環境
 ・OS:WinXP Pro
 ・開発環境:VC++ .NET 2008 MFC

■質問
 画像(主にビットマップ)を任意の角度で回転させて表示するプログラムを作っています。
CDC::PlgBlt で回転をさせているのですが、イメージのサイズが大体 4000x4000位のモノだと
メソッド自体の戻り値は正常(TRUE)を返すのですが、描画されません。
因みに、角度0度(回転させないでPlgBltを呼ぶ)でも描画されません。

コードは、
CBitmap sBmp;
BOOL bStatus = pDC->PlgBlt( Point, pMemDC, X, Y, W, H, sBmp, 0, 0 );
X, Y については、pMemDCの外を指してる場合もあります。(つまりはみ出た場所)
W, H については、pMemDCの外を指してる場合もあります。(つまりはみ出た場所)

色々調べましたが、原因が分かりません。

原因又は、解決出来る方法をご存知の方がいましたら、
是非、ご教授下さい。

宜しくお願い致します。
引用返信 編集キー/
■59671 / inTopicNo.2)  Re[1]: PlgBlt の制約? なのか
□投稿者/ おのでら (3回)-(2011/06/03(Fri) 12:18:21)
おのでら さんの Web サイト
たくろうさんこんにちは、おのでらです。

原因はわからないのですが、ためしに pDC->BitBlt や pDC->StretchBlt を使用した場合は正常に描画されるでしょうか。また、描画サイズを小さくした場合は正常に描画されるでしょうか。
引用返信 編集キー/
■59701 / inTopicNo.3)  Re[2]: PlgBlt の制約? なのか
□投稿者/ たくろう (2回)-(2011/06/03(Fri) 21:07:44)
おのでらさん、ありがとうございます。

pDC->BitBlt や pDC->StretchBltの描画ですが、大丈夫です。

ただ、手の込んだ事(ビットマップのデータを加工するなど)は
一切していません。
これって、やっぱり、ハード依存になる事なのでしょうか?
引用返信 編集キー/
■59712 / inTopicNo.4)  Re[3]: PlgBlt の制約? なのか
□投稿者/ おのでら (4回)-(2011/06/03(Fri) 23:57:14)
おのでら さんの Web サイト
2011/06/04(Sat) 00:23:51 編集(投稿者)

ちょっと確認なのですが、描画しようとしているイメージ(pMemDC)とマスクイメージ(sBmp)は同じサイズでしょうか?


【訂正】

描画しようとしているイメージ(pMemDC)とマスクイメージ(sBmp)は同じサイズでしょうか?
 ↓
変数 W, H のサイズよりもマスクイメージ(sBmp)のサイズが小さかったりしないでしょうか?

引用返信 編集キー/
■59827 / inTopicNo.5)  Re[4]: PlgBlt の制約? なのか
□投稿者/ たくろう (3回)-(2011/06/07(Tue) 22:20:14)
No59712 (おのでら さん) に返信
> 描画しようとしているイメージ(pMemDC)とマスクイメージ(sBmp)は同じサイズでしょうか?
> 変数 W, H のサイズよりもマスクイメージ(sBmp)のサイズが小さかったりしないでしょうか?

sBmp は宣言しただけのものを引数に使用しています。
(CBitmapはデフォルトコンストラクタではモノクロビットマップなので)

もしかしてですけど、マスク用のビットマップも同じサイズを持つモノクロ
を作成して引数にしないと、PlgBltが失敗するのでしょうか?

特に問題無かったのですが。。。

宜しくお願い致します。


引用返信 編集キー/
■59831 / inTopicNo.6)  Re[5]: PlgBlt の制約? なのか
□投稿者/ おのでら (6回)-(2011/06/08(Wed) 00:51:53)
おのでら さんの Web サイト
> sBmp は宣言しただけのものを引数に使用しています。
>(CBitmapはデフォルトコンストラクタではモノクロビットマップなので)

ちょっとこちらでも試してみました。確かに宣言しただけのものでも正常に描画されますね。任意のサイズでマスクを作成した場合にサイズが小さいと描画に失敗するようです。(FALSEが返ってくる)

一応私の環境でもいくつかためしてみました。

・6400x4800 の画像を変形せずに描画
 ⇒正常に描画できた(return:TRUE)

・6400x4800 の画像を200px分傾斜させて描画
 ⇒たくろうさんと同様何も描画されない(return:TRUE)

・6400x4800 の画像を 1600x1200 のサイズで描画
 ⇒正常に描画できた(return:TRUE)

・6400x4800 の画像を 1600x1200 のサイズ、かつ200px分傾斜させて描画
 ⇒描画できたが画像が崩れる&描画がものすごく重い(return:TRUE)

・6400x4800 の画像を 800x600 のサイズ、かつ100px分傾斜させて描画
 ⇒正常に描画できたがものすごく重い(まあ元サイズがでかいので)(return:TRUE)

少し Web でも調べてみたのですが、大きなサイズのイメージを描画しようとすると正常に描画されないという情報がいくつか見られました。

・画像サイズが大きくなると(5000x5000Pixel)、関数の戻り値自体は成功しているのですが、結果ビットマップ画像を見てみると真っ黒になってしまい、うまくいきません。 - http://oshiete.goo.ne.jp/qa/3651660.html
・画像を180度回転させた座標を設定するとマスクがうまくいきません。
- http://dell-support.okwave.jp/qa4610208.html?order=DESC&by=datetime

なぜこの現象が起こるのかというところまでは見つけられなかったのですが、私の環境でも起こることを考えてみると巨大なサイズのイメージを使用しての PlgBlt はあまりうまくないのかもしれません。(一度メモリ上に描画してからウインドウに描画したらどうだろうかとも思いましたがそこまでは試していません)


引用返信 編集キー/
■59920 / inTopicNo.7)  Re[6]: PlgBlt の制約? なのか
□投稿者/ たくろう (4回)-(2011/06/10(Fri) 22:51:55)
No59831 (おのでら さん) に返信
>>sBmp は宣言しただけのものを引数に使用しています。
> >(CBitmapはデフォルトコンストラクタではモノクロビットマップなので)
>
> ちょっとこちらでも試してみました。確かに宣言しただけのものでも正常に描画されますね。任意のサイズでマスクを作成した場合にサイズが小さいと描画に失敗するようです。(FALSEが返ってくる)
>
> 一応私の環境でもいくつかためしてみました。
>
> ・6400x4800 の画像を変形せずに描画
>  ⇒正常に描画できた(return:TRUE)
>
> ・6400x4800 の画像を200px分傾斜させて描画
>  ⇒たくろうさんと同様何も描画されない(return:TRUE)
>
> ・6400x4800 の画像を 1600x1200 のサイズで描画
>  ⇒正常に描画できた(return:TRUE)
>
> ・6400x4800 の画像を 1600x1200 のサイズ、かつ200px分傾斜させて描画
>  ⇒描画できたが画像が崩れる&描画がものすごく重い(return:TRUE)
>
> ・6400x4800 の画像を 800x600 のサイズ、かつ100px分傾斜させて描画
>  ⇒正常に描画できたがものすごく重い(まあ元サイズがでかいので)(return:TRUE)
>
> 少し Web でも調べてみたのですが、大きなサイズのイメージを描画しようとすると正常に描画されないという情報がいくつか見られました。
>
> ・画像サイズが大きくなると(5000x5000Pixel)、関数の戻り値自体は成功しているのですが、結果ビットマップ画像を見てみると真っ黒になってしまい、うまくいきません。 - http://oshiete.goo.ne.jp/qa/3651660.html
> ・画像を180度回転させた座標を設定するとマスクがうまくいきません。
> - http://dell-support.okwave.jp/qa4610208.html?order=DESC&by=datetime
>
> なぜこの現象が起こるのかというところまでは見つけられなかったのですが、私の環境でも起こることを考えてみると巨大なサイズのイメージを使用しての PlgBlt はあまりうまくないのかもしれません。(一度メモリ上に描画してからウインドウに描画したらどうだろうかとも思いましたがそこまでは試していません)
>
>
引用返信 編集キー/
■59921 / inTopicNo.8)  Re[7]: PlgBlt の制約? なのか
□投稿者/ たくろう (5回)-(2011/06/10(Fri) 22:59:22)
たくろうです。
おのでらさん、返信遅れて申し訳ございません。
同時に、おのでらさん自身、試して頂き本当に感謝致します。

※.操作ミスで、おのでらさんの返信内容がそのまま送信されてしまいました。
  すみません。

私も試して頂きました結果になっています。
PlgBltは、大きなビットマップに耐えられない。という事だと諦めます。(泣)

こうなると、
表示領域に回転画像の結果を表示する為には、

「回転結果がビットマップのどの領域なのか?」を事前に算出する必要がでます。
算出方法をWebで捜していますが、たてまえ等はありますが、具体的な方法「公式?」が
乗っていません。あるのは、回転による画像の崩れを修正する為に、ビットマップのデータを
直接いじってどーこーする。ようなものばかりでした。

導き出せる数式みたいな方法、又はAPI等などがあれば
教えて頂けないでしょうか?

宜しくお願い致します。
引用返信 編集キー/
■59922 / inTopicNo.9)  Re[8]: PlgBlt の制約? なのか
□投稿者/ Azulean (761回)-(2011/06/10(Fri) 23:08:40)
No59921 (たくろう さん) に返信
> 「回転結果がビットマップのどの領域なのか?」を事前に算出する必要がでます。
> 算出方法をWebで捜していますが、たてまえ等はありますが、具体的な方法「公式?」が
> 乗っていません。

三角関数(sin, cos)の話の段階なのですか?
それともその先のどこかで躓いているのですか?

# 「画像 回転 sin cos」あたりで探せば、それっぽいものを見つけられそうだけど。
引用返信 編集キー/
■59925 / inTopicNo.10)  Re[9]: PlgBlt の制約? なのか
□投稿者/ たくろう (6回)-(2011/06/12(Sun) 22:30:02)
Azuleanさん。

> 三角関数(sin, cos)の話の段階なのですか?
> それともその先のどこかで躓いているのですか?

上記は大丈夫です。知りたいのは、、、

表示領域に指定した角度で回転させた画像を表示させたい場合、
回転させる画像(0度の4点矩形の画像)のどの辺が対象の矩形領域になるのか?
です。

巨大画像の該当矩形を切り取って(メモリDCに描画)それをPlgBltで回転させて
最後にBitBltで表示領域に転送する。という手法を取りたいのです。
つまり画像全体を回転させるのでは無く、表示領域で見える部分を回転させます。

宜しくお願いします。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -