AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Bild formatunabhängig 90° drehen

Ein Thema von Nils_13 · begonnen am 24. Apr 2008 · letzter Beitrag vom 4. Mai 2009
 
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#7

Re: Bild formatunabhängig 90° drehen

  Alt 28. Apr 2008, 20:53
Die Lösung ist simpel, man muss aber erstmal drauf kommen. Man zeichnet sich die JPG/PNG/... auf ein TBitmap. Dann kann man mit Hilfe dieses Bitmaps machen was man will, sogar zum Schluss ein TPicture/TGraphic zurückgeben. Diese Funktion lag schon seit langem in fehlerhafter Form auf meiner Platte, sie ist also nur in geringer Form von mir, da sie vorher schon funktionierte. Sie hatte allerdings ein paar Fehler bzw. es fehlten für meine Verwendungszwecke noch Sachen. Die Sache mit dem TPicture als Rückgabewert und dass es überhaupt eine Funktion ist (war vorher eine Prozedur) stammen zum Beispiel von mir. Die Funktion ist auf jeden Fall schnell genug und konvertieren muss man in dem Sinne schon, allerdings unabhängig vom Dateiformat, solange dieses von Delphi unterstützt wird. Der Vorschlag es zu konvertieren kam von eurer Seite schon, allerdings verstand ich ihn etwas falsch, weil ich sofort ein die Funktion JPGtoBMP dachte, die irgendwo in meinen Units noch vor sich hin gammelt. Dann auf jeden Fall ein großes Danke, denn eure Vorschläge waren allesamt gut und ich hätte es auch schnell alles umsetzen können, hätte ich euch sofort verstanden.
Delphi-Quellcode:
type
  TRGBQuad = packed record
    B, G, R, A : Byte;
  end;
  PRGBQuad =^TRGBQuad;
  TRGBarray = Array[0..0] of TRGBQuad;

function Rotate90(const Source : TGraphic) : TPicture;
var P : PRGBQuad;
    Y, X, H, W : Integer;
    RowOut : ^TRGBarray;
    SrcBmp : TBitmap;
begin
  SrcBmp := TBitmap.Create;
  with SrcBmp do
  begin
    PixelFormat := pf32bit;
    Height := Source.Height;
    Width := Source.Width;
    Canvas.Draw(0, 0, Source);
  end;

  if Result <> nil then
    Result := TPicture.Create;
  Result.Bitmap.PixelFormat := pf32bit;
  W := SrcBmp.Height;
  H := SrcBmp.Width;
  Result.Bitmap.Height := H;
  Result.Bitmap.Width := W;
  for Y := 0 to Pred(H) do
  begin
    RowOut := Result.Bitmap.ScanLine[Y];
    P := SrcBmp.ScanLine[Pred(SrcBmp.Height)];
    inc(P, Y);
    for X := 0 to Pred(W) do
    begin
      RowOut[X] := P^;
      inc(P, H);
    end;
  end;
  SrcBmp.Free;
end;
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:30 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