0

現在、RotateBitmap ルーチンにミラーリングを追加しようとしています ( http://www.efg2.com/Lab/ImageProcessing/RotateScanline.htmから)。これは現在、疑似コードで次のようになっています (BitMapRotated は TBitmap です)。

var
  RowRotatedQ: pRGBquadArray; //4 bytes

if must reflect then
begin
  for each j do
  begin
    RowRotatedQ := BitmapRotated.Scanline[j];
    manipulate RowRotatedQ
  end;
end;

if must rotate then
begin
  BitmapRotated.SetSize(NewWidth, NewHeight); //resize it for rotation
  ...
end;

これは、回転または反射する必要がある場合に機能します。両方を行うと、呼び出しSetSizeにより、ScanLine を介した以前の変更が無効になるようです。変更を「フラッシュ」または保存するにはどうすればよいですか? を呼び出して設定しようとしましたがBitmapRotated.Handle、うまくいきませんでした。BitmapRotated.DormantBitmapRotated.Canvas.Pixels[0, 0]

編集:本当の問題を見つけました- 元のビットマップの値で変更を上書きしています。申し訳ありません。

4

1 に答える 1

1

おそらくこれは本当の答えではありませんが、このコードは D2006 と XE3 の両方で機能し、期待どおりの結果が得られます。何も「フラッシュ」する必要はありません。

ここに画像の説明を入力

  procedure RotateBitmap(const BitMapRotated: TBitmap);
  type
    PRGBQuadArray = ^TRGBQuadArray;
    TRGBQuadArray = array [Byte] of TRGBQuad;
  var
    RowRotatedQ: PRGBQuadArray;
    t: TRGBQuad;
    ix, iy: Integer;
  begin
    //first step
    for iy := 0 to BitMapRotated.Height - 1 do begin
      RowRotatedQ := BitMapRotated.Scanline[iy];
     // make vertical mirror
      for ix := 0 to BitMapRotated.Width div 2 - 1 do begin
        t := RowRotatedQ[ix];
        RowRotatedQ[ix] := RowRotatedQ[BitMapRotated.Width - ix - 1];
        RowRotatedQ[BitMapRotated.Width - ix - 1] := t;
      end;
    end;

    //second step
    BitMapRotated.SetSize(BitMapRotated.Width  + 50, BitMapRotated.Height + 50);
    //some coloring instead of rotation
    for iy := 0 to BitMapRotated.Height div 10 do begin
      RowRotatedQ := BitMapRotated.Scanline[iy];
      for ix := 0 to BitMapRotated.Width - 1 do
        RowRotatedQ[ix].rgbRed := 0;
    end;
  end;

var
  a, b: TBitmap;
begin
  a := TBitmap.Create;
  a.PixelFormat := pf32bit;
  a.SetSize(100, 100);
  a.Canvas.Brush.Color := clRed;
  a.Canvas.FillRect(Rect(0, 0, 50, 50));
  b := TBitmap.Create;
  b.Assign(a);
  RotateBitmap(b);
  Canvas.Draw(0, 0, a);
  Canvas.Draw(110, 0, b);
于 2013-06-28T12:03:56.423 に答える