5

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 として保存しようとしましたが、ファイルが破損し続けます。レイヤーをビットマップとして保存しようとしても、同じ破損が発生します。この質問もチェックしてください:

Graphics32 - 透過描画レイヤーをpngに保存

4

2 に答える 2

3

各行の間に点描カウンターをリセットする必要があります。それ以外の場合、各行は前に中断したパターンを続行します。

Buffer.StippleCounter := 0;
Buffer.MoveToF(Cx-2,Top);
Buffer.LineToFSP(Cx-2 , Bottom);

Buffer.StippleCounter := 0;
Buffer.MoveToF(Cx-1,Top);
Buffer.LineToFSP(Cx-1 , Bottom);
...etc...

パターンがどのように設定されているかを示していませんが、例から判断すると、そこにも問題がある可能性があります。私は(今)次のようにします:

Buffer.SetStipple([clBlack32, clBlack32, clBlack32, clBlack32, clBlack32,
  clWhite32, clWhite32, clWhite32, clWhite32, clWhite32]); // Alternating black and white, 5 pixels each
于 2015-04-17T06:37:37.800 に答える