Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Fehler beim Drehen eines Bildes (https://www.delphipraxis.net/11535-fehler-beim-drehen-eines-bildes.html)

Hazardos 8. Nov 2003 17:53


Fehler beim Drehen eines Bildes
 
Hallo!!

Ich möchte ein Bild drehen, habe auch schon ne Procedure, aber ich sehe kein Ergebnis. Stattdessen bleibt das vorherige BIld wie es war in der TImage Komponente und wenn man mit einem anderen Fenster rüberfährt ist plötzlich nichts mehr zu sehen. Ich hatte die Selbe Procedure auch in einem anderen Programm verbaut, da funktioniert sie einwandfrei, deshalb kann ich mir nicht erklären, warum das bei mir nicht so ist. Bitte um jede Hilfe!!

scp 8. Nov 2003 19:00

Re: Fehler beim Drehen eines Bildes
 
Hast du auch ein Code-Beispiel? Wenn es zu lang ist, kannst dus ja als Datei anhängen.

Hazardos 8. Nov 2003 19:44

Re: Fehler beim Drehen eines Bildes
 
Declaration
Delphi-Quellcode:
type
TRGBArray   = ARRAY[0..0] OF TRGBTriple;
pRGBArray   = ^TRGBArray;
THelpRGB = packed record
rgb   : TRGBTriple;
dummy : byte;
end;
die Procedure :
Delphi-Quellcode:
procedure Drehen(Bitmap:TBitmap);
var P      : PRGBQuad; //^THelpRGB;
    x,y,b,h : Integer;
    RowOut : ^TMyHelp;
    help   : TBitmap;
begin
   Bitmap.pixelformat := pf32bit;
   help := TBitmap.Create;
   help.PixelFormat := pf32bit;
   b := bitmap.Height;
   h := bitmap.Width;
   help.Width := b;
   help.height := h;
   for y := 0 to (h-1) do begin
     rowOut := help.ScanLine[y];
     P := Bitmap.scanline[bitmap.height-1];
     inc(p,y);
     for x := 0 to (b-1) do begin
        rowout[x] := p^;
        inc(p,h);
     end;
   end;
   bitmap.Assign(help);
end;
aber vielleicht gibt es ja auch ne andere Möglichkeit, das Bild zu drehen.

Keldorn 8. Nov 2003 21:28

Re: Fehler beim Drehen eines Bildes
 
Hallo diese Procedure ist aus nem DoKo- buch oder?
sie ist nicht sauber (Bereichsprüfung muß deaktiviert sein) aber ise geht. wie sieht denn dein Aufruf aus? bei DokO ist auch ein Beipsiel mit dabei
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin
  image1.Picture.bitmap.PixelFormat := pf24bit;
  Drehen90Grad(image1.picture.bitmap);
end;
Mfg Frank

Hazardos 8. Nov 2003 22:13

Re: Fehler beim Drehen eines Bildes
 
Die Procedure hab ich aus einem Buch, welches wir in der Schule bekommen haben. Der Aufruf sieht genauseo aus, wie du ihn beschriben hast, nur funktioniert es nicht. Vielleicht hast du ja noch eine andere Lösung für das Problem. Wenn ja, kannst du sie bitte hiuer reinstellen??

mfg Hazardos

scp 9. Nov 2003 00:05

Re: Fehler beim Drehen eines Bildes
 
So gehts (bei mir):

Delphi-Quellcode:
procedure Drehen90Grad(Bitmap:TBitmap);
var P      : PRGBQuad;
    x,y,b,h : Integer;
    RowOut : PRGBQuad; // <-- Hier Typ geändert
    help   : TBitmap;
begin
   Bitmap.pixelformat := pf32bit;
   help := TBitmap.Create;
   help.PixelFormat := pf32bit;
   b := bitmap.Height;
   h := bitmap.Width;
   help.Width := b;
   help.height := h;
   for y := 0 to (h-1) do begin
     rowOut := help.ScanLine[y];
     P := Bitmap.scanline[bitmap.height-1];
     inc(p,y);
     for x := 0 to (b-1) do begin
        rowout^ := p^; // <-- Und hier geändert
        Inc(rowout); // <--- Das dazu
        inc(p,h);
     end;
   end;
   bitmap.Assign(help);
end;

Hazardos 9. Nov 2003 01:43

Re: Fehler beim Drehen eines Bildes
 
Es ist echt zum Verzweifeln. Ich kann mir einfach nicht erklären, warum das nicht läuft, obwohl es bei dem anderen Programm läuft. Auch deine Änderungen haben nichts bei mir bewirken können. Habe ich vielleicht irgendwas vergessen?? In der Projekt-Unit oder im FormCreate??

scp 9. Nov 2003 03:05

Re: Fehler beim Drehen eines Bildes
 
Na, dann erzähl mal ein paar Sachen. Ist das ein Bitmap (BMP), das du in TImage hast? Lädst du das Bild nachträglich per LoadFromFile oder was rein oder über die IDE?

Hazardos 9. Nov 2003 09:48

Re: Fehler beim Drehen eines Bildes
 
Hauptsächllich werden jpegs via LoadFromFile reingeladen. Dazu habe ich einfach die JPEG-Unit hinzugefügt.

scp 9. Nov 2003 14:20

Re: Fehler beim Drehen eines Bildes
 
Da das Drehen auf Bitmapebene passiert, müssen die Daten erstmal umgewandelt werden:

Delphi-Quellcode:
function Graphic2Bmp(AGraphic : TGraphic) : TBitmap;
begin
  result := TBitmap.Create;

  result.PixelFormat := pf24bit;
  result.Height := AGraphic.Height;
  result.Width := AGraphic.Width;
  result.Canvas.Draw(0, 0, AGraphic);
end;
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin
  If not image1.Picture.Graphic.Empty then
    image1.Picture.bitmap := Graphic2Bmp(image1.Picture.Graphic);
  image1.Picture.bitmap.PixelFormat := pf24bit;
  Drehen90Grad(image1.picture.bitmap);
end;

Hazardos 9. Nov 2003 15:23

Re: Fehler beim Drehen eines Bildes
 
Das war der Fehler!!!
Jetzt funzt alles, wie es soll!!
Danke für die Hilfe

mfg Hazardos

Keldorn 9. Nov 2003 15:27

Re: Fehler beim Drehen eines Bildes
 
@scp: damit schafft du dir aber ein Speicherloch, da du bei graphic2bmp zwar eine Bitmap erzeugst, diese aber nie wieder freigibst.

Mfg Frank

scp 9. Nov 2003 16:10

Re: Fehler beim Drehen eines Bildes
 
@Keildorn
In dem Fall wird doch das Bitmap an das TImage übergeben, somit übernimmt das die Verwaltung und auch die Freisetzung.

Keldorn 9. Nov 2003 16:26

Re: Fehler beim Drehen eines Bildes
 
Zitat:

Zitat von scp
@Keildorn
In dem Fall wird doch das Bitmap an das TImage übergeben, somit übernimmt das die Verwaltung und auch die Freisetzung.

nein, das ist nicht richtig. nimm dir das Programm Hier im Forum suchenmemproof zur hilfe.

Delphi-Quellcode:
image1.Picture.bitmap := Graphic2Bmp(image1.Picture.Graphic);
ist
Delphi-Quellcode:
image1.Picture.bitmap.assign(Graphic2Bmp(image1.Picture.Graphic));
oder sowas in der Art. auf alle Fälle steht ein assign dahinter.Das wird in der Set-methode geregelt. Du kopierst nur die bitmap. die übergebene Bitmap ist nach wie vor da. Das wäre sonst ja auch schlimm.

entweder du schreibst die Funktion um und übergibst eine Bitmap oder
Delphi-Quellcode:
Var bmp:Tbitmap;
begin
  If not image1.Picture.Graphic.Empty then
    begin
      bmp:=Graphic2Bmp(image1.Picture.Graphic);
      image1.Picture.bitmap := bmp;
      bmp.free;
    end;
...
Ich persönlich finde Objekte als Rückgabe von Funktionen nicht gut, hier vergißt man schnell das free.

im übrigen fehlt auch beim drehen ein free:

Delphi-Quellcode:
procedure Drehen90Grad(Bitmap:TBitmap);
...
begin
   Bitmap.pixelformat := pf32bit;
   help := TBitmap.Create;
   ....
   bitmap.Assign(help);
   help.free;
end;
Das ist vielleicht auch der Grund, warum immer auch über DoKo-Bücher gemeckert wird. Das free zu vergessen sind Anfängerfehler, außerdem fehlt hier ein try-block.

Mfg Frank

Niko 9. Nov 2003 16:26

Re: Fehler beim Drehen eines Bildes
 
Zitat:

Zitat von scp
somit übernimmt das die Verwaltung und auch die Freisetzung

Nein, denn bei der Zuweisung an TPicture.Bitmap wird ein neues Bitmap erzeugt und das übergebene per Assign übernommen. Um die Freigabe des eigenen Bitmaps muss man sich also selbst kümmern.

scp 9. Nov 2003 17:39

Re: Fehler beim Drehen eines Bildes
 
Naja, ein Anfänger bin ich nicht. In der Regel verwende ich auch Free. Nur in dem Fall habe ich mich vertan, habe grad mal in Graphics.pas geguckt, stimmt, wird nur ein Assign() durchgeführt.

Keldorn 9. Nov 2003 18:03

Re: Fehler beim Drehen eines Bildes
 
Zitat:

Zitat von scp
Naja, ein Anfänger bin ich nicht. In der Regel verwende ich auch Free. Nur in dem Fall habe ich mich vertan, habe grad mal in Graphics.pas geguckt, stimmt, wird nur ein Assign() durchgeführt.

nein, hier hast du mich falsch verstanden, bzw ich habe mich vielleicht n bißchen blöd ausgedrückt :oops: . Ich meinte damit, das ich es nicht gut finde, wenn im Doko-buch fehlerhafte Proceduren enthalten sind.

Sorry Frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:20 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