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;