Bildbearbeitungsprogramm erstellen (Gimp/Photoshop)
-
Hallo,
ich versuche gerade ein GIMP/Photoshop (>Paint) Programm zu schreiben.
Das Programm soll keine GIMP Nachmache oder Konkurrenz sein, einfach ein kleines Bildbearbeitungsprogramm.Jetzt treffe ich auf zwei Probleme:
Problem 1: Das Program soll mehrere Bild-Ebenen haben (wie bei GIMP) die alle angezeigt werden. Wie kann ich diese Ebenen realisieren?
In PictureBox kann ich ja nur ein Bild laden, und wenn ich mehrere PictureBox'en nehme, dann wird wohl die oberste PB die unteren überdecken auch wenn das Bild halb transparent ist.Problem 2: Das Programm soll auch einen Auswahl-Rahmen haben. So ähnlich wie auf der Desktopoberfläche (Linke Maus "klick", Maus bewegen, "Auswahlrahmen sehen"
).
Den Auswahlrahmen habe ich mal mit Panel erstellt und auf dem Panel dann mit DrawRectangle einen Rahmen gezeichnet. Wenn ich jetzt ein Bild lade und den Auswahlrahmen zeichne dann sehe ich auch den Rahmen aber auch die Hintergrundfarbe (die ich nicht eingestellt habe) des Panel's auf dem Bild, was natürlich nicht toll ist.
Kann man den Panel nicht transparent erstellen, oder wie löse ich das?
-
Das muss doch einer wissen :).
-
Jetzt habe ich, um zwei Bild-Ebenen zu simulieren, eine zweite PictureBox eingefügt.
Zuerst lade ich die beiden Bild als Bitmap in meine struct.
imagePlains[0]->image = gcnew Bitmap("../../images/verlassen.jpg"); imagePlains[1]->image = gcnew Bitmap("../../images/down_pic3.gif");
Und dann füge ich, in den beiden Paint-Ereignisen, die Bilder in die PictureBox'en ein.
private: System::Void pictureBoxScreen_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) { if(imagePlains[0] != nullptr){ pictureBoxScreen->Image = imagePlains[0]->image; } } private: System::Void pictureBox1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) { if(imagePlains[1] != nullptr){ pictureBox1->Image = imagePlains[1]->image; } }
Die Bilder werden auch eingefügt. Wenn ich die unterste (die erste) PictureBox bewege (also PictueBox->Left = e->X und PictureBox->Top = e->Y) dann bewegt sich die PictureBox auch doch wenn ich die andere PictureBox auswähle und dann bewege (wie die erste) dann bewegt sich die auch aber wird nicht aktualisiert, die übermalt dann die erste PictureBox. Und wenn ich dann wieder die erste PictureBox bewege, dann passiert mit ihr das gleich, die übermal dann sich selbst und die Umgebung wo die war mit ihrem Rahmen. Wenn ich dann das Programm Fenster etwas bewege dann wird alle normal dargestellt also nicht mehr verschwommen.
Ich hab auch ein Zähler in den Paint-Ereignis der ersten PictureBox eingefügt und wenn ich das Bild lade, dann läuft der Zahler. Wenn ich aber die ander (zweite) PictueBox anklicke und dann bewege dann hört der Zähler auf zu laufen. Der läuft dann wieder solange ich das Fenster der Programms bewege.
Ich hab auch mal versucht in dem MouseMove-Ereignis der ersten PictureBox den Paint-Ereignis zu starten (also wenn ich die Maus bewege dann wird Paint ausgeführt), der Zähler lief dan weiter, doch die PictureBox wurden nicht neu gezeichnet, wenn ich aber wieder das Fenster bewegt habe dann wurden die beiden PictureBox'en wieder neu gezeichnet.Bei einer PictueBox hatte ich keine Problemme, die wurde also immer neugezeichnet (im Paint-Ereignis), doch mit zwei PictueBox'en geht das nicht mehr, ist C++/CLI/Programm überfordert?
-
Hallo,
weiß das denn niemand
hab hier ein bild http://r0m3o.r0.funpic.de/gimp.jpg, sowas will ich erstellen.
Da sind zwei Bilder, das Wasser und der Apfel, das Apfel-Bild ist zu häfte transparent und man kann das Wasser sehen.
Und da ist noch eine Auswahl.Läst sich das überhaupt mir WindowsForms erstellen oder soll ich das lieber mit SFML, Qt oder so machen?
Weiß nicht weiter
-
ghostboss schrieb:
Läst sich das überhaupt mir WindowsForms erstellen oder soll ich das lieber mit SFML, Qt oder so machen?
Das würde mich auch interessieren ob man das so mit WindowsForms hinbekommt und ob das ganze Sinn macht.
Ansonsten hab ich gelesen das Adobe mit Qt arbeitet...
-
Zu aller erst würde ich bei einer Picturebox bleiben. - Am Ende soll es ja ein Bild werden richtig?
Schau dir mal die Funktionsweise der GDI/GDI+ an.
Eventuell hilft dir dass ein ganzes Stück weiter. - Wo genau du ansetzen musst kann ich dir so nicht sagen, da ich in GDI+ auch noch nicht so wirklich der Held bin.
-
Hallo,
dachte schon das mein Beitrag unsichtbar ist
, also danke für die Antworten.
Ich hab da was bei GDI+ gefunden aber nur kurz überflogen, werde in der nächsten Woche da reinschauen und dann meine Lösung hier präsentieren, falls das jemanden interessiert (weil, hab selbst im google nichts vernünftiges darüber gefunden).
-
ich würde, um das ebenenproblem zu lösen, dreidimensionale Arrays anlegen, ungefähr nach dem folgenden Schema:
int ebene1[x-Länge][y-Länge][RGB];
(ich weiß, das ist C/++ und nicht CLI, aber ich habe keinen Plan mehr, wie man das in CLI macht. geht aber sicher so ähnlich. irgendwas mit array<int,640,480,3>^ oder so) die kann man dann ja in ein array basteln, was alle ebenen auf einmal hat. da wird dann zuerst ebene10 reingeschrieben (for each oder sowas) dann ebene 9 usw. dann musst du nur noch eine funktion schreiben, die dir die Arrays in bitmaps konvertiert (was win**** im zweifelsfall sogar hat), und das wärs.
mit dem auswahlrahmen...da ist es wohl schon schwieriger. vielleicht kann man ja wirklich per GDI+ ein rechteck zeichnen, was um die Maus rum ist. dann müsste man wissen, wie die Mauskoordinaten zu den Bildkoordinaten stehen und die dann rausrechnen. aber, viel spaß bei deinem projekt und ich wünsche dir viel erfolg dabei.gruß,
lauritz
-
LauritzG schrieb:
int ebene1[x-Länge][y-Länge][RGB];
wozu das [RGB] ?? ... int ist schon 32 Bit .. da kannst Du super die 8 Bit für die einzelnen Kanäle unterbringen ... hast sogar noch 8 Bit für Alpha übrig ... anschließend kannst Du das super zu einem Image konvertieren ... dazu gibt es eniges hier im Forum bzw. im Internet
-
jaja, soweit hatte ich jetzt nicht gedacht, aber im prinzip ist es ja das gleiche. (mehr oder weniger). aber deine variante ist natürlich billiger vom speicher her. man könnte auch char nehmen und dann RGB machen.