Zoomrechteck auf Image (ein paar Ideen gesucht)
-
Oh, ich glaube das ist nicht das was ich suchte. Das Vergößern selbst ist auch nicht das Problem, da ich den passenden Algorithmus dafür bereits habe.
Die Sache mit dem "vernünftigen" Aufziehen des Rechteckes vom interessierenden Bereich stellt mich vor ein Problem. Ich weiß, daß ich mit meiner Idee zwar das Problem lösen kann, jedoch wie ich meine auf "primitive" Weise.
-
Was genau ist mit "vernünftigen Aufziehen des Rechtecks" gemeint?
Aber erstmal ein paar Erklärungen:
Regions -> Beschränkungen eine Zeichenoperation auf einen bestimmten Bereich
Hrgn -> Das Handle einer Region, wird mit Create*Region erstellt mit SelectObject auf ein Zeichenobjekt "gelegt" und mit DeleteObject gelöscht.*bezeichnet die Form der Region z.B. CreateEllipticRgn für Kreise.
-
Das Rechteck (Auswahlrechteck) kannste zum Beispiel mittels OnMouseMove, OnMouseUp und OnMouseDown graphisch darstellen. Mittels XOR zeichnest du eine Rechteck und zeigst dem User damit die aktuelle Auswahl an. Sobald die Maus bewegt wird, überzeichnest du das alte Rechteck und an der neuen Position zeigst du das geänderte Rechteck wieder an.
-
Oder du legst ein transparentes Image auf dem du ein Rechteck zeichnest über dein Image und ziehst das mit OnMouseMove, OnMouseUp und OnMouseDown auf.
Dann brauchst du das eigentliche Bild nicht zu überzeichnen
-
"Transparentes Image" das wars was ich gesucht hatte. Meine Güte... manchmal dauert es etwas länger bis das 10 Cent Stück fällt.
Vielen Dank an Alle für die Hilfe.
-
Habe jetzt ein transparentes Image gemacht. Irgend etwas ist jedoch "verdreht". Nur das Innere des aufgezogenen Rechtecks auf Image2 was über Image1 liegt ist transparent (und zeigt das darunterliegende Bild). Der Rest wird weiss. Wie bekomme ich gesamte Image2 transparent?
Image2->Transparent->true; // habe ich schon gemacht
-
Musst du schon etwas Code zeigen, vor allen Dingen wie du das Rechteck zeichnest.
-
void __fastcall TMdiChild::Image2MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { X1 = X; Y1 = Y; } //--------------------------------------------------------------------------- // void __fastcall TMdiChild::Image2MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { X2 = X; Y2 = Y; Image2->Canvas->Rectangle(X1,Y1,X2,Y2); } //---------------------------------------------------------------------------und wenn ich Bild ind Image1 lade setze ich:
MdiChild->Image2->Transparent = true;
-
Bedeckt dein transparentes Image2 auch komplett das eigentliche Image ?
void __fastcall TForm1::Image2MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { X2 = X; Y2 = Y; Image2->Picture = NULL; Image2->Canvas->Rectangle(X1,Y1,X2,Y2); }
-
Ja, ich passe die Größe von Image2 auf Image1 an. Wenn ich die Zeile:
Image2->Picture = NULL;einfüge. Hat das nur den Effekt, daß ich nur ein Rechteck zeichnen kann (was durchsichtig ist und dort Image1 zeigt).
-
Der ganze Ansatz ist für'n A....
Sieh dir noch mal an, was Sunday vorgeschlagen hat und such ggf. nach 'rubber banding'.
-
Ich hab das jetzt mal auf die Schnelle so gemacht:
Mir ein Image auf die Form gezogen (Image1), das das eigentliche Bild enthält.
Dann ein zweites Image auf die Form (Image2).
Und dann:int X1=0,Y1=0,X2=0,Y2=0; void __fastcall TForm1::FormCreate(TObject *Sender) { Form1->DoubleBuffered = true; Image2->Transparent = true; Image2->Left = Image1->Left; Image2->Top = Image1->Top; Image2->Width = Image1->Width; Image2->Height = Image1->Height; } //--------------------------------------------------------------------------- void __fastcall TForm1::Image2MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { X1 = X; Y1 = Y; } //--------------------------------------------------------------------------- void __fastcall TForm1::Image2MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { X2 = X; Y2 = Y; Image2->Picture = NULL; Image2->Canvas->Rectangle(X1,Y1,X2,Y2); }Und das funktioniert ...
-
Jansen schrieb:
Der ganze Ansatz ist für'n A....
Sieh dir noch mal an, was Sunday vorgeschlagen hat und such ggf. nach 'rubber banding'.Begründung?
-
Ich will ja erst mal ein Rechteck auf einem transparenten Image zeichnen. Wenn das klappt kommt der nächste Schritt mit dem XOR... genau wie Sunday vorgeschlagen hat.
Zunächst scheitert es noch am Image2 komplett transparent machen, so daß trotzdem das Rechteck gezeichnet werden kann. ...und ich habe schon viel probiert mit Pencolor und Brushstyle... aber noch nicht das gefunden was ich suche.
-
Geht zwar mit einem transparenten Image genauso gut, ohne 'rubber banding' aber machen wirs mal mit, weils ja sonst für'n A... ist.

Unit1.cpp#include <vcl.h> #pragma hdrstop #include "Unit1.h" #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { Image1->Canvas->Pen->Mode = pmMask; Image1->Canvas->Rectangle(X1,Y1,X2,Y2); isset=true; isdraw=false; } void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { if(isdraw) { Image1->Canvas->Pen->Mode = pmNotXor; Image1->Canvas->Rectangle(X1,Y1,X2,Y2); X2=X; Y2=Y; Image1->Canvas->Rectangle(X1,Y1,X2,Y2); } } void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if(isset) { Image1->Picture->Assign(copy->Picture); isset=false; } else copy->Picture->Assign(Image1->Picture); X1=X; Y1=Y; X2=X; Y2=Y; Image1->Canvas->Pen->Mode = pmXor; Image1->Canvas->Rectangle(X1,Y1,X2,Y2); isdraw = true; } void __fastcall TForm1::FormCreate(TObject *Sender) { Form1->DoubleBuffered = true; copy=new TImage(Application); isdraw=false; isset=false; }Unit1.h
//--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <ExtCtrls.hpp> #include <jpeg.hpp> #include <Graphics.hpp> //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // Von der IDE verwaltete Komponenten TImage *Image1; void __fastcall Image1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y); void __fastcall Image1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y); void __fastcall Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y); void __fastcall FormCreate(TObject *Sender); private: // Anwender-Deklarationen public: // Anwender-Deklarationen __fastcall TForm1(TComponent* Owner); int X1; int Y1; int X2; int Y2; bool isdraw; bool isset; TImage * copy; }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif
-
@hellic
Vielen Dank für die Mühe, die du dir gemacht hast. Ich weiß auch nicht, was Jansen mit seiner Bemerkung: "...der ganze Ansatz ist für..." meinte. Ich finde er sollte dies auch ruhig mal näher erläutern. Weil rummäckern kann jeder... Dann sollte man auch bessere Wege aufzeigen.Ich habe auch noch nicht herausbekommen warum ich beim ersten Ansatz nur im Rechteck das Bild transparent wird. Vielleicht weiß ja hier jemand Rat.
Hier mal ein Bild, damit man weiß, was ich meine:
-
@hellic
Dir nochmals meinen Dank für deine Hilfe!!! Ich habe jetzt ein paar neue Sachen (Pen->Mode) dazugelernt. Warum das andere nicht funktionierte ist mir schleierhaft geblieben.