Teile eines gestrechten Timage kopieren

Ingo1

Grünschnabel
Hallo

Brauche dringend Hilfe will in einer Klyix(Delphi) Anwendung zwei Bilder mit einander
vergleichen ein Orginal und ein von einer Kamera aufgenommenes Bild.
Muß irgend wie mit:

"procedure CopyRect(const Dest:TRect; Canvas:TCanvas; const Source:TRect);

funktionieren hab ich aus der Hilfe aber weiß nicht wie?

Das Bild von der Kamera wird z.B in Timage1 dargestellt und mit strech auf dem
gesamten Bildschirm angezeigt. Das Timage2 liegt im Hintergrund und enthält das
gestrechte Orginalbild. Jetzt möchte ich aus diesem Timage2 einen Teil des Bildes raus
kopieren und in ein Timage3 legen, was auf Timage1 liegt um einen Farbvergeleich
machen zu können. Die Größe des zu kopierenden Bildes ist abhängig von der Größe
des Timage3 welche ich durch PfeilButtons verändern kann. Um an jeder Stelle des
Kamerabildes einen Farbvergleich mit dem Orginalbild zu machen.

Problem ist das Strechen wenn ich das Kamerabild und das Orginalbild ungestrecht auf
einander lege(vorrausgesetzt beide haben den gleichen Anfangspunkt linke obere Ecke)
kann ich die Größe des Orginalbildes so veränder das sie sich immer genau
überschneiden und ich einen Farbvergleich machen kann.Doch durch das Strechen
bekomm ich ja immer das gesamte Bild angezeigt und lösen wollte ich es halt mit nem
3.Timage.

Hab schon überall gesucht aber nirgends hilfe gefunden.Ich hoffe Ihr könnt mir sagen wie
das mit dem Kopieren funktioniert.:confused:

Danke
MfG
Ingo1
 
Also so grob glaube ich, daß ich ahne, was du machen willst. Aber ich würde dich doch sehr bitten, das Ganze nochmal etwas genauer zu beschreiben, damit ich sehe, ob ich mit meinem StretchDraw-Ansatz richtig liege.
Weil ich arbeite hier auch mit Kamerabildern, Originalen, mit und ohne Bezeichnungen und diversen Viewpoint-Buffern - nur sagt dir das garantiert nichts, weil du eben nicht weisst, woran ich arbeite und wie ich welche Bitmap einsetze.
So geht es mir auch mit deinem Post.
 
Hallo

Also ein bißchen genauer,ich versuch´s.
Ich möchte eine Kamera als Bahnbeobachtungsgerät einsetzen. Das heißt ich möchte
mit einer Kamera Bilder aufnehmen und Sie auf dem gesamten Bildschirm darstellen, was
ich über ein Timage Objekt erreichen wollte. Dann möchte ich bei Bedarf ein Masterbild
(also ein Orginal oder vorher kontrolliertes Bild) über die Kamera Aufnahmen legen,
welche vom Prinzip genau das selbe Bild anzeigt, um einen Farbvergleich zwischen
Aufnahme und Masterbild machen zu können. Dieses Masterbild muß jetzt über
Pfeiltasten einer Fernbedienung in der Größe verstellbar sein, aber die beiden Bilder
müssen zu einander immer denkungsgleich sein, so daß wenn alles richtig ist man
keinen Übergang zwischen Masterbild und Aufgenommenembild sieht.Dadurch
sollte man dann in der Lage sein, jede Stelle des Aufgenommenen Bildes mit dem
Masterbild zu vergleichen, um dadurch einen Farbunterschied direkt erkennen zu können.
So genauer gehts glaub ich nicht falls dennoch Fragen dazu sind versuch ich sie zu beantworten.

Mein Problem ist jetzt das ich diese Funktion nur teilweise gelöst bekomme, wenn ich mit
zwei ungestrechten Timage Objekten (Bilder) arbeite und sie genau über ein ander lege.
Dann kann ich über die Pfeiltasten den rechten und unteren Rand des Masterbildes
verschieben und erkenne direkt farbliche Unterschiede zum Aufgenommenembild. Aber
sobald ich die Bilder auf dem gesamten Bidlschirm darstellen will, funktioniert es leider
nicht mehr. Da durch die Strech Funktion ja immer das gesamte Bild in dem Timage
Objekt angezeigt wird.
Lösen wollte ich das Problem über ein drittes Timage Objekt, in dem ich dann das
gestrechte Masterbild auf dem gesamten Bildschirm darstellen lasse und in den
Hintergrund lege. Dann aus diesem den Bildbereich herraus kopiere, den ich zum
Vergleich brauche z.b die Hälfe oder 1/4 usw. des gesamt Bildes, und dieses
kopierte dann in mein Master Timage Objekt rein lege zum Vergleich. Was kopiert wird
wollte ich dann über die Größe und die Position des Masterbild Timage Objektes
festlegen.Doch leider weiß ich nicht wie ich z.B nur die linke oberer Ecke des
gestrechten Masterbildes kopierer und diese dann in das andere Timage Objekt ablege.
Da hoffe ich auf Hilfe und wie gesagt in der Kylix-Hilfe stand irgend was von dem
Befehl "Copy Rect" aber wie setze ich den ein und ist das überhaupt der richtige?


MfG
Ingo1
 
Entschuldige die verspätete Antwort, aber ich glaube, ich weiß, was du willst. Also zunächst bist du schon mal auf dem richtigen Weg. Wenn du deinen Master gestretcht darstellst und dann vom gestretchten Master nur einen bestimmten Bereich auf das Bild abbilden willst, dann geht das tatsächlich mit CopyRect, wobei jedoch gerade die TImage-Komponente eine Fiesheit aufweist: Sie hat (so weit ich das bislang festgestellt habe) mindestens zwei TCanvas-Objekte: Einmal den Canvas der visuellen Komponente. Das ist das, was gestretcht dargestellt wird. Und einmal den Canvas der eigentlichen Bitmap. Denn das Bild in einem TImage ist im Verhältnis 1:1 abgelegt, wenn es gestretcht dargestellt wird, dann wird das Stretching von der Komponente übernommen und auch in der Komponente dargestellt, aber das in der Komponente gespeicherte Bild bleibt davon unberührt. Kurz: Canvas von in TImage gespeichertes Bild <> Canvas von in TImage angezeigtes Bild.
Daher muß sich der CopyRect auch auf den Canvas des angezeigten Bildes beziehen.

Codetechnisch würde das ungefähr so ausschauen:

Code:
var
  Source, Dest: TRect;
begin
  // Vom gestretchten Master wird von links oben ein 200 x 200 Pixel Quadrat verwendet.
  Source := Rect(0, 0, 200, 200);
  // Das wird beim anderen Bild auf die Position 100, 100 gelegt, in gleicher Breite und
  // Höhe wir der kopierte Teil
  Dest := Rect( 100, 
                100, 
                100 + (Source.Right - Source.Left), 
                100 + (Source.Bottom - Source.Top));

  // Das Durchführen des eigentlichen Kopierens. Bild ist dabei das Vergleichsbild,
  // das als TImage angezeigt wird.

  // Version 1: Der _gestretchte_ Teil des Masters wird direkt in die Originalaufnahme
  // von Bild gelegt. Wenn Bild auch gestretcht ist, dann wird der _gestretchte_
  // Masterausschnitt dadurch implizit nochmal gestretcht.
  Bild.Picture.Bitmap.Canvas.CopyRect(Dest, Master.Canvas, Source);

  // Version 2: Der _gestretchte_ Teil des Masters wird auf die angezeigte
  // Originalaufnahme von Bild gelegt. Dabei ist es egal, ob Bild jetzt gestretcht ist oder
  // nicht, der Masterausschnitt wird einfach "drübergepinselt".
  Bild.Canvas.CopyRect(Dest, Master.Canvas, Source);
end;

Ich hoffe, das hilft evtl. weiter.
 

Neue Beiträge

Zurück