delphi中,怎么将位图90°旋转

delphi中,如何将位图90°旋转?
如何将位图16X16的单色 


在delphi中旋转为



------解决方案--------------------
Delphi(Pascal) code

//基于GDI的方法
procedure Rotate90(Bitmap: TBitmap);// 顺时针
var
  aStream: TMemorystream;
  header: TBITMAPINFO;
  dc: hDC;
  P: ^THelpRGB;
  x, y, b, h: Integer;
  RowOut: pRGBArray;
begin
  aStream := TMemoryStream.Create;
  //设置大小,必须是4的倍数
  aStream.SetSize(Bitmap.Height * Bitmap.Width * 4);
  with header.bmiHeader do 
  begin
    biSize := SizeOf(TBITMAPINFOHEADER);
     biWidth := Bitmap.Width; 
     biHeight := Bitmap.Height; 
     biPlanes := 1;
    biBitCount := 32;
     biCompression := 0;
    biSizeimage := aStream.Size;
    biXPelsPerMeter := 1; 
     biYPelsPerMeter := 1; 
     biClrUsed := 0;
    biClrImportant := 0;
  end;
  dc := GetDC(0);
  P := aStream.Memory;
  GetDIBits(dc, Bitmap.Handle, 0, Bitmap.Height, P, header, dib_RGB_Colors);
  ReleaseDC(0, dc);
  b := bitmap.Height; 
  h := bitmap.Width; 
  bitmap.Width := b;
  bitmap.height := h;
  for y := 0 to (h - 1) do
  begin
    rowOut := Bitmap.ScanLine[y];
    P := aStream.Memory; 
    inc(p, y); 
    for x := 0 to (b - 1) do
    begin
      rowout[x] := p^.rgb;
      inc(p, h);
    end;
  end;
  aStream.Free; 
end;
//调用注意,会改变原来的图像
Rotate90(Image.picture.bitmap);

基于GDI+的方法:

procedure RotalBmp(FAngle: Integer);
 var Bmp : TGpBitmap;
     gp : TGpGraphics;
     M : TGpMatrix;
begin
  Bmp := TGpBitmap.Create('a.JPG');
  try
    Gr := GpRect(0,0,Bmp.Width,Bmp.Height);
    gp := TGpGraphics.Create(pb1.Canvas.Handle);
    M := TGpMatrix.Create;
    Center.X := pb1.Width div 2;
    Center.Y := pb1.Height div 2;
    M.RotateAt(FAngle,Center);//FAngle为角度
    gp.SetTransform(M);
    gp.DrawImage(Bmp,Gr);
  finally
    gp.Free;
    Bmp.Free;
    m.Free;
  end;
end;