Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi bmp drehen (https://www.delphipraxis.net/65295-bmp-drehen.html)

arukas 14. Mär 2006 19:27


bmp drehen
 
Hi Leute,

ich such jetzt schon seit 3h in sämtlichen Foren verzweifelt nach einer Möglichkeit ein Bild mit Delphi7 zu drehen. Ich hab mir viele Postings durchgelesen, aber es hat wirklich nichts funktioniert, weil immer irgendwelche Fehlermeldungen kamen. Ich bin langsam am verzweifeln, das können doch bloß 3 Zeilen Code sein oder nicht?

Euer Arukas

PS: ich bin totaler Neuling

Keldorn 14. Mär 2006 19:31

Re: bmp drehen
 
Hallo

gugg auf www.efg2.com und such nach rotateimage

arukas 14. Mär 2006 19:46

Re: bmp drehen
 
dann bekomm ich folgende Fehlermeldung:

Delphi-Quellcode:
[Error] Unit1.pas(45): Undeclared identifier: 'pRGBArray'
[Error] Unit1.pas(65): Undeclared identifier: 'rotation'
[Error] Unit1.pas(66): Missing operator or semicolon
[Error] Unit1.pas(66): Undeclared identifier: 'SpinEditThetaDegrees'
[Error] Unit1.pas(66): ')' expected but identifier 'Value' found
[Error] Unit1.pas(67): Undeclared identifier: 'SpinEditThetaDegreesHundredths'
[Error] Unit1.pas(67): Missing operator or semicolon
[Error] Unit1.pas(90): ';' expected but 'FOR' found
[Error] Unit1.pas(92): Undeclared identifier: 'RowRotated'
[Error] Unit1.pas(92): Undeclared identifier: 'BitmapRotated'
[Error] Unit1.pas(92): Missing operator or semicolon
[Error] Unit1.pas(96): Undeclared identifier: 'this'
[Error] Unit1.pas(102): Missing operator or semicolon
[Error] Unit1.pas(105): Missing operator or semicolon
[Error] Unit1.pas(111): Undeclared identifier: 'vertically'
[Error] Unit1.pas(116): Missing operator or semicolon
[Error] Unit1.pas(123): '.' expected but 'FOR' found
[Error] Unit1.pas(124): Identifier redeclared: 'Finalization'
[Error] Unit1.pas(127): Undeclared identifier: 'iPrime'
[Error] Unit1.pas(127): Undeclared identifier: 'i'
[Error] Unit1.pas(127): Undeclared identifier: 'OldWidth'
[Error] Unit1.pas(127): Undeclared identifier: 'iRotationAxis'
[Error] Unit1.pas(132): Undeclared identifier: 'readable'
[Warning] Unit1.pas(143): Text after final 'END.' - ignored by compiler
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'

Keldorn 14. Mär 2006 19:51

Re: bmp drehen
 
welchen code hast du genau genommen?
http://www.efg2.com/Lab/ImageProcess...teScanline.htm
dort gibt es alles, Erklärung, unten ein Download mit Exe, verbesserte und schnellere Funktionen

arukas 14. Mär 2006 19:58

Re: bmp drehen
 
perfekt danke,

jetzt muss ichs nur noch verstehen^^,

danke

arukas 15. Mär 2006 16:02

Re: bmp drehen
 
hi,

ich hab noch mal eine Frage.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    image: TImage;
    procedure Button1Click(Sender: TObject);  
FUNCTION Rotate(CONST BitmapOriginal: TBitmap;
  CONST iRotationAxis, jRotationAxis: INTEGER;
  CONST AngleOfRotation: DOUBLE {radians} ): TBitmap;
  private
    { Private declarations }
  public
    { Public declarations }
  end;


CONST
MaxPixelCount = 32768;

TYPE
  TRGBTripleArray = ARRAY[0..MaxPixelCount-1] OF TRGBTriple;
  pRGBTripleArray = ^TRGBTripleArray;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
rotate(image,12,34,56);

end;


// "Simple" approach. For pixel (i,j), use "reverse" rotation to find
// where the rotated pixel must have been before the rotation.
// Don't bother with center of pixel adjustment.
// Assumes input BitmapOriginal has PixelFormat = pf24bit.
FUNCTION Rotate(CONST BitmapOriginal: TBitmap;
  CONST iRotationAxis, jRotationAxis: INTEGER;
  CONST AngleOfRotation: DOUBLE {radians} ): TBitmap;

  VAR
    cosTheta  : EXTENDED;
    i         : INTEGER;
    iOriginal : INTEGER;
    iPrime    : INTEGER;
    j         : INTEGER;
    jOriginal : INTEGER;
    jPrime    : INTEGER;
    RowOriginal: pRGBTripleArray;
    RowRotated : pRGBTRipleArray;
    sinTheta  : EXTENDED;
BEGIN
  // The size of BitmapRotated is the same as BitmapOriginal. PixelFormat
  // must also match since 24-bit GBR triplets are assumed in ScanLine.
  RESULT := TBitmap.Create;
  RESULT.Width := BitmapOriginal.Width;
  RESULT.Height := BitmapOriginal.Height;
  RESULT.PixelFormat := pf24bit; // Force this

  // Get SIN and COS in single call from math library
  sinTheta := SIN(AngleOfRotation);

  // If no math library, then use this:
  // sinTheta := SIN(AngleOfRotation);
  // cosTheta := COS(AngleOfRotation);

  // Step through each row of rotated image.
  FOR j := RESULT.Height-1 DOWNTO 0 DO
  BEGIN
    RowRotated := RESULT.Scanline[j];
    jPrime := j - jRotationAxis;

    FOR i := RESULT.Width-1 DOWNTO 0 DO
    BEGIN
      iPrime := i - iRotationAxis;
      iOriginal := iRotationAxis + ROUND(iPrime * CosTheta - jPrime * sinTheta);
      jOriginal := jRotationAxis + ROUND(iPrime * sinTheta + jPrime * cosTheta);

      // Make sure (iOriginal, jOriginal) is in BitmapOriginal. If not,
      // assign blue color to corner points.
      IF (iOriginal >= 0) AND (iOriginal <= BitmapOriginal.Width-1) AND
          (jOriginal >= 0) AND (jOriginal <= BitmapOriginal.Height-1)
      THEN BEGIN
        // Assign pixel from rotated space to current pixel in BitmapRotated
        RowOriginal := BitmapOriginal.Scanline[jOriginal];
        RowRotated[i] := RowOriginal[iOriginal]
      END
      ELSE BEGIN
        RowRotated[i].rgbtBlue := 255; // assign "corner" color
        RowRotated[i].rgbtGreen := 0;
        RowRotated[i].rgbtRed := 0
     END

    END
  END
END {RotateBitmapMethod1};



end.
Bei dem Code bekomme ich folgende Fehlermeldung:

Delphi-Quellcode:
[Error] Unit1.pas(40): Incompatible types: 'TBitmap' and 'TImage'
[Error] Unit1.pas(14): Unsatisfied forward or external declaration: 'TForm1.Rotate'
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
Ich dachte eigentlich, dass ich hier...
Delphi-Quellcode:
rotate(image,12,34,56);
.
.
FUNCTION Rotate(CONST BitmapOriginal: TBitmap;
CONST iRotationAxis, jRotationAxis: INTEGER;
CONST AngleOfRotation: DOUBLE {radians} ): TBitmap;
...nur sagen muss, welches Bild ich wie drehen möchte, aber irgendwie scheint das nicht ganz so gut zu funktionieren, wie ich mir das vorgestellt hab.

pls help


Euer Arukas

pacman1986 15. Mär 2006 16:08

Re: bmp drehen
 
unten im code (da du es deklariert hast)
function Form1.rotate ... statt function rotate

und

image.picture.bitmap (? Glaub ich ) statt image in deinem Form Create

arukas 15. Mär 2006 20:23

Re: bmp drehen
 
irgendwie ist das Drehen von Bildern kompliziert....
Es werden zwar keine Fehler mehr angezeigt, aber das Bild dreht sich nicht :(...

Keldorn 15. Mär 2006 20:36

Re: bmp drehen
 
rotate ist eine function

Delphi-Quellcode:
Var bmp:Tbitmap;
begin
//bmp:=tbitmap.create; brauchst du nicht, da es bei rotate das Bitmap erstellt wird

  bmp:=rotate(....)
  image.picture.bitmap.assign(bmp);
  bmp.free; //das free ist wichtig, sonst hast du ein speicherleck
Mfg Frank

arukas 15. Mär 2006 22:15

Re: bmp drehen
 
Ich hab jetzt alles so geändert wie ich es glaube verstanden zu haben, aber das Bild dreht sich immer noch nicht.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
bmp:=image1.Picture.Bitmap;
bmp:=rotate(bmp,67,34,5);
  image1.picture.bitmap.assign(bmp);
  bmp.free; //das free ist wichtig, sonst hast du ein speicherleck

end;
FUNCTION Tform1.rotate(CONST BitmapOriginal: TBitmap;
  CONST iRotationAxis, jRotationAxis: INTEGER;
  CONST AngleOfRotation: DOUBLE {radians} ): TBitmap;

  VAR
    cosTheta  : EXTENDED;
    i         : INTEGER;
    iOriginal : INTEGER;
    iPrime    : INTEGER;
    j         : INTEGER;
    jOriginal : INTEGER;
    jPrime    : INTEGER;
    RowOriginal: pRGBTripleArray;
    RowRotated : pRGBTRipleArray;
    sinTheta  : EXTENDED;
BEGIN
  RESULT := BitmapOriginal;
  RESULT.Width := BitmapOriginal.Width;
  RESULT.Height := BitmapOriginal.Height;
  RESULT.PixelFormat := pf24bit;

  cosTheta := COS(AngleOfRotation);

  FOR j := RESULT.Height-1 DOWNTO 0 DO
  BEGIN
    RowRotated := RESULT.Scanline[j];
    jPrime := j - jRotationAxis;

    FOR i := RESULT.Width-1 DOWNTO 0 DO
    BEGIN
      iPrime := i - iRotationAxis;
      iOriginal := iRotationAxis + ROUND(iPrime * CosTheta - jPrime * sinTheta);
      jOriginal := jRotationAxis + ROUND(iPrime * sinTheta + jPrime * cosTheta);

      IF (iOriginal >= 0) AND (iOriginal <= BitmapOriginal.Width-1) AND
          (jOriginal >= 0) AND (jOriginal <= BitmapOriginal.Height-1)
      THEN BEGIN
        RowOriginal := BitmapOriginal.Scanline[jOriginal];
        RowRotated[i] := RowOriginal[iOriginal]
      END
      ELSE BEGIN
        RowRotated[i].rgbtBlue := 255;
        RowRotated[i].rgbtGreen := 0;
        RowRotated[i].rgbtRed := 0;
     END

    END
  END
END;
euer arukas

Keldorn 16. Mär 2006 16:44

Re: bmp drehen
 
Hallo du hast den code nicht richtig kopiert, bzw. falsch geändert.
Delphi-Quellcode:
  RESULT := BitmapOriginal;
  RESULT.Width := BitmapOriginal.Width;
  RESULT.Height := BitmapOriginal.Height;
  RESULT.PixelFormat := pf24bit;

  cosTheta := COS(AngleOfRotation); //<<<<------ diese Zeile kommt im Originalen so code nicht vor, bzw das sintheta fehlt.
richtig ist
Delphi-Quellcode:
  // Get SIN and COS in single call from math library
  sincos(AngleOfRotation, sinTheta, cosTheta);
sincos ist in math enthalten, du mußt math mit in die uses zeile aufnhemen.

Mfg Frank

arukas 16. Mär 2006 16:58

Re: bmp drehen
 
hab ich geändert,
aber es tut sich trotzdem noch nichts :(.

Keldorn 16. Mär 2006 17:02

Re: bmp drehen
 
was hast du für ein Bild im Image, ein jpg? das geht nicht

arukas 16. Mär 2006 17:05

Re: bmp drehen
 
jo, es war ursprüunglich ein jpg-Bild, aber ich hab es in bmp umgewandelt, also einfach speichern unter name.bmp.

Das hat jedenfalls sonst immer funktioniert.

Keldorn 16. Mär 2006 17:06

Re: bmp drehen
 
häng einfach mal dass bild ran

arukas 16. Mär 2006 17:14

Re: bmp drehen
 
Liste der Anhänge anzeigen (Anzahl: 1)
ich hab grad noch ein bild selbst erstellt, mit dem funktioniert es auch nicht. Es muss irgendwie am programmcode liegen...´

hier ist das testbild mit dem ich das die ganze Zeit mache. Ich glaub aber nicht, dass es am Bild liegt.

Keldorn 16. Mär 2006 17:22

Re: bmp drehen
 
bei mir dreht sich das Bild. dann halt als letzter Versuch: häng mal dein Projekt ran

arukas 16. Mär 2006 17:26

Re: bmp drehen
 
Liste der Anhänge anzeigen (Anzahl: 1)
ok, hier ist es

Keldorn 16. Mär 2006 17:38

Re: bmp drehen
 
ok

1. Da kann sich nichts drehen, weil du zwar im Code die Buttonklick routine stehen hast, diese aber nicht dem Button im Objektinspektor bei onclick zugewiesen hast. Daher du reagierst nicht auf das Drücken des Buttons.

2. Dein Drehcode ist immer noch falsch, habe ich durch das ganze geänder nicht gesehen.
Delphi-Quellcode:
RESULT := Tbitmap.create;
so ist es richtig durch dein RESULT := BitmapOriginal; ereichst du folgendes: result zeigt auf Bitmaporiginal, du arbeitest nicht mit 2 Bitmaps, sondern nur mit einer Bitmaporiginal. := ist bei Objekten kein Kopieren! Der drehcode kann so nicht funktionieren. Außerdem zeigt dann auch bmp auf Bitmaporiginal, also die Image.picture.bitmap, durch Freigeben der Bitmap gibst du dann die Imagae-bitmap frei und wirst in einer AV landen.

Mfg frank

arukas 16. Mär 2006 17:48

Re: bmp drehen
 
super, danke das funktioniert jetzt. Das mit dem Butten hätte mir selbst auffallen müssen :?

jetzt hab ich aber ein neues problem :(.

Delphi-Quellcode:
        RowRotated[i].rgbtBlue := 0;
        RowRotated[i].rgbtGreen := 0;
        RowRotated[i].rgbtRed := 0;
Wenn ich auf den Butten klicke werden nur die Farben geändert (hier in Schwarz), bei 255,255,255 natürlich in Weiß usw... Das Bild ist somit weg. Ausserdem ist mir aufgefallen, dass sich die Maße nicht verändert haben. image1.height ist gleich geblieben. Woran liegt das?

Keldorn 16. Mär 2006 18:07

Re: bmp drehen
 
auf den efg seiten sind weitere codebeispiele (unterer bereich), da ist auch eine mit "without clipping", das dreht dir die Bilder voll und paßt die Größe an.

arukas 16. Mär 2006 18:52

Re: bmp drehen
 
aber warum wird das bild blau oder rot oder schwarz?

himitsu 17. Mär 2006 10:43

Re: bmp drehen
 
Na ich würde mal sagen, das demnach ein Fehler in denem Programm/Drehcode vorliegt?

arukas 17. Mär 2006 13:51

Re: bmp drehen
 
naja das hab ich mir auch gedacht... irgendwie muss die bedingung vom anfang nicht erfüllt gewesen sein, aber was ist falsch?


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