• ベストアンサー

ROP2での描画について

WinAPI(C言語)でペイントのようなアプリを作成しているのですが、 例えば、写真のような画像の上に任意の色で塗りつぶした四角形を描画し、 それを元の画像に戻す場合は、SetROP2関数は使用できないのでしょうか? 当初R2_NOTを指定すればいいと思っていたのですが、 これはR2_NOTで描画した画像の上にR2_NOTで描画すれば以前の画像に戻りますが、 白や黒の任意のブラシで塗りつぶした場合にそれを元の画像に戻す方法はありますか? ご教示願います。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

変更前の画像を(必要な範囲だけ)保存しておいて、Undo時には以前の画像に戻す処理をするのが一般的じゃないでしょうか。 この方法では、大きな画像を繰り返し編集すると、保存するデータ量が多くなって消費メモリが増えるので、一時ファイルに書き出すとか、可逆圧縮処理をするといった工夫をしているソフトもあると思います。

scanfprintf
質問者

お礼

たびたびのご回答ありがとうございます。 確かにすべてのビットマップハンドルを保持しているとメモリが心配です・・・ 一時ファイルに書き出すのはできそうですが、可逆圧縮処理はなんか難しそうですね。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.1

ありません。 R2_NOTの場合、塗りつぶすのではなく論理演算を使用して元の色から別の色に変換しています。この変換が逆変換可能なため、元に戻すことができます。 画像の一部を任意の色に変更してしまった場合は、元の色のデータがなくなってしまうため、元に戻すことはできません。

scanfprintf
質問者

お礼

早速のご回答ありがとうございます。 ちなみにこういった場合は、どのように実現させるのでしょうか? 例えば、UNDO機能を付ける場合は皆さんどのようにされているのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VC++ ドラッグしながらの図の描画に関して

    描画に関して質問があります。 アクセサリのペイントツールのようにマウスドラッグしながら長方形を描画させたいのですが、 ドラッグの際に既に描画してあった長方形を消去する方法が理解できません。 具体的には以下のような方法です。 // ドラッグ中の描画処理 SetROP2( hDC, R2_NOT ); // 前景モードを変更 hPen = CreatePen( PS_DOT, 1, RGB(0, 55, 0) ); // 黒い点線のペンを作成 hBrush = (HBRUSH)GetStockObject( NULL_BRUSH ); // 空のブラシを取得 SelectObject( hDC, hPen ); // 作成したペンを使用するように設定 SelectObject( hDC, hBrush ); // 取得したブラシを使用するように設定 Rectangle( hDC, start.x, start.y, old_end.x, old_end.y ); // 四角形を描画 SetROP2とブラシは共に塗りつぶしを指定するものですが、これらを併用することによって何故既存の図形を消去していくことができるのかわかりません。 疑問になったのでブラシに関する記述を消去し実行してみると長方形内部の色が反転されましたが、これは理解できます。 しかし、これにブラシに関する記述を復元させることにより、なぜ内部が真っ白になるのかがわかりません。 また、塗りつぶしはSetROP2とブラシのどちらが先に行うのでしょうか?お手数ですが回答よろしくお願いします。

  • canvasで完全二分木を描画したいのですが

    JavaScriptのcanvasを使って、画像の様な完全二分木を描画したいです。 木の深さをrとし、rは任意で変更できるようにしたいと考えています。 canvasのサイズは1000x1000程度で、r=4くらいまで対応できるものであれば幸いです。

  • Photoshop 描画色がグレ-になってしまいました。

    Photoshop 描画色がグレ-になってしまいました。 数日前までは普通に出来ていたのが、突然今日出来なくて困っています。 画像の色を取り出し、塗りつぶしレイヤ-(べた塗り)作成でそのレイヤ-を色々な色に変えてデザインしています。 今日出来なくなっている状態は (1)スポイトツ-ルでカラ-ピッカ-から色を取ろうとしてもツ-ルの描画色がグレ-で描画色が使えない状態です。 (2)ツ-ルの描画色をクリックして色を取ろうとしてもカラ-ピッカ-は反応なし、画像から取ろうとすると白か黒になります。 (3)レイヤ-を選択して『べた塗りする色を選択』→スポイトでカラ-ピッカ-をクリックしても色が変わりません。しかし画像の色からならスポイトで画像をを選択するとその色に変化します。 この時ツ-ルの描画色もグレ-でなく色がついていますのでその色は使って色を変えることが出来ます。 不思議でなりません。宜しくお願いします

  • Picture の描画について 質問です

    「[Picture1]に描画された図形」の上に 「[Picture2]に描画された図形」を重ねて表示したいのですが、 この場合、[Picture2]の背景のみを透明にして、描画された図形のみを表示するという事をしたいです。 例 a「[Picture1]に半径6cmの色が赤の円」 b「[Picture2]に半径3cmで色が黒の円」 aの上にbを重ねると、外側が赤、内側が黒の二重丸が描画される という具合です。  この描画が可能なら[Picture1]に限らず他のものでも構いませんので、どうか御教授お願いします。

  • 画像の白と黒のドットを数えたい

    例えば白と黒だけで描かれたビットマップ画像を用意し(白黒であればbmpでなくてもどんな形式でも良い)、縦のラインで白は幾つあるか、黒は幾つあるかを画像全体に関して求めるにはどうすればいいでしょうか。 例えばWindowsのペイントでペンツールだけで適当に絵を描いた大きさ640×384のビットマップ画像の場合、ある縦のラインでは白は120、黒は264あり、その隣の縦のラインでは白は124、黒は260あり、、、とこれを640回繰り返して画像の縦のラインでの白値と黒値の値を順次求めていってくれるような機能のあるソフトはあるでしょうか。 それともやはりC言語等のプログラミングで求めていくしかないでしょうか。 画像処理に詳しい方お願いします。

  • フォトショップ 色の一部反転について

    添付画像のように、背景の白い部分は黒の線を、背景が黒い部分には白の線を引きたいのですが、どう設定すれば出来るようになるでしょうか。 ちなみにこの画像は、白のキャンバスの上に黒丸のシェイプ→黒のブラシツールで文字を書く→シェイプの不透明度を20%くらいまで下げる→黒ブラシレイヤーの上から白ブラシでなぞる→シェイプの不透明度を100%にする というようにして作成しました。 もっと簡単に出来る方法を教えてください。 補足 使用ソフトはフォトショップエレメンツ7.0です

  • 画像の加工:方眼紙のような画像の背景を透明にしたい

    背景が白の方眼紙の画像を作ったのですが、背景部分を透明にしたいと考えています。 元の画像は、正確に10px毎に線が入っている画像を作るのが大変そうだったので、Javascriptでブラウザに描画してスクリーンショットから作りました。 使用している画像処理ソフトは、MacのPixelmator、Seashore、Windowsのペイントくらいです。 Pixelmatorには任意の色だけを変更する機能がありますが、透明色にはできませんでした。 高価な画像処理ソフトは使用していませんが、これらのツールにはこだわらないので、 他のソフトでも、何かよい方法をご存知ならおしえてください。

  • アルゴリズム : 円描画

    画像を作ってるのですが、円描画のまともな方法が分かりません。 現在は、数学っぽいサイトを検索した所円の方程式は r2乗 = X2乗 + Y2乗 と言うのが出てきたのでそれを元に作ってます。 具体的には、y軸に近い部分はx軸から。x軸に近い部分はy軸から描画を始め、 それそれ8回に分けて一つの円を描画しまてす。 イメージ的には rを定数とし、y軸の直下や真上付近ならx軸を一つづつずらし、yの値を求めます。 x軸の右側付近とかならy軸をずらします。 数学風に書くと y ** 2 = (x + n) ** 2 + r ** 2 みたいなイメージです。(n = 何個目のドットを描画しているか。**はPerlなどでべき乗)。 これの平方根を求めて端数を四捨五入してます。 この方法だと軸から遠ざかると塗りつぶすドットが飛び飛びになるので8回(もしくは4回)の描画が必要です。 問題はまず、 それが一般的な方法かどうかと言う点です。8回に分けるもんだから処理が汚いです。 さらになぜか、円も汚いです。 いや理由はだいたい分かるんですけど、ドット数に少数点とかないから四捨五入とかしてます。 すると、どうもちゃんとした円にならないです。そこドットの描画一個ズレてるだろコレ? おまえそれ、明らかに1ドットずらしたほうが綺麗な円になるぞ? みたいことが起きます。 もう一つ、他の疑問なんですがちょっと数学的な疑問で、 円を1/8づつ描画させるにはnのループ回数を n = r / (1.4140 < m < 1.4146) くらいの値に設定しなきゃならないことが分かりました。 なぜ割り算させたのかはもう覚えてません。 一つづつ手作業で確かめて絞り込んだ数値なのですが、 どうもmが2の平方根に似ている気がします。 なぜこうなるんでしょう。たぶん数学的な何かだと思うのですが。 なお数学的な知識は全然ないです。学校では一日中寝るのが特技でした。 まさかこんな技術が必要になるとは…。

  • access2000の画像ファイルの透過について

    access2000上で複数の画像ファイル(ペイントブラシで線を引いたイメージ)を重ねて表示をする場合、上の画像が優先となり下部の画像が見えません。上の画像と透過して表示させたいのですが、宜しくお願いします

  • wordの描画のコピペで体裁が崩れる

    添付した画像のように、あるファイルで作成した「描画」を他のファイルへコピーペーストするとテキストの位置がずれてしまいます。どのようにして調整したらよいのでしょうか。 添付図の左側は元のファイルで、四角形の真ん中に文字を書いていますが、別のファイルへコピーすると文字が上に寄ってしまい、見えなくなってしまっています。 WORD2003を使用しています。 宜しくお願い致します。