Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Bild formatunabhängig 90° drehen (https://www.delphipraxis.net/112640-bild-formatunabhaengig-90%B0-drehen.html)

Nils_13 24. Apr 2008 20:05


Bild formatunabhängig 90° drehen
 
Hi,

gibt es eine Möglichkeit, ein TPicture oder noch besser TCanvas um 90° zu drehen und das ganze ohne TBitmap ? Habe bisher nur bitmapbasierende Methoden gefunden, aber Bitmaps kommen bei mir nicht in Frage.

Corpsman 24. Apr 2008 20:31

Re: Bild formatunabhängig 90° drehen
 
Ist Umständlich, aber

mit Canvas.Pixels bekomst du jeden Wert.

Den kannst du in ein Array speichern ( Im Prionzip ist ein TBitmap, ja nichts anderes ) Dann Drehst dud as Array und kannst mit Canvas.pixels wieder zurückschreiben.

Das ganze hat nur den Hacken das Canvas.pixels eben unheimlich langsam arbeitet, weswegen alle Welt das mit TBitmap macht, denn da hat man Scanline

Nils_13 24. Apr 2008 20:38

Re: Bild formatunabhängig 90° drehen
 
Hm, ist bloß die Frage, ob es schneller ginge, erst ein beliebiges Format zu konvertieren um dann für einen kurzen Moment Scanline zu nehmen.

Corpsman 25. Apr 2008 12:59

Re: Bild formatunabhängig 90° drehen
 
Also wenn wir davon ausgehen das dein Bild 1 M Pixel ist dann auf alle Fälle Ja.

Canvas.Pixels ist wirklich Extrem Langsam.

Im Zweifel probiere es aus.

SirThornberry 25. Apr 2008 13:26

Re: Bild formatunabhängig 90° drehen
 
Mit PlgBlt kannst du ein Bild auf einer Canvas drehen.

Lossy eX 25. Apr 2008 14:07

Re: Bild formatunabhängig 90° drehen
 
Mal anders gefragt. Wieso kommen bei dir Bitmaps nicht in Frage? Denn die Methode zum Zeichnen auf einer Canvas benötigen im Hintergrund eigentlich irgendwo immer ein Bitmap. Bei geladenen JPEGs schmettert es aber bereits die Klasse ab. Also dort kann man das Canvas nur zum Lesen benutzen. Zum Zeichnen braucht man wieder ein Bitmap.

Nils_13 28. Apr 2008 20:53

Re: Bild formatunabhängig 90° drehen
 
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;

SirThornberry 29. Apr 2008 07:20

Re: Bild formatunabhängig 90° drehen
 
und mit der Nutzung von Scanline ist es wirklich schneller als mit PlgBlt? Kann ich fast nicht glauben.

Schwedenbitter 5. Sep 2008 00:03

Re: Bild formatunabhängig 90° drehen
 
Ich schreibe hier, weil der Thread noch relativ kurz und übersichtlich scheint:

Alle Drehalgorhytmen haben - wenn ich das richtig sehe - gemeinsam, dass sie die Pixel über Scanlines ansprechen, die wiederum aus mehrdimensionale Arrays zusammengesetz sind. Egal welchen Code ich mir hier ansehe, werden die Bilder vor dem Drehen unabhängig von ihrer bisherigen Bittiefe auf 24 oder gar 32 bit gesetzt. Das an sich ist ja auch OK und mir letztlich egal.

Wie bringe ich es fertig, das Bild hinterher wieder Schwarzweiß (pf1bit) zu machen?

Durch das Setzen des Pixelformats klappt es jedenfalls bei mir nicht. Das Bild bekommt dann immer einen Blaustich.

Schwedenbitter 2. Apr 2009 22:22

Re: Bild formatunabhängig 90° drehen
 
Hallo,

ich weiß, dass das Thema schon alt ist. Ich will aber kein neues aufmachen, weil die Frage im Thema den Nagel auf den Kopf trifft.Ich drehe meine Bilder jetzt mit dieser Procedure. Unabhängig von der Farbe nach dem Drehen habe ich noch eine Frage:

Wie drehe ich das Bild gegen den Uhrzeigersinn?

Gruß, Alex


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:18 Uhr.
Seite 1 von 2  1 2      

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