Delphi-PRAXiS
Seite 3 von 5     123 45      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Bild an der x-aschse spiegeln (https://www.delphipraxis.net/109359-bild-der-x-aschse-spiegeln.html)

dominikkv 14. Mär 2008 16:50

Re: Bild an der x-aschse spiegeln
 
Zitat:

Zitat von andiak
3. In einer anderen Unit steht
Delphi-Quellcode:
procedure TForm1.BSpiegelnClick(Sender: TObject);
begin
  Spiegele(Image1)
end;

Zitat:

Zitat von Muetze1
Aufruf mit z.B.
Delphi-Quellcode:
Spiegeln(Image1.Picture.Bitmap);


andiak 14. Mär 2008 17:25

Re: Bild an der x-aschse spiegeln
 
ich hab das spiegeln ja auch in Spiegele umgeändert....
immoment habe ich eh die fehler
[Fehler] UFabian.pas(14): Bei der vorherigen Deklaration von Spiegele wurde die Direktive 'overload' nicht angegeben
[Fehler] UFabian.pas(6): Ungenügende Forward- oder External-Deklaration: 'Spiegele'

Fussball-Robby 14. Mär 2008 19:26

Re: Bild an der x-aschse spiegeln
 
Zitat:

Zitat von Muetze1
@Fussball-Robby: Dann schreib aber auch dazu, dass er sich mit der Funktion auch erstmal bei leicht grösseren Bildern eine Tasse Kaffee aufsetzen kann. Es gibt wirklich keine langsamere Möglichkeit ein Bild zu spiegeln als über die Pixels[] Eigenschaft.

Ich wollte es ja nur so machen, dass er es auch versteht. Denn wenn er irgendeinen Code, von dem er nichts versteht, einfach nur kopiert, dann hilft das imho auch nicht viel weiter.

Mfg

Muetze1 14. Mär 2008 20:35

Re: Bild an der x-aschse spiegeln
 
Zitat:

Zitat von Fussball-Robby
Zitat:

Zitat von Muetze1
@Fussball-Robby: Dann schreib aber auch dazu, dass er sich mit der Funktion auch erstmal bei leicht grösseren Bildern eine Tasse Kaffee aufsetzen kann. Es gibt wirklich keine langsamere Möglichkeit ein Bild zu spiegeln als über die Pixels[] Eigenschaft.

Ich wollte es ja nur so machen, dass er es auch versteht. Denn wenn er irgendeinen Code, von dem er nichts versteht, einfach nur kopiert, dann hilft das imho auch nicht viel weiter.

Klar, sehe ich genauso, wenn es eine komplette Funktion ist. Hier geht es um einen einfachen WinAPI Aufruf - das geht nicht einfacher und da ist nichts zu erklären, da komplett dokumentiert. Von daher ist es nicht kompliziert, weil eine fremde Funktion aufrufen müsste man auch für die Zukunft können.

Muetze1 14. Mär 2008 20:36

Re: Bild an der x-aschse spiegeln
 
Zitat:

Zitat von andiak
2. von dir verstehe ich garnicht

Ok, wer sieht den Unterschied?

Zitat:

Zitat von andiak
Delphi-Quellcode:
procedure Spiegele(Bild: TImage);
...
procedure Spiegele(Bild: TBitmap);


andiak 14. Mär 2008 21:04

Re: Bild an der x-aschse spiegeln
 
achso muss aber TImage sein... ist vorgegeben
das programm läuft jetzt... aber es passiert rein garnichts :/


Delphi-Quellcode:
StretchBlt(Bild.Canvas.Handle,
               0,
               0,
               Bild.Width,
               Bild.Height,
             Bild.Canvas.Handle,
               Bild.Width - 1,
               0,
               -Bild.Width,
               Bild.Height,
             SRCCopy);
end;


Also Stretch gibt an das das bild geändert werden soll... ws bedeutet blt ?
und die 0, 0, das sie bei x0 und y0 anfangen soll die bearbeitung oder? und das es einmal Width und einmal height des bildes ist richtig?
und jetzt kommt mit Bild.Canvas.Handle, das das bild wie folgt bearbeitet werden soll aber warum Bild.Width -1 und 0,-Bild.Width, Bild.Height, kann mir das jemand erklären was das genau bewirken soll?

Wie ist es mit SRCCopy was wird kopiert??

Muetze1 15. Mär 2008 00:35

Re: Bild an der x-aschse spiegeln
 
Zitat:

Zitat von andiak
achso muss aber TImage sein... ist vorgegeben

Das solltest du auch abgeändert bekommen.

Zitat:

Zitat von andiak
Also Stretch gibt an das das bild geändert werden soll... ws bedeutet blt ?

Stretch und blt.

Zitat:

Zitat von andiak
und die 0, 0, das sie bei x0 und y0 anfangen soll die bearbeitung oder? und das es einmal Width und einmal height des bildes ist richtig?
und jetzt kommt mit Bild.Canvas.Handle, das das bild wie folgt bearbeitet werden soll aber warum Bild.Width -1 und 0,-Bild.Width, Bild.Height, kann mir das jemand erklären was das genau bewirken soll?

Schonmal den Link angeschaut, den ich schon ein paar Posts zuvor gegeben habe auf die MSDN Dokumentation. Anscheinend nicht - also mal anschauen und durchlesen.

Zitat:

Zitat von andiak
Wie ist es mit SRCCopy was wird kopiert??

Einfach bei dem zuvor genannten Link mal bei der Beschreibung des dwRop Parameters zum BitBlt Befehl folgen, dort gibt es alle Rasteroperationen.

andiak 15. Mär 2008 09:08

Re: Bild an der x-aschse spiegeln
 
ja ich hab mir den link schon öfter angeschaut... ist das die lösung des problems? nur schade das ich nicht ganz verstehe was da steht einmal englisch und zweitens andere programmier sprache :/

.........._____________

und jetzt fällt mir auf das der code auf der seite der selbe im delphi programm ist... wie ist das möglich? das ist doch ne ganz andere programmiersprache??

und was bedeutet?
int nXOriginSrc, // x-coord of source upper-left corner
int nYOriginSrc, // y-coord of source upper-left corner

x coordinate der quelle aus der oberen linken ecke... ebenso für die y was geben die an?

und wenn ich diesen code jetzt so eingegeben habe
Delphi-Quellcode:
procedure Spiegele(Bild: TImage);
Begin
  StretchBlt(Bild.Canvas.Handle,
               0,
               0,
               Bild.Width,
               Bild.Height,
             Bild.Canvas.Handle,
               Bild.Width - 1,
               0,
               -Bild.Width,
               Bild.Height,
             SRCCopy);
end;
passiert leider garnichts :/ aber ich habe jetzt den zusammenhang zwischen den link und dem code gesehen..

Muetze1 15. Mär 2008 13:31

Re: Bild an der x-aschse spiegeln
 
Zitat:

Zitat von andiak
und jetzt fällt mir auf das der code auf der seite der selbe im delphi programm ist... wie ist das möglich? das ist doch ne ganz andere programmiersprache??

Die Sprache ist doch egal, es geht um die Funktion die hier aufgerufen wird - und die ist in beiden Fällen die gleiche. In welcher Sprache sie aufgerufen wird, ist der genauso egal, weil sie schreibt nur vor, welche Parameter sie in welcher Reihenfolge haben will. Und genau das dokumentiert Microsoft auf der Seite. Die könnten alles kopieren und den Syntax anpassen für 'zig viele Programmiersprachen - aber wie du ja nun schon gemerkt hast, ist das unsinnig.

Zitat:

Zitat von andiak
und was bedeutet?
int nXOriginSrc, // x-coord of source upper-left corner
int nYOriginSrc, // y-coord of source upper-left corner

x coordinate der quelle aus der oberen linken ecke... ebenso für die y was geben die an?

Grundsätzlich sagt das aus, dass es beide jeweils ein Integer ist und den ersten haben sie nXOriginSrc genannt und den anderen nYOriginSrc. Vom Kommentar her hast du es richtig übersetzt. Die beziehen sich damit auf das Quellbild und wollen halt die x und y Koordinate vom Quellbild haben. Die Funktion heißt ja StretchBlt und kann somit auch Ausschnitte verzerren, somit benötigt es diese Angabe. Da wir sowas nicht wollen, wäre es ja 0 und 0 bei dir.

Zitat:

Zitat von andiak
und wenn ich diesen code jetzt so eingegeben habe
Delphi-Quellcode:
procedure Spiegele(Bild: TImage);
Begin
  StretchBlt(Bild.Canvas.Handle,
               0,
               0,
               Bild.Width,
               Bild.Height,
             Bild.Canvas.Handle,
               Bild.Width - 1,
               0,
               -Bild.Width,
               Bild.Height,
             SRCCopy);
end;
passiert leider garnichts :/

Da fehlt nun auch wieder etwas aus den Beiträgen zuvor. Du musst bei dem Image auf die Eigenschaft Picture.Bitmap zugreifen. Das gilt für das Canvas genauso wie für die Weite bzw. Höhe.

Muetze1 16. Mär 2008 00:49

Re: Bild an der x-aschse spiegeln
 
Liste der Anhänge anzeigen (Anzahl: 1)
Grundsätzlich: TImage mag es nicht wenn man das Bitmap direkt verändert - weil das TImage spuckt einem zumindest in die Suppe. Von daher im Anhang ein fertiges Beispielprog.

Delphi-Quellcode:
procedure MirrorV(AImage: TImage);
var
  lBmp: TBitmap;
begin
  lBmp := TBitmap.Create;
  try
    lBmp.Assign(AImage.Picture.Graphic);

    StretchBlt(lBmp.Canvas.Handle,
                 0,
                 0,
                 lBmp.Width,
                 lBmp.Height,
               lBmp.Canvas.Handle,
                 0,
                 lBmp.Height,
                 lBmp.Width,
                 -lBmp.Height,
               SRCCOPY);

    AImage.Picture.Assign(lBmp);;
  finally
    lBmp.Free;
  end;
end;

procedure MirrorH(AImage: TImage);
var
  lBmp: TBitmap;
begin
  lBmp := TBitmap.Create;
  try
    lBmp.Assign(AImage.Picture.Graphic);

    StretchBlt(lBmp.Canvas.Handle,
                 0,
                 0,
                 lBmp.Width,
                 lBmp.Height,
               lBmp.Canvas.Handle,
                 lBmp.Width,
                 0,
                -lBmp.Width,
                 lBmp.Height,
               SRCCOPY);
               
    AImage.Picture.Assign(lBmp);;
  finally
    lBmp.Free;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:38 Uhr.
Seite 3 von 5     123 45      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz