이 기사에서는 이미지 및 텍스트 회전 특수 효과를 구현하기 위한 Delphi의 솔루션을 예제를 사용하여 설명합니다. 이 프로그램에서 사용되는 컨트롤은 주로 Panel 컨트롤, Image 컨트롤, Edit 컨트롤, Label 컨트롤 및 Button 컨트롤입니다. 이 프로그램의 핵심은 Delphi의 bmp_rotate() 함수를 사용하여 이미지 회전 기능을 구현하는 것입니다. 그리고 관련 Windows API 함수를 영리하게 호출하여 텍스트 회전 효과를 얻을 수 있습니다.
전체 예제 코드는 다음과 같습니다.
단위 Unit1;인터페이스 사용Windows, 메시지, SysUtils, 클래스, 그래픽, 컨트롤, 양식, 대화 상자, 수학, StdCtrls, ExtCtrls;typeTForm1 = class(TForm)Edit1: TEdit;Image1: TImage;bmprorate: TButton;Label1: TLabel;Panel1: TPanel ;이미지2: TImage;Panel2: TPanel;Image3: TImage;Edit2: TEdit;RotatedText: TButton;Label2: TLabel;프로시저 bmproteClick(Sender: TObject);프로시저 RotatedTextClick(Sender: TObject);프로시저 FormCreate(Sender: TObject);private{ Private 선언 }public{ 공개 선언 }절차 bmp_rotate(src,dst:Tbitmap;angle:extended);절차 DrawRotatedText(TheCanvas : TCanvas; TheAngle : Integer;TheText : String);end;varForm1: TForm1;implementation{$R *.DFM}절차 TForm1.bmp_rotate(src,dst:Tbitmap;angle:extended);//이미지 회전 varc1x,c1y,c2x,c2y:integer;p1x,p1y,p2x,p2y:integer;radius,n:integer;alpha:extended;c0 ,c1,c2,c3:tcolor;beginangle := (각도 / 180) * pi; //텍스트 상자의 내용을 각도로 변환합니다. c1x := src.Width div 2;c1y := src.Height div 2;c2x := dst.Width div 2;c2y := dst.Height div 2;if c2x < c2y then := c2yelsen := c2x;dec (n,1); //n을 만듭니다 값은 1만큼 감소합니다. n:=n-1for p2x := 0 to n do startfor p2y := 0 to n do startif p2x = 0 thenalpha:= pi/2elsealpha := arctan2(p2y,p2x);radius := round(sqrt ((p2x*p2x)+(p2y*p2y)));//회전 중 반경 설정 p1x := round(radius * cos(angle+alpha)); //회전 중 원 중심의 세로 좌표 설정 p1y := round(radius * sin(angle+alpha)) //회전 중 원 중심의 세로 좌표 설정 c0 := src.Canvas.pixels [c1x+p1x,c1y+p1y];//이미지의 관련 좌표에서 픽셀 c1을 교체합니다.= src.Canvas.pixels[c1x-p1x,c1y-p1y];c2 := src.Canvas.pixels[c1x+p1y,c1y-p1x];c3 := src.Canvas.pixels[c1x-p1y,c1y+p1x];dst.Canvas.pixels[c2x+p2x,c2y+p2y]:=c0; //다른 위치의 픽셀 교체 dst.Canvas.pixels[c2x-p2x,c2y-p2y]:=c1;dst.Canvas.pixels[c2x+p2y,c2y-p2x]:=c2;dst.Canvas.pixels[ c2x -p2y,c2y+p2x]:=c3;end;application.processmessages //다른 메시지 요청에 응답end;end;procedure TForm1.bmproteClick(Sender: TObject);VarRANgle : Extended;beginRANgle := StrToFloat(Edit1.Text); //회전 각도 설정 bmp_rotate(Image1.Picture.bitmap,Image2) .Picture.bitmap, RANgle);//회전 기능 실행 및 그래픽 회전end;절차 TForm1.DrawRotatedText(TheCanvas : TCanvas; TheAngle : Integer;TheText : String);varlf : TLogFont;tf : TFont;beginImage3.Canvas.refresh;with TheCanvas do startFont.Name:='Arial';Font.Size:=18; 브러시.스타일:= bsClear;tf:= TFont.Create;trytf.Assign(Font);GetObject(tf.Handle, Sizeof(lf), @lf); //tf Font 객체에 현재 인스턴스 핸들 할당 lf.lfEscapement:=TheAngle*10;lf.lfOrientation := TheAngle * 10; //입력 위치의 가로선과 수평선을 지정된 각도로 만듭니다. tf.Handle := CreateFontIndirect(lf); //글꼴 관련 객체 생성 Font.Assign(tf); //이 객체를 프로그램에 사용 finallytf.Free; //객체 해제 end;TextOut(Image3.left, Image3.top+20, TheText); 지정된 영역에 텍스트 그리기end;end;procedure TForm1.RotatedTextClick(Sender: TObject);VarTheAngle : Integer;beginTheAngle := StrToInt(Edit2.Text); //텍스트 상자의 텍스트를 각도로 변환합니다. DrawRotatedText(Image3.Canvas, TheAngle, 'Delphi Graphics Studio') //회전된 텍스트 함수 호출 end; ) ;vartf : TFont;theText:string;begintheText:='Delphi Graphics Studio' //텍스트 설정 Image3.Canvas dobeginFont.Name := 'Arial'; //글꼴 크기 설정 Font.Size := 18; //글꼴 크기 설정 Brush.Style := bsClear; //브러쉬 스타일 설정 tf:= TFont.Create; // 글꼴 관련 개체를 만듭니다. TextOut(Image3.left, Image3.top+20, TheText) //지정된 영역에 텍스트를 그립니다.end;end;end.