首页 > 其他 > 详细

Timage 旋转

时间:2016-01-18 12:16:17      阅读:186      评论:0      收藏:0      [点我收藏+]

wiShow: TWeaveImage;

procedure TFBMPBrowser.N1Click(Sender: TObject); //水平翻轉
begin
  wiShow.Picture.Bitmap.PixelFormat := pf24bit;
  wiShow.Picture.Bitmap :=
    GraphicMirror(wiShow.Picture.Bitmap, mtHorizontal);
end;

 

function Rotate270(const Bitmap: TBitmap): TBitmap;
var
  aStream: TMemoryStream;
  header: TBITMAPINFO;
  dc: hDC;
  P: ^THelpRGB;
  x, y, b, h: Integer;
  RowOut: pRGBArray;
begin
  Result := TBitmap.Create;

  Result := Bitmap;

  //創建內存流
  aStream := TMemoryStream.Create;
  try
    //設置大小,必須是4的倍數
    aStream.SetSize(Result.Height * Result.Width * 4);
    with header.bmiHeader do //操作位圖文件
    begin
      biSize := SizeOf(TBITMAPINFOHEADER); //設置文件頭的大小
      biWidth := Result.Width; //位圖寬
      biHeight := Result.Height; //位圖高
      biPlanes := 1;
      biBitCount := 32; //設置圖形的類型為32位
      biCompression := 0;
      biSizeimage := aStream.Size; //設置圖形的大小,也可以為0
      biXPelsPerMeter := 1; //水平分辨率
      biYPelsPerMeter := 1; //豎直分辨率
      biClrUsed := 0;
      biClrImportant := 0;
    end;
    //拷貝Result的圖像數據到內存流aStream中,注意此時的內存流中數據保存的數據順序
    dc := GetDC(0);
    P := aStream.Memory;
    GetDIBits(dc, Result.Handle, 0, Result.Height, P, header, dib_RGB_Colors);
    ReleaseDC(0, dc);
    //aStream.SaveToFile(‘E:\abc.bin‘);
    b := Result.Height; //源圖高
    h := Result.Width; //源圖寬
    //指定要創建的位圖的大小尺寸
    Result.Width := b;
    Result.height := h;
    for y := 0 to (h - 1) do
    begin
      rowOut := Result.ScanLine[(h - 1) - y]; //獲取新的位圖信息
      P := aStream.Memory; //設置文件指針
      inc(P, y); //指針移位
      for x := (b - 1) downto 0 do
      begin
        rowOut[x] := P^.rgb; //進行數據轉移
        inc(P, h);
      end;
    end;
  finally
    aStream.Free; //釋放資源
  end;
end;

 

Timage 旋转

原文:http://www.cnblogs.com/sunnycnblogs/p/5138603.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!