delphi 處理圖片(剪切,壓縮)


剪切bmp:效果為指定的rect大小,若圖片比rect小,則會放大。

都要uses Vcl.Imaging.jpeg;

需要注意的是FMX里也需要jpeg的支持,雖然沒引用編譯器不會報錯,但用到jpg時會報內存錯誤。

procedure TForm1.Button1Click(Sender: TObject);
var
	Bitmap: TBitmap;
	MyRect1, MyOther: TRect;
begin
	if self.OpenDialog1.Execute then
	begin
		MyRect1 := Rect(100, 100, 500, 500);
		MyOther := Rect(100, 100, 500, 500);
		Bitmap := TBitmap.Create;
		Bitmap.LoadFromFile(self.OpenDialog1.FileName); // bmp圖片    也可以把jpg圖片轉換成bmp圖片
		self.Canvas.CopyRect(MyOther, Bitmap.Canvas, MyRect1); // 顯示在窗體上   這個在VCL上可以,在FMX里沒有這個屬性
		Bitmap.Free;
	end;
end;

 縮小jpg圖片,效果: 圖片為rect大小,若圖片大於rect,則會按比例縮小成rect大小。

procedure TForm1.Button2Click(Sender: TObject);
var
	bitCut: TBitmap;
	bitEdit: TBitmap;
	picOriginal: TPicture;
begin
	picOriginal := TPicture.Create;
	if self.OpenDialog1.Execute then
	begin
		picOriginal.LoadFromFile(OpenDialog1.FileName); //fileName為jpg文件路徑
		bitCut := TBitmap.Create;
		bitCut.Width  := 200;
		bitCut.Height := 200;
		bitCut.Canvas.StretchDraw(Rect(0, 0, bitCut.Width, bitCut.Height), picOriginal.Graphic);

		bitEdit := TBitmap.Create;
		bitEdit.Width := picOriginal.Width;
          // FMX里沒有這個屬性,要么把引用的FMX.Graphics換成VCL的
		bitCut.Canvas.CopyRect(Rect(0, 0, bitCut.Width, bitCut.Height), bitEdit.Canvas, Rect(0, 0, 200, 20));
		bitcut.SaveToFile('d:/dd.jpg');
		Image1.Picture.Bitmap.Assign(bitCut);
		// 該釋放的對象要釋放
		bitEdit.Free;
		bitCut.Free;
		picOriginal.Free;
	end;
end;

 裁剪圖片上一部分的rect:

procedure TForm1.Button3Click(Sender: TObject);
var
	bmp: TBitmap;
	jpg: TJpegImage;
	MyRect, MyOther: TRect;
	img: TImage;
begin
	jpg := TJpegImage.Create;
	bmp := TBitmap.Create;
	if OpenDialog1.Execute then
	begin
		jpg.LoadFromFile(OpenDialog1.FileName);
		bmp.Assign(jpg);       									// 把jpg的圖片資源放在bmp內
		MyRect := Rect(0, 0, 200, 200);
		MyOther:= Rect(0, 0, 200, 200);
		SetStretchBltMode(bmp.Canvas.Handle, COLORONCOLOR);  // 這個函數 uses Winapi.Windows;
		Self.Canvas.CopyRect(MyOther, bmp.Canvas, MyRect);        // 將一個圖片復制到另一個rect上
	end;
	FreeAndNil(bmp);
	FreeAndNil(jpg);
end;

 這些這VCL里都可以實現,在FMX里就需要變引用文件,但是用起來也不是那么方便,

在FMX里這樣用,delphi自帶的FMX.Graphics中有處理圖片的函數,具體查看幫助手冊:

這里貼出畫圖片的功能:

procedure TForm2.Button1Click(Sender: TObject);
var
	MyBitmap: TBitmap;
	MyRect: TRectF;
begin
	if OpenDialog1.Execute then 
	  MyBitmap := TBitmap.CreateFromFile(OpenDialog1.Files[0]);
	MyRect := TRectF.Create(10,12,301,203);
	Image1.Bitmap.Canvas.BeginScene;
	Image1.Bitmap.Canvas.DrawBitmap(MyBitmap, MyRect, MyRect, 20);  // 這個DrawBitmap  Image中必須有圖片,為空畫不上去。。。可能是我方法不對
	Image1.Bitmap.Canvas.EndScene;
end;

從本地一張圖片中復制一個rect再保存到本地

function CopyImgRect(f0, f1: String; x, y, w, h: Integer): Boolean; 
// f0磁盤圖片路徑名,f1保存的文件名,x,y,w,h表示給定的矩形框范圍值
var
  b0,b1: TBitmap;
begin
  result:=True;

  b0:=TBitmap.Create;
  b1:=TBitmap.Create;

  b0.LoadFromFile(f0);
  b1.Width:=w;
  b1.Height:=h;
  b1.CopyFromBitmap(b0,rect(x,y,w,h),0,0);  // 從bitmap中復制bitmap
  b1.SaveToFile(f1);                        // 保存到本地

  b0.Free;
  b1.Free;
end;    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM