Autor Beitrag
nas4killer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 42



BeitragVerfasst: Sa 07.02.04 23:13 
Hi,

ich wollte wissen ob es eine einfachen Weg gibt per Knopfdruck ein Bild um 180° zu drehen. Und über einen Anderen Konpfdruck um 90° zu drehen. Danke
catweasel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 487
Erhaltene Danke: 1

Win 7 64bit
Delphi 7 Second Sedition V7.2
BeitragVerfasst: Sa 07.02.04 23:33 
klar gibts das ...:

einfach das Bild Pixelweise umbasteln ...

Tipp: Scanline liefert einen Pointer auf jeden Pixel innerhalb einer Zeile und ist damit schneller als ein iterativer aufruf von Pixels[x,y] für jeden Einzelpunkt...

Und wenn du das dann in die OnClick Methode eines Buttons schreibst, klappt das auf Knopfdruck..

Catweasel

ps: Oder du nimmst das RotatingImage von den Jedis

_________________
Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.
nas4killer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 42



BeitragVerfasst: Sa 07.02.04 23:38 
Könntest du mir das als ein kleines beispiel mit Image1 kurz zeigen ? VErstehe das nicht so ganz. Bin da nicht so fit drin.

danke
catweasel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 487
Erhaltene Danke: 1

Win 7 64bit
Delphi 7 Second Sedition V7.2
BeitragVerfasst: So 08.02.04 00:12 
hmm ok hier also mal on-the-fly, also ohne Gewährleistung der syntaktischen Korrektheit...


Ich implementier das mal als Nachfahre von TImage

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
TDrehargument = (90grad,180grad,270grad);

type TDrehbild = class(Timage)
 private
  tempmap : TBitmap;
  procedure 90drehen;
  procedure 180drehen;
  procedure 270drehen;
 public
    procedure drehen(argument:TDrehargument);


procedure TDrehbild.drehen(argument:TDrehargument);
begin
if argument = 90grad then 90drehen;
if argument = 90grad then 180drehen;
if argument = 90grad then 270drehen;
end;

procedure TDrehbild.90drehen;
var
xx,yy : integer;
begin
tempmap := TBipmap.create;
tempmap.assign(picture.bitmap);
  with tempmap do begin
     for xx := 0 to tempmap.width do begin
       picture.bitmap.pixels[xx,0] := pixels[yy,xx]
       inc(yy);
     end;
  end;
tempmap.free;

  // hier wird nun gedreht...
  // Ich zeige das exemplarisch für die erste Zeile der 90Grad Drehung
  // da ich das hier nicht als Quellcode gepasted habe sondern direkt
  // tippe das wird so nur voller Fehler :-) Und es ist schon spääät.... 

  end;
end;

procedure TDrehbild.180drehen;
begin
//   hier wird nun gedreht...
end;

procedure TDrehbild.270drehen;
begin
//   hier wird nun gedreht...
end;


Ein Aufruf würde dann so aussehen :

ausblenden Delphi-Quelltext
1:
2:
3:
4:
var
  bild : TDrehBild;

bild.drehen(270grad);


Das mit dem TDrehbild Typ muss nicht unbedingt sein. Du kannst auch einen Integer übergeben lassen. Ich find sowas aber ganz schick...
Theorethisch könntest du auch nur die 90-Drehung implementieren und dann für eine 180Grad Drehung zweimal und für 270Grad dreimal ausführen :roll: Is aber irgendwie rookiestyle......

Das mit dem temporären Bitmap ist nötig, da du ja Punkte überschreibst die du noch nicht verschoben hast... Würde etwas komisch aussehen ;-)
Die Variablen Namen xx und yy sind deshalb zweistellig um verwechslungen mit x und y als Parameter von Pixels[x,x] auszuschliessen...


Bei den anderen Drehungen musst du nur analog vorgehen.. Du musst überlegen wo jeder Pixel "hinwandert" oben links der geht auf oben rechts (bei 90 Grad, (Standardmässig gegen den Uhrzeigersinn)) . Zeile 1 Punkt 2 = Zeile 2 letzter Punkt ...
Zeile 1 Punkt 3 = Zeile 3 letzter Punkt.. etc...

Evtl. nochmal die OnlineHilfe zu Pixels[x,y] bemühen, dann sollte es klappen Der Rest ist nurnoch ein bischen rumgefrickel mit For-Schleifen... :-)

Catweasel

_________________
Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: So 08.02.04 09:37 
Hallo

das mit den canvas.pixels sollte man aber wieder vergessen, wenn es auch ein wenig schnell sein sollte.

hier gibts was zum Thema Flippen :
www.efg2.com/Lab/Ima...lipReverseRotate.htm

#diesen Code verwende ich zur zeit:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
type
  TRGBTripleArray = array[0..32768of TRGBTriple;
  pRGBTripleArray = ^TRGBTripleArray;
...

procedure Proc_BildDrehen90Grad(Bitmap:TBitmap);
//bild um 90° drehen
var src,dest: pRGBTripleArray;
    srcx,srcy,breite,hoehe : Integer;
    Hilfsbitmap    : TBitmap;
    UrsprungSrc,UrsprungDest      :  pRGBTripleArray;
    ScanlineBytesSrc,ScanlineBytesDest :  Integer;
BEGIN
   Bitmap.PixelFormat := pf24bit;
   Hilfsbitmap := TBitmap.Create;
   try
     Hilfsbitmap.PixelFormat := pf24bit;
     breite            := bitmap.Width;
     hoehe             := bitmap.Height;
     Hilfsbitmap.Width := hoehe;
     Hilfsbitmap.height:= breite;

     UrsprungSrc      := Bitmap.Scanline[0];
     ScanlineBytesSrc := Integer(Bitmap.Scanline[1]) - Integer(UrsprungSrc);
     UrsprungDest     := Hilfsbitmap.Scanline[0];
     ScanlineBytesDest:= Integer(Hilfsbitmap.Scanline[1]) - Integer(Ursprungdest);
     //y-Achse
     for srcy := 0 to (hoehe-1do
       begin
         src  := pointer(integer(UrsprungSrc)+srcy*ScanlineBytesSrc);
         //x-achse
         for srcx := 0 to (breite-1do
           begin
             dest := pointer(integer(UrsprungDest)+srcx*ScanlineBytesDest);
             dest[hoehe-1-srcy] := src[srcx];
           end;
       end;
     bitmap.Assign(Hilfsbitmap);
   finally
     Hilfsbitmap.Free;
   end;
end;


Mfg Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
catweasel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 487
Erhaltene Danke: 1

Win 7 64bit
Delphi 7 Second Sedition V7.2
BeitragVerfasst: So 08.02.04 13:57 
Zitat:
das mit den canvas.pixels sollte man aber wieder vergessen, wenn es auch ein wenig schnell sein sollte.


Klar, aber ich wollte es "einfach" halten. Im Sinne von auf Zeiger (abgesehen von Scanline) im groben verzichten....

Catweasel

_________________
Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.
nas4killer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 42



BeitragVerfasst: Di 10.02.04 01:29 
DAs funktioniert zwar schon. obwohl das ziemlich viel für eine einfache 90° ddrehunge bzw ein flip ist. Aner leider funktioniert das nicht mit JPG sondern nur mit BMP. Habt ihr noch eine idee ?

Danke schonmal für die bisherigen antworten.
catweasel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 487
Erhaltene Danke: 1

Win 7 64bit
Delphi 7 Second Sedition V7.2
BeitragVerfasst: Di 10.02.04 01:44 
Ja, hab ich:

Einfach aus dem JPG ein BMP machen, drehen und dann wieder als JPG abspeichern...

Catweasel

_________________
Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.
nas4killer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 42



BeitragVerfasst: Di 10.02.04 09:29 
Das ist natürlich auch eine möglichkeit. Wenn ich nichts anderes finden werde, werde ichs wohl so machen. :-D

Danke
jjturbo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 516

Win2000 prof., WinXP prof.
D4 Stand., D5 Prof, D7 Prof, D2007 Prof.
BeitragVerfasst: Do 12.02.04 13:06 
Such mal hier im Forum und im Web nach TRotateImage:
Das ist eine Komponente, bei der man einfach Dateinamen und Winkel angibt, fertig.

Hier ein Beispiel:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
  with RotateImage do begin
    RotateImage.Picture.LoadFromFile(BildDateiName);
    Angle:=0;//Winkel...
    AutoSize:=false;
    Center:=True;
    Stretch:=True;
    UniqueSize:=false;

    Width:=100;
    Height:=100;
    Left:=Trunc((MainForm.ClientWidth-RotateImage.Width)/2);
    Top:=Trunc((MainForm.ClientHeight-RotateImage.Height)/2);
    Invalidate;
  end;


Gruß, jjturbo

Moderiert von user profile iconGausi: Delphi-Tags hinzugefügt.

_________________
Windows XP: Für die einen nur ein Betriebssystem - für die anderen der längste Virus der Welt...