ImgView32のレイヤーに縦の点線の太い線を描きたいだけです。Canvas.Pen.Width は LineTo メソッドに影響を与えないため、線を太くしたいので、複数の線を互いに近づけて描画します。したがって、私のコードは次のとおりです。
procedure TMainForm.PaintDottedHandler(Sender: TObject;Buffer: TBitmap32);
var
Cx, Cy,raza: Single;
W2, H2: Single;
I,J: Integer;
points:TArrayOfFloatPoint;
Center, Radius:TFloatPoint;
const
CScale = 1 / 200;
begin
if Sender is TPositionedLayer then
with TPositionedLayer(Sender).GetAdjustedLocation do
begin
W2 := (Right - Left) * 0.5;
H2 := (Bottom - Top) * 0.5;
Cx := Left + W2;
Cy := Top + H2;
W2 := W2 * CScale;
H2 := H2 * CScale;
Buffer.PenColor := clRed32;
Buffer.MoveToF(Cx-2,Top);
Buffer.LineToFSP(Cx-2 , Bottom);
Buffer.MoveToF(Cx-1,Top);
Buffer.LineToFSP(Cx-1 , Bottom);
Buffer.MoveToF(Cx,Top);
Buffer.LineToFSP(Cx , Bottom);
Buffer.MoveToF(Cx+1,Top);
Buffer.LineToFSP(Cx+1 , Bottom);
Buffer.MoveToF(Cx+2,Top);
Buffer.LineToFSP(Cx+2 , Bottom);
end;
end;
したがって、線は新しいレイヤーの中央に配置することを意図しています。これを使用してレイヤーを追加します。
procedure TMainForm.DottedLine1Click(Sender: TObject);
var
L: TPositionedLayer;
begin
L := CreatePositionedLayer;
L.OnPaint := PaintDottedHandler;
L.Tag := 2;
Selection := L;
end;
残りのコードについては、私のコードをレイヤーの例に追加するだけで、問題を再現できます。
私が読んだ限りでは、点線を描画するには、LineToFSP (私のコードで使用) を使用した Stipple や BuildDashedLine ポイントを使用した PolyPolygonFS など、複数のアプローチがあります。しかし、私はそれらのどれも正しく動作させることができないようです。実際には、2 番目のアプローチは何もしません。そのため、最初のアプローチに固執します。そのため、線の描画を開始するたびに、点線の開始方法がランダムになるようです。したがって、それはピクセルか空のピクセルのどちらかです。したがって、レイヤーのサイズを変更すると、次の画像のように線が変形します。
実際、私が達成したいのはこれだけです:
そしてもちろん、レイヤーを歪ませずにサイズを変更するときに、線を再度描画したいと考えています (そのため、onPaint ハンドラー アプローチを使用しています)。(Bitmap.Canvasを使用して)レイヤーに単純な線を描画してからレイヤーのサイズを変更すると、jpegを引き伸ばすのと同じように線が歪むので、それを避けたいと思います。
そこでImgView32(TGraphics32)でレイヤー上に太い点線を引く方法を教えてください
編集
回答からコードを試した後、私はそれを機能させました。ただし、このレイヤーには副作用があります: (マウスを使用して) レイヤーのサイズを変更すると、幅によっては点線の色が薄暗くなり、以下のようにぼやけます:
リサイズ前 リサイズ
後(場合によっては)。
同じコードを使用して、これを自分で再現できます。
編集
この特別なレイヤーには別の問題があります。ファイルに保存することです... 2 つの方法を使用して透明な PNG として保存しようとしましたが、ファイルが破損し続けます。レイヤーをビットマップとして保存しようとしても、同じ破損が発生します。この質問もチェックしてください: