4

ビットマップのピクセルを移動/シフトしたい場合、どうすればできますか?

procedure MovePixels(Bitmap: TBitmap; Horizontal, Vertical: Integer);
begin
  { move the Bitmap pixels to new position }
end;

例:

ここに画像の説明を入力

たとえば、呼び出すと MovePixels(Image1.Picture.Bitmap, 20, 20) 、次のように出力されます。

ここに画像の説明を入力

ピクセルを移動した後に表示されるキャンバスの色も指定/変更すると便利です。したがって、この例では、灰色/茶色の色が青などになる可能性があります.

Bitmap.Canvas.Pixelsとプロパティがあることに気付きました。これはBitmap.Canvas.MoveTo、これを行うために必要なものですか?

私は本当に知らないし、それはとても簡単だと思います..

4

1 に答える 1

11

ピクセルを簡単に移動することはできませんが、コピーを作成することはできます。

var
  Source, Dest: TRect;
....
Source := Rect(0, 0, Bitmap.Width, Bitmap.Height);
Dest := Source;
Dest.Offset(X, Y);
Bitmap.Canvas.CopyRect(Dest, Bitmap.Canvas, Source);

残っているのは、選択した色でスペースを埋めることです。これは、 を数回呼び出すだけで十分に簡単に実行できると確信していますFillRect

ただし、これをその場で試みない方が簡単だと思います。代わりに、新しいビットマップを作成します。おそらく次のようになります。

function CreateMovedImage(Bitmap: TBitmap; X, Y: Integer; BackColor: TColor): TBitmap;
var
  Source, Dest: TRect;
begin
  Source := Rect(0, 0, Bitmap.Width, Bitmap.Height);
  Dest := Source;
  Dest.Offset(X, Y);

  Result := TBitmap.Create;
  Try
    Result.SetSize(Bitmap.Width, Bitmap.Height);

    Result.Canvas.Brush.Style := bsSolid;
    Result.Canvas.Brush.Color := BackColor;
    Result.Canvas.FillRect(Source);

    Result.Canvas.CopyRect(Dest, Bitmap.Canvas, Source);
  Except
    Result.Free;
    raise;
  End;
end;
于 2012-05-08T13:06:18.243 に答える