Rasterung im Bildeditor
-
Hallo zusammen,
mich würde interessieren, wie man ein Raster erzeugen kann, so wie es im Bildeditor von Borland Builder 5 verwendet wird.
Wenn man ein neues Bitmapbild anlegt, und etwas hineinzoomt, dann wird ein Raster eingeblendet.Dieses möchte ich gerne für meine Anwendung (Zeichenprogrogramm mit Bitmaps)
auch verwenden.
Mein Problem ist aber, dass ich beispielsweise mit einem Mausklick ein Pixel einfärbe. Die Rasterlinie dürfte aber höchsten 1/10 der Pixelfläche einnehmen.Kann mir da vielleicht jemand weiterhelfen
DANKE
-
Hmmmm. Automatisch geht das (zumindest bei den standard komponenten) wohl nicht.
Nehm dir halt einfach ne Paintbox o.ä. und skaliere selber. Z.B. Sobald der "Pixel" größer als 3x3 gezoomt wird, zeichnest du einfach ein Gitter mit (bzw. nur das Stückle Gitter vom geklickten Pixel - geht schneller). Mußt dich halt nur entscheiden, wo selbiges gezeichnet werden soll, also z.B. immer am unteren und rechten Rand der gezoomten Pixel. Anders machts der Bildeditor auch nich. Hab jetzt grad die CD nicht zur Hand, aber ich hätte gedacht, der wäre sogar mir Sourcecode drauf.
-
Hallo Postman,
erstmal Danke ich dir für deine Hilfe.
Es gibt da aber noch ein klizekleines Problem:- Ich setzte mit dem Mausklick ein Pixel auf meinem Bitmap.
- Danach übergebe ich das Bitmap einem TImage- Object.
- Dann zoome ich das TImage mit der Funktion SetBounds(...), wobei Stretch = true ist. (Weiß sonst keine andere Lösung, um mein Bild zu zoomen)Wie soll ich denn da der linke und der obere Rand meines Pixel mit einem Gitter versehen. Ich kann das Pixel doch nicht in mehrere Teile spalten !! oder ?
Für weitere Hilfen danke ich euch
-
Nun, du könntest das Bild offscreen laden und dann mittels TCanvas::StretchDraw zoomen. (Vergrößert in dein Image zeichnen) Dann kannst du auch dein Raster mit einbauen.
-
Einen wunderschönen guten Morgen zusammen,
Erstmal Danke ich dir Dasd für deinen Tipp.
Leider habe ich ihn wohl noch nicht so ganz verstanden:
Mein Bild Ofscreen laden ist klar, aber wie soll ich denn da nun ein Raster einzeichenen können ?Könntest du mir evtl. deine Lösung etwas genauer erläutern !
Vielen Dank dafür.
Gruß
-
Also:
* du erstellst eine Instanz von Graphics::TBitmap (mittels new).
* In diese lädst du dein Bild
* Dann nutzt du StretchDraw, um den vergrößerten Ausschnitt in dein Image zu zeichnen
* Und zum Schluss malst du dein RasterDu kannst auch noch ein zweites Offscreen-Bitmap erstellen und zunächst alles da reinzeichnen, bevor du es deinem Bild zuweist.
Wichtig ist nur, dass du dann die Mauskoordinaten mittels deiner Vergrößerung umrechnest, da diese ja dann nicht mehr stimmen.
-
Hallo zusammen,
Herzlichen Dank "Dasd" für deine Hilfe, meine ganzen Probleme haben sich gelöst.
Es funktioniert.DANKE

-
Hallo nochmal,
jetzt hätte ich da doch nochmal eine Frage:
So sieht meine Funktion aus, mit der ich das Bitmap, in welches ich gezeichnet habe an ein Image1 übergebe.void __fastcall TForm1::BitmapanImage() { Graphics::TBitmap *Bit = new Graphics::TBitmap; //Erzeugen des Objektes Bit Bit->Width = Image1->Width/zoom; //Größe von Bit festlegen Bit->Height = Image1->Height/zoom; Bit->Canvas->CopyRect(Rect(0, 0, Image1->Width/zoom, Image1->Height/zoom), Bitmap->Canvas, Rect(0, 0, BereichX, BereichY); //Kopieren eines bestimmten Bereich meines Bitmap nach Bit Image1->Canvas->StretchDraw(Image1->Canvas->ClipRect, Bit); //Mittels StrechtDraw das Bit an Image1 übergeben. delete Bit; } //----------------------------------------------------------------Punkte, bzw. Linien zeichne ich in den Methoden "Image1MouseDown(...) und Image1MouseMove(...).
Jetzt habe ich nur das Problem, wenn ich das Image1 relativ groß mache (Breite 1024, Höhe 768 Pixel)und schnell Linien zeichne, dann ist die CPU Auslastung bei 100 % und das Zeichnen geht auch nur noch langsam von statten.
Beim Bildeditor von Borland oder im Paint von Microsoft, ist dies alles kein Problem, deshalb schieße ich daraus, dass bei mir noch irgend ein hacken im System lauert.
Wenn mir jemand weiterhelfen könnte, wäre ich dankbar.
DANKE
-
Guten Morgen,
Ich glaube, dass ich da irgendetwas noch nicht so ganz richtig mache, denn mein Zeichenprogramm braucht immer noch recht viel Resourcen. Im Bildeditor von Borland oder in Paint von Microsoft wird die CPU beim Zeichnen kaum belastet.
Gibt es noch ein anderes Verfahren, ein Bild zu zoomen ? außer StretchDraw ???
-
Wie wäre es, wenn du mal den Quelltext deiner OnMouse... - Methoden zeigen würdest?
-
Klar, kein Problem:
Hier der Codevoid __fastcall TForm1::FormCreate(TObject *Sender) { zoom = 1; Image1 = new TImage(this); //Image erzeugen, Größe festlegen und mit weißer Farbe füllen Image1->Parent = ScrollBox1; Image1->SetBounds(10, 10, ScrollBox1->Width, ScrollBox1->Height); //ScrollBox1->Width = 20; ScrollBox1->Height = 20; Image1->OnMouseDown = Image1MouseDown; Image1->OnMouseMove = Image1MouseMove; Image1->OnMouseUp = Image1MouseUp; Image1->Canvas->Pen->Color = clWhite; Image1->Canvas->Brush->Color = clWhite; Image1->Canvas->Rectangle(0, 0, Image1->Width, Image1->Height); Bitmap = new Graphics::TBitmap(); //Bitmap erzeugen Bitmap->Width = 1000; Bitmap->Height = 500; Bitmap->Canvas->Pen->Color = clWhite; Bitmap->Canvas->Brush->Color = clWhite; Bitmap->Canvas->Rectangle(0, 0, Bitmap->Width, Bitmap->Height); } //--------------------------------------------------------------------------- void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { X = X/zoom; // X- Koordinaten an zoom anpassen Y = Y/zoom; // Y- Koordinaten an zoom anpassen Bitmap->Canvas->Pen->Width = 1; Bitmap->Canvas->Pen->Color = clBlack; Bitmap->Canvas->Pixels[X][Y] = clBlack; //Einzelnes Pixel zeichnen Bitmap->Canvas->MoveTo(X, Y); //Anfangspunkt setzen } //--------------------------------------------------------------------------- void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { X = X/zoom; // X- Koordinaten an zoom anpassen Y = Y/zoom; // Y- Koordinaten an zoom anpassen if(Shift.Contains(ssLeft)) { Bitmap->Canvas->Pen->Color = clBlack; Bitmap->Canvas->LineTo(X, Y); BitmapanImage(); } } //--------------------------------------------------------------------------- void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { BitmapanImage(); } //--------------------------------------------------------------------------- void __fastcall TForm1::BitmapanImage() { Graphics::TBitmap *Bit = new Graphics::TBitmap; //Erzeugen des Objektes Bit Bit->Width = Image1->Width/zoom; //Größe von Bit festlegen Bit->Height = Image1->Height/zoom; Bit->Canvas->CopyRect(Rect(0, 0, Image1->Width/zoom, Image1->Height/zoom), Bitmap->Canvas, Rect(0, 0, BereichX, BereichY); //Kopieren eines bestimmten Bereich meines Bitmap nach Bit Image1->Canvas->StretchDraw(Image1->Canvas->ClipRect, Bit); //Mittels StrechtDraw das Bit an Image1 übergeben. delete Bit; } //---------------------------------------------------------------- void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key) { if(Key == '\r') //Edit1 wird zur Eingabe des Zoomfaktors verwendet { if(StrToInt(Edit1->Text) > 0) { zoom = StrToInt(Edit1->Text); BitmapanImage(); } } } //---------------------------------------------------------------------------So sieht mein ganzes Projekt aus.
-
Irgendwie kommt mir es so vor, als würde ich was falsch machen. (oder kompliziert)
Linien, Pixel zeichnen und zoomen kann man doch schon so oder ?
Oder hat jemand eine bessere Idee, wie ich das bewerkstelligen könnte, dass nicht so viele Resourcen verschwendet werden. Kann mir jemand vielleicht einen Link, oder eine Tipp geben, wo ich meine Grafikprogrammierung kontrollieren könnte. (Gibt es irgendwo ein Tut über Grafikprogrammierung außer der Hilfe von Borland ?)DANKE für euer Tipps.
-
[quote="maam"]Irgendwie kommt mir es so vor, als würde ich was falsch machen. (oder kompliziert)
quote]Nein du machst es dir zu einfach!
Bei MouseMove immer BitmapanImage(); aufrufen ist zuviel des guten.
Wie währe es wenn du zusätzlich zu deinen Code
Bitmap->Canvas->Pen->Color = clBlack; Bitmap->Canvas->LineTo(X, Y);im MouseMove auch das Bitmap des Image1 unter Berücksichtigung der Skalierung
die Punkte reinmalst ? Dann erspart du deinem Programm ständig das neu erstellen des Bitmaps in der Funktion BitmapanImage();
-
Hallo VergissEs,
Danke für deinen Tipp.Nun ergibt sich aber ein Problem:
Da mein Bitmap immer der Originalgröße (unabhängig von der Skalierung) entsprach, konnte ich auf diesem einzelne Pixel setzten, beziehungsweise Linie zeichnen. Wenn ich das Bitmap dann mit StretchDraw(...) auf meine Zeichenfläche vergrößert habe, ergab sich so ein Bitmapraster. Dies habe ich jetzt nicht mehr, da ich auf dem Image ja mehrere Pixel setzten muss, bis ich ein Bitmapraster gefüllt habe.
Ich hoffe du verstehst, was ich meine.
-
Einen wunderschönen guten Morgen,
Damit dieser Thread nicht ins unendliche ausufert, hätte ich eine Bitte an euch:
Kann mir jemand vielleicht ein Tutorial, ein Link oder ein Buch empfehlen, in dem ich nachschauen könnte, wie man mit dem Borland Builder 5 ein Zeichenprogramm schreibt ?
So etwas wie der Bildeditor von Borland, oder Paint.....Was soll das Zeichenprogramm alles können:
- Pixel zeichnen
- Linien zeichnen
- markieren
- verschieben
- zoomen (so weit, damit man wirklich jedes einzelne Pixel setzen/rücksetzten kann.Irgendwie bin ich nämlich der Meinung, dass ich mich immer im Kreis drehe, oder vielleicht auch vor lauter Bäumen den Wald nicht mehr sehe.
-
Anscheinend kann mir niemand weiterhelfen ?
Bin trotzdem für jede Hilfstellung dankbar.
Ein schönes Wochenende
Gruß