Autor Beitrag
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Mo 04.12.06 19:43 
TGraphic drehen

Der Folgende Code ist auf dem Code zum Drehen von Bitmaps von Finn-Ole Paulsen aufgebaut.

Mit diesem Code können Inhalte aus Images um 90 Grad gedreht werden. Um das zu ermöglichen, muss der Inhalt von TGraphic mittels einem Hilfsbitmap ("Sourcebmp" = Quellbmp) und dessen Routine Canvas.Draw gezeichnet. Da wir jetzt das Bild auf einem Bitmap haben, können wir es mit dem Code von Finn-Ole Paulsen drehen.

Dazu müssen wir einen Typ definieren:

ausblenden Delphi-Quelltext
1:
type TRGBarray = array[0..0of TRGBQuad;					


Der Code ist nun diese Procedure. Man muss ihr ein TGraphic Objekt und ein Bitmap in das gedreht werden soll übergeben werden. Für die restliche Erklärung der Procedure bitte den Code von Finn-Ole Paulsen ansehen.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
//Paramter:
//  Source: Die Graphic, die gedreht werden soll. Da TBitmap von TGraphic abgeleitet ist, kann hier z.B. auch ein Bitmap übergeben werden
//  Target: Das Bitmap, welches die gedrehte Graphic enthält. WICHTIG: Das Bitmap muss vor Aufruf erstellt worden sein.
procedure rotate90(const Source:TGraphic ; Target: TBitmap);
var P: PRGBQuad;
    y,x,h,b: integer;
    Rowout: ^TRGBarray;
    sourcebmp: TBitmap;
begin
  sourcebmp:=TBitmap.Create;
  sourcebmp.PixelFormat:=pf32bit;
  sourcebmp.Height:=Source.Height;
  sourcebmp.Width:=Source.Width;
  sourcebmp.Canvas.Draw(0,0,Source);
  try
    Target.PixelFormat:=pf32bit;
    b:=sourcebmp.Height;
    h:=sourcebmp.Width;
    Target.Height:=h;
    Target.Width:=b;
    for y:=0 to (h-1do begin
      rowout:=Target.ScanLine[y];
      p:=sourcebmp.ScanLine[sourcebmp.height-1];
      inc(p,y);
      for x:=0 to (b-1do begin
        rowout[x]:=p^;
        inc(p,h);
      end;
    end;
  finally
    sourcebmp.Free;
  end;
end;


Ein Beispielaufruf könnte so aussehen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.Button1Click(Sender: TObject);
var Bitmap:TBitmap;
begin
  Bitmap:=TBitmap.Create;
  try
    rotate90(Image1.Picture.Graphic,Bitmap);
    Image1.Picture.Graphic.Assign(Bitmap);
    Image1.Refresh;
  finally
    Bitmap.Free;
  end;
end;


lg el

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.


Zuletzt bearbeitet von elundril am Di 13.03.07 21:38, insgesamt 7-mal bearbeitet