pf1bit的bmp黑白图像逆时针旋转该怎么实现呢?这样的bmp图1个字节8个像素,一般的scanline好像都只针对字节操作的,我只好按像素赋值,但速度太慢,有什么快速的办法吗?

解决方案 »

  1.   

    procedure Tform1.bmp_rotate(Srcbmp, DestBmp: Tbitmap; angle: extended);
    var
      c1x, c1y, c2x, c2y: integer;
      p1x, p1y, p2x, p2y: integer;
      radius, n: integer;
      alpha: extended;
      c0, c1, c2, c3: tcolor;
    begin
      if SrcBmp.Width > SrcBmp.Height then
      begin
        DestBmp.width := SrcBmp.Width;
        DestBmp.height := SrcBmp.Width;
      end
      else
        DestBmp.Width := SrcBmp.Height;
      DestBmp.Height := SrcBmp.Height;
      //将角度转换为PI值
      angle := (angle / 180) * pi;
      // 计算中心点,你可以修改它
      c1x := SrcBmp.width div 2;
      c1y := SrcBmp.height div 2;
      c2x := DestBmp.width div 2;
      c2y := DestBmp.height div 2;
      // 步骤数值number
      if c2x < c2y then
        n := c2y
      else
        n := c2x;
      dec(n, 1);
      // 开始旋转
      for p2x := 0 to n do
      begin
        for p2y := 0 to n do
        begin
          if p2x = 0 then
            alpha := pi / 2
          else
            alpha := arctan2(p2y, p2x);
          radius := round(sqrt((p2x * p2x) + (p2y * p2y)));
          p1x := round(radius * cos(angle + alpha));
          p1y := round(radius * sin(angle + alpha));      c0 := SrcBmp.canvas.pixels[c1x + p1x, c1y + p1y];
          c1 := SrcBmp.canvas.pixels[c1x - p1x, c1y - p1y];
          c2 := SrcBmp.canvas.pixels[c1x + p1y, c1y - p1x];
          c3 := SrcBmp.canvas.pixels[c1x - p1y, c1y + p1x];      DestBmp.Canvas.pixels[c2x + p2x, c2y + p2y] := c0;
          DestBmp.canvas.pixels[c2x - p2x, c2y - p2y] := c1;
          DestBmp.canvas.pixels[c2x + p2y, c2y - p2x] := c2;
          DestBmp.canvas.pixels[c2x - p2y, c2y + p2x] := c3;
        end;
        application.processmessages
      end;
    end;procedure TForm1.RotateangleClick(Sender: TObject);
    var
      newbmp: TBitmap;
      Bitmap: TBitmap;
      angle: integer;
    begin
      newbmp := TBitmap.Create;
      Bitmap := TBitmap.Create;
      screen.Cursor := crhourglass;
      newbmp.Assign(image1.Picture.Bitmap);
      //newbmp.pixelFormat:=pf8bit;
      //Bitmap.pixelFormat:=pf8bit;
      angle := strtoint(inputbox('旋转位图', '请输入旋转角度', '90'));
      Bmp_Rotate(newbmp, bitmap, angle);
      image1.picture.Bitmap.Assign(bitmap);
      image1.Left := (self.Width div 2) - (bitmap.Width div 2);
      image1.Top := (self.Height div 2) - (bitmap.Height div 2);
      screen.Cursor := crdefault;
      newbmp.Free;
      Bitmap.Free;
    end;
      

  2.   

    呵呵,要不你先将图转成pf8bit再旋转,这样就可按字节了。
      

  3.   

    scanline可以遍历横线,但竖线该怎么遍历呢?而且pf1bit是8个像素一个字节,scanline也用不了啊