問題タブ [graphics32]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
delphi - Delphi Graphics32 - レイヤーの編集、TBitmap32 の一部の消去 (レイヤー)
レイヤーの画像を編集することはできますか? つまり、複数の選択可能なレイヤーを持つ TImgView がある場合、1 つのレイヤー (ラバーバンドとすべて) を選択できるかどうかを知りたいのですが、たとえば、メニューのボタンをクリックすると、マウスがゴムに変わります。マウスの下のコンテンツをクリックすると削除できる消しゴム。Paint.net や Photoshop の消しゴムのようなものです。
これを達成することは可能ですか?もしそうなら、どのように?これまでのところ、それを行う方法を見つけることができませんでした。通常の TImage (TPaintBox) では、解決策は背景の上に白を描画することですが、透明なレイヤー/画像を操作する場合、それは解決策ではありません。じゃあ何をすればいいの?
ヘルプ(コード)をいただければ幸いです。
ありがとうございました
delphi - Delphi Graphics32 レイヤー上でマウスを使って線を引く方法
線を動的に描画するこの優れた方法(デルファイを使用した Photoshop スタイルの線の描画)を Graphics32に変換するのを手伝ってくれる人はいますか?
つまり、ImgView が必要で、それに新しいレイヤーを追加してから、フォームのキャンバスではなくレイヤーでこれらのメソッドを実行します。
したがって、私のコードは次のようになります。
...
これらはリンクからの通常のキャンバス描画メソッドで使用されるイベントであるため、このコードを想定していますが、残りのメソッドは本来のように機能しません
だからうまくいきません。何も起こりません。通常のキャンバス描画のようにこの作業を行うのを手伝ってくれる人はいますか? Button1Click で作成した 1 つのレイヤーだけでこれを実現したい (ImgView はフォームに配置された ImgView32 コントロールであり、フォームにもボタンがあります)
結果は次のようになります (Canvas では描画が許可されていないというエラーが表示されます)
最初に onButtonClick でエラーが表示され、OK した後、描画を開始すると、移動する線が消去されません (上の画像のように)。 onMouseUp で Canvas エラーが再び表示されます。
私は何を間違っていますか?
SwapBuffers32 を使用すると、何も描画されず、キャンバス エラーが表示され続けます。
編集:Tom Brunbergの提案の後に機能させるためにいくつかの変更を加えたところ、次のコードになりました:
これで、Canvas エラーはなくなりましたが、マウス移動の線は描画されたままです... 解決策は、BitBlt 関数 (swapbuffers32) にあるはずです。何か案は?
delphi - Delphi Graphics32 の相対マウス位置(レイヤーまで)
すべてのフォーム マージンに固定されている ImgView32 があります。フォームが最大化されます。
ImgView のビットマップは固定されていません (サイズが異なる場合があります)。
この質問のコードを使用して、透明なレイヤーに線を引こうとしています: Drawing lines on layer
問題は、その正確なコードを使用すると、次の画像のように左上隅にしか描画できないことです。
ご覧のとおり、線は左上隅にのみ描画できます。開始点と終了点に値を追加しようとすると、すべてが狂ってしまいます。したがって、ユーザーが中央の四角形の内側にのみ描画できるようにポイントを変換する方法を見つける必要があります (画像に表示されています)。
私はアイデアがありません。
助けてください
ユニット全体は次のとおりです。
私は何を間違っていますか?上記のユニットをテストして、私の意味を確認してください。ImgView を追加してすべての余白に固定し、実行時にフォームを最大化して線を描画することを忘れないでください...
編集
上の緑色の画像では、中央に四角形のような四角形がありますが (あまり目立ちません)、よく見るとわかります。
私の問題は誤解されているかもしれないので、次の画像を見てください
ImgView の中央にある白い四角形 (ビットマップ) にのみ描画できるようにする必要があります。どう説明したらよいかわかりません。
それは私のプロジェクトのポイントではないため、長方形/ビットマップをImgViewに正確にフィットさせることは私にとって解決策ではありません。
Paint.net を見て、私のプロジェクトが同じようなことをしていると想像してみてください (それほど複雑ではないことを除けば)。しかし、原則は同じです。新しいプロジェクトを開始するときにドキュメント/画像のサイズを決定し、さまざまな画像をレイヤーとして追加し、それらを拡大縮小して回転させます。次に、ユーザーが内部に線を描画できるようにしたいと考えています特別なレイヤー (描画レイヤー) しかし、すべてはそのドキュメント サイズの境界内で発生します。たとえば上の画像のように、ドキュメントのサイズは A5 (100dpi) を 83% にスケーリングしたものです。
したがって、私の問題は、ユーザーが白い長方形の外側 (画面の中央) に線を引くことを許可できないことです。したがって、彼らの線はそれらの境界で始まり、そこで終わることができます。
テスト ユニットが完全にきれいではないことはわかっています。メイン プロジェクトで使用されているいくつかの関数を貼り付け、この例に関係のないいくつかの部分をすばやく削除しました。AddTransparentPng プロシージャは、透明なイメージを ImgView に追加するテストを許可するためだけに存在するため、描画レイヤーが別のレイヤーをカバーしていないかどうかをテストできます。
(Scaled プロパティはレイヤー (B) に属し、'with B' ステートメントの下にあります。With 'ImgView.Bitmap... Location' ステートメントを削除したので、もう気にする必要はありません :) )
とにかく、線の描画に影響しないコードには注意しないでください。そのコードは注意が必要です。
EDIT
レイヤーのスケーリングをtrue(Scaled:= true)に設定すると、次の画像のようにすべてが台無しになります。
まだオフセットを使用する必要がありますが、少し異なります
ありがとうございました
delphi - 通常のレイヤーと描画レイヤーを組み合わせた Delphi Graphics32
描画レイヤーとは、ユーザーが線、円、またはその他の形状を手動で描画できるレイヤーを意味します。また、通常のレイヤーとは、graphics32 レイヤーの例で説明されているレイヤー (実行時にマウス イベントを使用して移動またはサイズ変更できるレイヤー) を意味するため、これら 2 種類のレイヤーを組み合わせることが困難です。私のテスト プロジェクトでは、今のところ、1 つの描画レイヤーと複数の PNG レイヤーしかないと仮定します。したがって、私のプロジェクトでは、OnFormCreate で ImgView32 のプロパティを次のように設定します。
この後、ボタンの onClick に、いくつかのレイヤー (透過 PNG 画像を含む) を追加します。だからこんな感じ
(質問を短くするために、ここでは PNG レイヤーの追加について詳しく説明しません。drawingLayer で使用されているものとは異なる onMouseDown イベント (layerMouseDown) を使用しているとだけ言います) AddDrawingLayer は次のとおりです。
EdLayerIndex は、作成/選択されたレイヤー インデックスを表示する EditBox です (デバッグ用)。
- 上記のように、保持する
Selection:=BB
とRBLayer:=nil
drawingLayer は移動およびサイズ変更のみ可能であり、この特定のレイヤーでマウス イベントを使用して描画したいので、これは良い解決策ではありません。 RBLayer:=nil
while keepだけコメントするとSelection:=BB
、drawingLayer はもう移動できませんが、drawingLayer の下にある他のレイヤーを選択することはできません。一番上のレイヤー (最後に追加された PNG レイヤー) にしかアクセスできませんコメントする
Selection:=BB
と、マウスで他のレイヤーを選択できなくなります。したがって、私の場合、drawingLayer の前に 2 つの png レイヤーを宣言し、その後に 1 つ宣言しました。実行時に最後のレイヤー (drawingLayer の「上」) しか選択できないため、これも解決策ではありません。
描画レイヤーをクリックすると(またはリストボックスなどで選択すると)、drawingLayerは移動できませんが、描画マウスイベントが開始されますか?そして、必要なときにいつでも drawingLayer から離れて、他のレイヤーを選択して移動したり遊んだりすることができます。したがって、基本的に、他のレイヤーのように機能しない特定のレイヤーが必要です。
私が達成したいのは、graphics32 を使用して、古典的な Photoshop のような、または paint.net のような動作をすることです。そして、これらのレイヤー プロパティが実際にどのように機能するかは非常にわかりにくいものです。
これまでのところ、(マウスイベントを使用して)透明レイヤーに(線、円、長方形)を動的に描画する方法を理解しました。だから私は描画レイヤーを持つことができます。描画は、、、、イベントで行わDrLayerMouseDown
れます。しかし、そのような描画レイヤーを通常の可動/サイズ変更可能なレイヤーと組み合わせる方法を理解できないようです。DrLayerMouseUp
DrLayerMouseMove
DrLayerPaint
コードの残りの部分 ( 、setSelection
、RBResizing
などlayerMouseDown
) は、ほとんどが graphics32 ライブラリのレイヤーの例から取られています。
編集
でアイデアをテストするためにlayerOptions
、次のことを行いました。
1. ImgView とボタンを含む新しいテスト プロジェクトを開始します。
2.作成時に、以前と同じコードを使用しました
3.OnButtonClick 次のように、修正された AddDrawingLayer を使用して 1 つのレイヤーを追加しました。
マウスイベントの影響を受けなくなることを期待しています。ただし、レイヤーはマウスに反応しない代わりに移動可能です。だから何もしてないに等しい
したがって、間違っていない限り、このオプションを使用しても役に立たないと思います。そのため、レイヤーの onCreate では、このオプションは固執していないようです。しかし、次の編集のように、すべてのレイヤーのマウス イベントを 1 つずつ無効にすると、描画レイヤーが無効になります (マウス イベント)。
編集
また、同じアイデアの別のテスト プロジェクトを試してみました: 同じ onCreate と onButtonClick それぞれに画像を含む 3 つのレイヤー (ライブラリのレイヤーの例を使用) を追加します (今回は単純にするために描画レイヤーはありません)。次に、クリックすると次のコードが実行される新しいボタンを追加しました。
私の目的は、すべてのレイヤーをマウス イベントの影響を受けないようにすることでした。新しいボタンをクリックした後、レイヤーを選択できなくなりましたが、レイヤーのマウスイベントを再度有効にしたい場合(次のコードonClickで3番目のボタンを追加):
エラーは表示されませんでしたが、移動するためにレイヤーを選択しようとすると...レイヤーのすべての画像がビューから消えました...白い背景の空のImgViewが残りました。
私は何を間違っていますか?LayerOptionsで提案したことを行うには、すべてのレイヤーのマウスイベントを無効にし、特定のレイヤーのマウスイベントを有効にする必要があり、編集が完了したら、マウスイベントを再度有効にする必要がありますすべてのレイヤーに対してですが、間違っていると思います。
delphi - Delphi: GR32 ブレンディング アルファ チャンネルは Clear() 色に依存します
アルファ チャネルのある画像を使用しましたが、画像の一部が完全に不透明ではありません。オブジェクトに描画すると、TImgView32
セクションが色から少し色がClear()
つきます。サンプル画像でそれを示しましょう:
これは、Photoshop で通常表示される元の画像です。
これは、以前にクリアした GR32 オブジェクトの新しいレイヤーに描画した結果の画像ですClear($00FF0000);
。
結果はPhotohopのように透明ですが、その赤いハローが問題です.
または別の色Clear($000000FF);
:
ご存知のように、私が使用した色は完全に透明であることに注意してください。
上記の結果を作成するために使用したコードは次のとおりです。
これを回避し、Photoshop のような明確な結果を得るにはどうすればよいですか?
delphi - ImgView32 透明レイヤーを PNG に保存する
ImgView32 レイヤーを TRANSPARENT PNG として保存する際に問題があります。この質問のコードを使用して節約を行います。ただし、画像は白い背景で保存されます。
ImgView32 を初期化し、その上にレイヤーを作成し、その上に線を引く方法は次のとおりです。
したがって、iv1 は私の ImgView32 の名前です。次に、次のコードを使用して線を引きます。
四角形を描画するときに上記のコードに clWhite32 を使用すると、PNG を保存すると imgView の背景が黒くなります...だから私は本当に問題を理解していません。
私はこのように保存します:
および実際の保存コード (上記のリンクから)
レイヤーを透明なPNGとして保存しない理由がわかりません。どうすれば修正できますか?どんなアイデアでも大歓迎です。
上記のコードを使用して、私の問題を再現できます。GR32_PNG と GR32_PortableNetworkGraphic を使用します。TImgView32 コントロールをフォームに追加し、上記のコードを追加するだけです。
delphi - ImgView32レイヤーに太い点線を描く
ImgView32のレイヤーに縦の点線の太い線を描きたいだけです。Canvas.Pen.Width は LineTo メソッドに影響を与えないため、線を太くしたいので、複数の線を互いに近づけて描画します。したがって、私のコードは次のとおりです。
したがって、線は新しいレイヤーの中央に配置することを意図しています。これを使用してレイヤーを追加します。
残りのコードについては、私のコードをレイヤーの例に追加するだけで、問題を再現できます。
私が読んだ限りでは、点線を描画するには、LineToFSP (私のコードで使用) を使用した Stipple や BuildDashedLine ポイントを使用した PolyPolygonFS など、複数のアプローチがあります。しかし、私はそれらのどれも正しく動作させることができないようです。実際には、2 番目のアプローチは何もしません。そのため、最初のアプローチに固執します。そのため、線の描画を開始するたびに、点線の開始方法がランダムになるようです。したがって、それはピクセルか空のピクセルのどちらかです。したがって、レイヤーのサイズを変更すると、次の画像のように線が変形します。
実際、私が達成したいのはこれだけです:
そしてもちろん、レイヤーを歪ませずにサイズを変更するときに、線を再度描画したいと考えています (そのため、onPaint ハンドラー アプローチを使用しています)。(Bitmap.Canvasを使用して)レイヤーに単純な線を描画してからレイヤーのサイズを変更すると、jpegを引き伸ばすのと同じように線が歪むので、それを避けたいと思います。
そこでImgView32(TGraphics32)でレイヤー上に太い点線を引く方法を教えてください
編集
回答からコードを試した後、私はそれを機能させました。ただし、このレイヤーには副作用があります: (マウスを使用して) レイヤーのサイズを変更すると、幅によっては点線の色が薄暗くなり、以下のようにぼやけます:
リサイズ前 リサイズ
後(場合によっては)。
同じコードを使用して、これを自分で再現できます。
編集
この特別なレイヤーには別の問題があります。ファイルに保存することです... 2 つの方法を使用して透明な PNG として保存しようとしましたが、ファイルが破損し続けます。レイヤーをビットマップとして保存しようとしても、同じ破損が発生します。この質問もチェックしてください: