![]() |
Bild an der x-aschse spiegeln
Ich hoffe das die frage so inordnung ist
Ich würde nämlich gerne wissen mit welchem befehl/methode Ich ein TImage einfach Spiegeln kann [edit=Matze]Programmiersprache von "Delphi .NET" auf "Delphi Win32" geändert. MfG, Matze[/edit] [edit=SirThornberry]Titel korrigiert - Mfg, SirThornberry[/edit] |
Re: Bild and er x-aschse spiegeln
versuche es einmal
![]() |
Re: Bild and er x-aschse spiegeln
danke :/ ich weiß garnicht was ich habe :/ also verwenden tue ich das programm Delphi 7
und eine Paintbox haben wir nicht nut Image1 : TImage wo das bild aufer form ist und wenn ich jetzt auf nen button klicke soll die x-achse umkehren wie ist das möglich? |
Re: Bild and er x-aschse spiegeln
Ich habe mir den Source nicht angeschaut, aber eine TImage Komponente hat auch einen Canvas.
|
Re: Bild and er x-aschse spiegeln
dann ist es WIN32 was du machst ;)
schau dir doch einmal den Quelltext an den himitsu hineingestellt hat an, da wirst du bestimmt fündig |
Re: Bild and er x-aschse spiegeln
Diese Procedure ist fürs Spiegeln Horizontal verantwortlich sehe ich das richtig?
Delphi-Quellcode:
Procedure TForm1.Button1Click(Sender: TObject);
Begin StretchBlt(BitMapPaintBox5.Canvas.Handle, 0, 0, BitMapPaintBox5.Width, BitMapPaintBox5.Height, BitMapPaintBox5.Canvas.Handle, BitMapPaintBox5.Width - 1, 0, -BitMapPaintBox5.Width, BitMapPaintBox5.Height, SRCCopy); PaintBox5Paint(Sender); End; |
Re: Bild and er x-aschse spiegeln
denke schon "try and error"
|
Re: Bild an der x-aschse spiegeln
also irgendwie bin ich nicht weiter gekommen :/ da ich ja keine Paintbox habe sondern ein TImage ich hab ein bissl gewartet und hin und wieder was ausprobiert... ich habe es geschaft ein kleines stücken bild x,y von 0-50 die farbpigmente zu speichern und versetzt wieder zu schreiben
theoretisch müsste das doch auch gehen das ich alle abspeicherer und GENAU umgekehrt wieder auf die selbe stelle platziere... also wenn das bild die mase x 0-250pixel y 0-250pixel dass dann die farbpigmente von 249 bei 1 und von 248 bei 2... usw. hat jemand eine idee wie ich das schaffe? bzw. ist der ansatz richtig? |
Re: Bild an der x-aschse spiegeln
Zitat:
![]() Zitat:
TPaintBox.Canvas -> TImage.Picture.Bitmap.Canvas TPaintBox.Width -> TImage.Picture.Width TPaintBox.Height -> TImage.Picture.Height Also, nochmal rumprobieren und fertig stellen... |
Re: Bild an der x-aschse spiegeln
Am Anfang hatte ich den Fehler das StretchBlt undefiniert ist dann habe ich mal alle Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
eingefügt... würde gerne wissen welche der oberen uses gebraucht wird um StretchBlt ausführen zu können in der procedure steht jetzt
Delphi-Quellcode:
aber jetzt sagt er mir das "Bild" undefiniert ist aber normalerweise dürfte der doch vorhanden sein Bild ist TImage
procedure Spiegele(Bild: TImage);
Begin StretchBlt(TImage.Bild.Bitmap.Canvas.Handle, 0, 0, TImage.Bild.Width, TImage.Bild.Height, TImage.Bild.Bitmap.Canvas.Handle, TImage.Bild.Width - 1, 0, - TImage.Bild.Width, TImage.Bild.Height, SRCCopy); TImage.Bild(Sender); end; Hier mal mein kompletter Quellcode. :/ wo liegt hier der fehler? Ich habe ausprobiert bei TImage.Bild immer das TImage zu enterfernen da Bild ja schon TImage ist :/ ist das richtig das zu entfernnen oder muss das da bleiben??
Delphi-Quellcode:
interface
uses ExtCtrls; procedure Spiegele(Bild: TImage); implementation uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls ; procedure Spiegele(Bild: TImage); Begin StretchBlt(Bild.Bitmap.Canvas.Handle, 0, 0, TImage.Bild.Width, TImage.Bild.Height, TImage.Bild.Bitmap.Canvas.Handle, TImage.Bild.Width - 1, 0, - TImage.Bild.Width, TImage.Bild.Height, SRCCopy); TImage.Bild(Sender); end; end. |
Re: Bild an der x-aschse spiegeln
Zitat:
Zitat:
|
Re: Bild an der x-aschse spiegeln
Ahh alles klar danke jetzt hab ichs verstanden bin in dem bereich noch ein ziemlicher noob aber rigednwie logisch da du den genauen bezeichner nicht kennst nennst du mir einfach en oberbegriff... :)
jetzt bekomm ich aber den fehler das bitmap ein undefinierter bezeichner ist aber warum? "Die Eigenschaft Bitmap gibt an, dass der Inhalt des TPicture-Objekts eine Bitmap-Grafik (Dateiformat .BMP) ist." und das bild welches ich bearbeiten möchte ist bmp und wenn ich .bitmap immer rausnehme bekomm ich dne fehler das hier
Delphi-Quellcode:
ein semikolon oder operator fehlt
Bild(Sender);
|
Re: Bild an der x-aschse spiegeln
Ich habe mir den Code jetzt nicht genau angeguckt, habe aber einen anderen Vorschlag, den auch du bestimmt verstehst. Hab mal ne kleine Prozedur geschrieben:
Delphi-Quellcode:
Dabei muss das Bild ein Bitmap sein, sonst gints nen Fehler.
procedure Spiegeln(Bild:TImage; var NeuesBild:TImage);
var i,j:integer; begin for i:=0 to Bild.width do for j:=0 to Bild.height do NeuesBild.canvas.pixels[i,j]:=Bild.canvas.pixels[Bild.width-i,Bild.height-j]; end; //////Beispielaufruf: procedure TForm1.Button1Click(Sender: TObject); begin Spiegeln(Image1,Image2);//Image1 ist das Ausgangsbild, Image2 dann das gespiegelte end; Mfg, Robert |
Re: Bild an der x-aschse spiegeln
Ich habs jetzt mal irgendwie ein wenig umgeschrieben... das jetzt keine fehler mehr kommen und ich das programm wenigstens starten kann so sieht der quellcode jetzt aus:
Delphi-Quellcode:
das problem ist er nimmt jetzt nur die rechte seite des bildes und spiegelt es :/
procedure Spiegele (Bild:TImage);
var i,j:integer; begin for i:=0 to Bild.width do for j:=0 to Bild.height do Bild.canvas.pixels[i,j]:=Bild.canvas.pixels[Bild.width-i,Bild.height-j]; end; |
Re: Bild an der x-aschse spiegeln
Das ist mir auch aufgefallen, darum hatte ich es mit einer Ausgabe-Variable gemacht.
Das passiert, weil deine Prozedur das Bild zum berechnen nimmt, während es schon neu gezeichnet wird. Mein Code müsste aber problemlos funktionieren. Mfg |
Re: Bild an der x-aschse spiegeln
nicht ganz hier
Delphi-Quellcode:
hier sagt er mit aus irgendeingrund ( habe Button1Click angepasst zu BSpiegelnClick)
procedure TForm1.Button1Click(Sender: TObject);
ähm das er nach TForm1 ein ; aber kein . erwartet |
Re: Bild an der x-aschse spiegeln
@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. Nutz doch sonst wenigstens die ScanLine[] Property von TBitmap, das würde das ganze nochmal deutlich verschnellern.
@andiak:
Delphi-Quellcode:
Aufruf mit z.B.
procedure Spiegeln(Bild: TBitmap);
Begin StretchBlt(Bild.Canvas.Handle, 0, 0, Bild.Width, Bild.Height, Bild.Canvas.Handle, Bild.Width - 1, 0, -Bild.Width, Bild.Height, SRCCopy); end;
Delphi-Quellcode:
Spiegeln(Image1.Picture.Bitmap);
|
Re: Bild an der x-aschse spiegeln
Jetzt bekomm ich den fehler das Bei der vorherigen Deklaration von Spiegele wurde die Direktive "overlord" nicth angegeben was bedeutet den das schonwieder?? die delphi hilfe kann mir auch nicht helfen :/
Delphi-Quellcode:
unit UFabian;
interface uses ExtCtrls; procedure Spiegele(Bild: TImage); implementation uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; procedure Spiegele(Bild: TBitmap); Begin StretchBlt(Bild.Canvas.Handle, 0, 0, Bild.Width, Bild.Height, Bild.Canvas.Handle, Bild.Width - 1, 0, -Bild.Width, Bild.Height, SRCCopy); end; end. Wo soll ich den Spiegeln(Image1.Picture.Bitmap); einfügen?? |
Re: Bild an der x-aschse spiegeln
1. Du hast immernoch eine ellenlange Uses Liste. Siehe meinen Hinweis zuvor.
2. Du hast in der Implementation eine andere Argumentenliste als in der Deklaration der Funktion 3. Wann willst du das Bild denn spiegeln? z.B. auf einen Button Click? |
Re: Bild an der x-aschse spiegeln
ja weil das ein neuer code von dir ist habe ich alle wieder reingetan (ist dochn icht schlim) das keine fheler auftauchen
brauchen tue ich aber nur uses Windows, Graphics; 2. von dir verstehe ich garnicht 3. In einer anderen Unit steht
Delphi-Quellcode:
procedure TForm1.BSpiegelnClick(Sender: TObject);
begin Spiegele(Image1) end; |
Re: Bild an der x-aschse spiegeln
Zitat:
Zitat:
|
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' |
Re: Bild an der x-aschse spiegeln
Zitat:
Mfg |
Re: Bild an der x-aschse spiegeln
Zitat:
|
Re: Bild an der x-aschse spiegeln
Zitat:
Zitat:
|
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?? |
Re: Bild an der x-aschse spiegeln
Zitat:
Zitat:
![]() ![]() Zitat:
![]() Zitat:
![]() |
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:
passiert leider garnichts :/ aber ich habe jetzt den zusammenhang zwischen den link und dem code gesehen..
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; |
Re: Bild an der x-aschse spiegeln
Zitat:
Zitat:
Zitat:
|
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; |
Re: Bild an der x-aschse spiegeln
Danke... vielen dank... ich habs soweit angepasst... und ich bekomm MAL WIEDER SCHEIS FEHLER ERST WO DIE DATEI ABGERUFEN WIRD AB
ich weiß nicht genau wie ich das abändern muss weil in der anderen Unit steht :
Delphi-Quellcode:
und wenn man auf dem button klickt soll sich das bild schonmal um die vertikale achse wenden
procedure TForm1.BSpiegelnClick(Sender: TObject);
begin Spiegele(Image1) end;
Delphi-Quellcode:
procedure TForm1.BSpiegelnClick(Sender: TObject);
begin Spiegele(Image1) end; procedure TForm1.btnHorizontalClick(Sender: TObject); begin MirrorH(imgPicture); end; |
Re: Bild an der x-aschse spiegeln
Ich versteh dein Problem nun nicht so recht. Benenn die MirrorH doch einfach um zu Spiegele und werf die alte Spiegele() weg. Ich versteh irgendwie dein Problem nun nicht. Könntest du es vllt. nochmal umformulieren? Gerade auch dein hier gebrüllter Teil ist völlig unverständlich für mich...
|
Re: Bild an der x-aschse spiegeln
Ich kann die alte
Delphi-Quellcode:
nicht rauswerfen
procedure TForm1.BSpiegelnClick(Sender: TObject);
begin Spiegele(Image1) end; da die vorgegeben ist momentan bekomm ich in dieser zeile
Delphi-Quellcode:
[Fehler] UFabian.pas(65): ';' erwartet, aber '.' gefunden
procedure TForm1.BSpiegelnClick(Sender: TObject);
das halt der letzte teil
Delphi-Quellcode:
procedure TForm1.BSpiegelnClick(Sender: TObject);
begin Spiegele(Bild) end; procedure TForm1.btnHorizontalClick(Sender: TObject); begin Spiegele(imgPicture); end; |
Re: Bild an der x-aschse spiegeln
Ehrlich gesagt verstehe ich auch nicht, was dein Problem ist. Was kannst du wo nicht rauswerfen?
Du musst doch einfach die beiden Prozeduren von Muetze1 bei dir reinkopieren, die alten Prozeduren löschen und im OnClick vom Button den Aufruf einfügen (Doppelklick auf den Button und dann einfügen). Wo kommst du da genau nicht weiter? Mfg |
Re: Bild an der x-aschse spiegeln
Zitat:
Zitat:
|
Re: Bild an der x-aschse spiegeln
Liste der Anhänge anzeigen (Anzahl: 1)
tut mir leid... ich häng mal das ganz projekt an... die UFabian ist zu öffnen...
|
Re: Bild an der x-aschse spiegeln
Was mir als erstes auffällt: Du hast in der Unit UFabian die beiden Prozeduren unter gleichem Namen aufgeführt, das kann so schonmal nicht klappen. Und das OnClick vom Button kannst du nicht einfach in irgendeine Unit reinmachen, du musst auf der Form auf den Button doppelklicken, dann kommst du automatisch zum Button-OnClick, wo du den Aufruf der Prozedur dann reinmachen musst.
Mfg |
Re: Bild an der x-aschse spiegeln
Das problem das beide Horizontal und Vertikal auf einer "button" gelegt sind das kann ich nur lösen indem ich nen zweiten button erstelle oder?
|
Re: Bild an der x-aschse spiegeln
Ja, denn dann sind sie ja nicht mehr auf einem Button :wink:
Mfg |
Re: Bild an der x-aschse spiegeln
Auf der Form1 habe ich jetzt 2 Buttons einen BHorzontal und BVertikal und in der UBild folgendes hinzugefügt
Delphi-Quellcode:
und folgende zwei proceduren in der UBild
type
... BHorizontal: TButton; BVertikal: TButton; procedure BHorizontalClick(Sender: TObject); procedure BVertikalClick(Sender: TObject); ...
Delphi-Quellcode:
procedure TForm1.BHorizontalClick(Sender: TObject);
begin Spiegele(Image1) end; ... procedure TForm1.BVertikalClick(Sender: TObject); begin Spiegele2(Image1) end; und hier ist meine gesammte UFabian
Delphi-Quellcode:
Bekomm aber einige Fehler ich poste sie mal alle
unit UFabian;
interface uses ExtCtrls; procedure Spiegele(Bild: TImage); procedure Spiegele2(Bild: TImage); implementation uses Windows, Graphics; procedure Spiegele(Bild: TImage); var lBmp: TBitmap; begin lBmp := TBitmap.Create; try lBmp.Assign(Bild.Picture.Graphic); StretchBlt(lBmp.Canvas.Handle, 0, 0, lBmp.Width, lBmp.Height, lBmp.Canvas.Handle, 0, lBmp.Height, lBmp.Width, -lBmp.Height, SRCCOPY); Bild.Picture.Assign(lBmp);; finally lBmp.Free; end; end; procedure Spiegele2(Bild: TImage); var lBmp: TBitmap; begin lBmp := TBitmap.Create; try lBmp.Assign(Bild.Picture.Graphic); StretchBlt(lBmp.Canvas.Handle, 0, 0, lBmp.Width, lBmp.Height, lBmp.Canvas.Handle, lBmp.Width, 0, -lBmp.Width, lBmp.Height, SRCCOPY); Bild.Picture.Assign(lBmp);; finally lBmp.Free; end; end; procedure TForm1.BHorizontalClick(Sender: TObject); begin Spiegele(Image1) end; procedure TForm1.BVertikalClick(Sender: TObject); begin Spiegele2(Image1); end; end. [Fehler] UFabian.pas(66): ';' erwartet, aber '.' gefunden [Fehler] UFabian.pas(68): Undefinierter Bezeichner: 'Image1' [Fehler] UFabian.pas(71): Bezeichner redefiniert: 'TForm1' [Fehler] UFabian.pas(73): Undefinierter Bezeichner: 'Image1' [Fataler Fehler] UBild.pas(35): Verwendete Unit 'UFabian.pas' kann nicht compiliert werden |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:41 Uhr. |
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