TImage mit CopyRect
-
Hallo!
Ich habe folgendes Problem. Auf meiner Form sind zwei TImage Objekte. Im ersten TImage wird ein Bild geladen.Nun will ich mit der Maus in Image1 ein Rechteck ausschneiden und den Bildausschnitt in Image2 kopieren.
Wenn Image1 das volle Bild anzeigt (autosize auf true) klappt das auch.
Nun will ich aber das Bild nicht in voller Grösse anzeigen und stelle deshalb in Image1 AutoSize auf false, sodass das Bild in das vorgegebene Grösse von Image1 kopiert wird.
Dann klappt aber das Ausschneiden nicht mehr richtig. Der Ausschnitt wird an ganz anderer Stelle gemacht. Warum?Das zweite Problem ist wenn ich die linke Maustaste gedrückt halte und die Maus bewege ziehe ich ein Rechteck über das Bild, dass beim Bewegen der Maus ziemlich stark flimmert. Wie bekomme ich das Flimmern weg?
Hier noch bissl Code:
void __fastcall TForm1::SchneidenButtonClick(TObject *Sender) { TRect rectSource,rectDest; rectSource.Left = iLeftX; rectSource.Top = iLeftY; rectSource.Bottom = iOldY; rectSource.Right = iOldX; Image2->Picture->Bitmap = NULL; // Delete old Bitmap Image2->Width = iOldX - iLeftX; Image2->Height = iOldY - iLeftY; rectDest = Rect(0, 0, Image2->Width, Image2->Height); Image2->Canvas->CopyRect(rectDest,Image1->Canvas,rectSource); } //--------------------------------------------------------------------------- // Anfangspunkt zeichnen void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { // altes Rechteck löschen Image1->Canvas->Rectangle(TRect(iLeftX,iLeftY,iOldX,iOldY)); // linke Coordinaten für den Ausschnitt iLeftX = X; iLeftY = Y; // zeichnen auf true setzen bPaint = true; } //--------------------------------------------------------------------------- void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { iOldX = iRightX = X; iOldY = iRightY = Y; // zeichnen auf false setzen bPaint = false; } //--------------------------------------------------------------------------- void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { if(bPaint) { // altes Rechteck überzeichnen Image1->Canvas->Rectangle(TRect(iLeftX,iLeftY,iRightX,iRightY)); } // neue Koordinaten iRightX = X; iRightY = Y; // neues Rechteck zeicnen if(bPaint) { Image1->Canvas->Rectangle(TRect(iLeftX,iLeftY,iRightX,iRightY)); } }
Bin für jede Hilfe dankbar
Edit:
Bitte die Code-Tags benutzen. Danke!
-
-
Kann ich nicht nachvollziehen, funktioniert einwandfrei.
-
Sieh im Forum mal nach DoubleBuffered bzw. DoubleBuffering um.
-
Bitte die Faustregel beachten: ein Thema pro Thread, ein Thread pro Thema.
-
-
Das FALSCHE Ausschneiden ist ok!!!
Du zeigst das Bild kleiner/groesser an als es ist - AutoSize=false!
Deine Maus zeigt aber Bildschirmkoordinaten!Du musst den Stretchfaktor fuer X und Y ermitteln und damit die Mausposition korrigieren! Intern hat das Bild die Pixelgroesse der Datei - Es wird nur GESTRETCHT angezeigt!
Zum Flackern: DoubleBuffering?