Einzelnen Beitrag anzeigen

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