Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Wie Bitmaps in 90-Grad-Schritten drehen? (https://www.delphipraxis.net/64385-wie-bitmaps-90-grad-schritten-drehen.html)

rory 2. Mär 2006 23:18


Wie Bitmaps in 90-Grad-Schritten drehen?
 
Die Bitmaps sind *immer* quadratisch (nämlich Icons, die als Bitmaps eingelesen wurden).

Wie dreht man die Dinger mit ein paar Zeilen (um jeweils 90 Grad) oder einer Funktion?

mfg
Rory

ichbins 2. Mär 2006 23:44

Re: Wie Bitmaps in 90-Grad-Schritten drehen?
 
such einfach in der codelib: drehendrehen mist schein nichts zu finden... :wall: dann kuckst du mal bei den Schweizern: www.swissdelphicenteer.com

SirThornberry 2. Mär 2006 23:46

Re: Wie Bitmaps in 90-Grad-Schritten drehen?
 
bei bildern allgemein wäre das prinzip eine horizontale linie lesen und vertical schreiben, dann die nächste horizonale linie lesen und vertical schreiben. Also eigentlich ganz simpel.

Hier das ganze mal als source (naja, paar zeilen sinds nicht nur aber es funzt)
Delphi-Quellcode:
procedure Rotate(ABmp: TBitmap);
var LBmp: TBitmap;
    LCountX,
    LCountY : Integer;
    LPixDst,
    LPixSrc : PRGBTriple;
    LDif   : Cardinal;
begin
  ABmp.PixelFormat := pf24bit;
  LBmp := TBitmap.Create;
  LBmp.PixelFormat := pf24bit;
  LBmp.Width := ABmp.Height;
  LBmp.Height := ABmp.Width;

  if LBmp.Height > 1 then
    LDif := Cardinal(LBmp.ScanLine[1]) - Cardinal(LBmp.ScanLine[0])
  else
    LDif := 0;
  for LCountY := 0 to ABmp.Height - 1 do
  begin
    LPixSrc := ABmp.ScanLine[LCountY];
    LPixDst := Pointer(Cardinal(LBmp.ScanLine[0]) + Cardinal(LCountY) * SizeOf(TRGBTriple));
    for LCountX := 0 to ABmp.Width - 1 do
    begin
      LPixDst^ := LPixSrc^;
      LPixSrc := Pointer(Cardinal(LPixSrc) + SizeOf(TRGBTriple));
      LPixDst := Pointer(Cardinal(LPixDst) + LDif);
    end;
  end;
  ABmp.Assign(LBmp);
  LBmp.Free;
end;

rory 3. Mär 2006 00:20

Re: Wie Bitmaps in 90-Grad-Schritten drehen?
 
Danke für die Hinweise.

@ichbins: Auf "www.swissdelphicenteer.com" fehlt mir die "Suchen"-Funktion auf der Homepage. Wie soll ich da was finden?

@Sir Thornberry: So etwa dachte ich mir das auch, hoffte jedoch, das das Delphi schon bereits kann (aber ich bislang noch nicht wusste wie es geht) :-(

mfg

SirThornberry 3. Mär 2006 00:32

Re: Wie Bitmaps in 90-Grad-Schritten drehen?
 
naja, es gibt eine api funktion die bilder drehen kann. (auch in beliebigem winkel, du musst nur wissen wo die zielpunkte liegen)

Hier mal ein Beispiel unter Nutzung der Api-Funktion. Ich hab mal den Teil in Kommentare gesetzt welchen du brauchst für die quadratichen Bilder (der andere ist irrelevant und dient zur Höhen/Breiten-Anderung)
Delphi-Quellcode:
procedure Rotate(ABmp: TBitmap);
var LPoints : array[0..2] of TPoint;
    LOldSize: TPoint;
begin
  LOldSize := Point(ABmp.Width, ABmp.Height);
  if ABmp.Width > ABmp.Height then
    ABmp.Height := ABmp.Width
  else
    ABmp.Width := ABmp.Height;

  //Bei quadratichen Bildern ab hier
  LPoints[0] := Point(ABmp.Height, 0);
  LPoints[1] := Point(ABmp.Height, ABmp.Width);
  LPoints[2] := Point(0, 0);
  PlgBlt(ABmp.Canvas.Handle, LPoints, ABmp.Canvas.Handle, 0, 0, ABmp.Width, ABmp.Height, 0, 0, 0);
  //Bei quadratichen Bildern bis hier

  ABmp.Width := LOldSize.Y;
  ABmp.Height := LOldSize.X;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz