gtkmm: threshold beim Image
-
hi!
ich bins mal wieder! und zwar geht es diesesmal um das verändern eines bildes. und zwar will ich mir mein eigenes thresholding machen. ich weiß aber nicht wie ich die bilder verändern kann mit gtk. ich weiß halt nicht wie ich auf einzelne pixel eines bildes zugreifen kann. wäre nett wenn mir da mal einer helfen könnte.
folgender code zeigt wie ich mir es in etwa gedacht habe.
//header #ifndef WORKWINDOW_H_ #define WORKWINDOW_H_ #include <gtkmm.h> class WorkWindow : public Gtk::Window { private: Glib::RefPtr<Gdk::Pixbuf> m_Pixbuf; Gtk::Image m_Image; public: WorkWindow(); ~WorkWindow(); }; #endif //source #include "WorkWindow.h" WorkWindow::WorkWindow() { set_position(GTK::WIN_POS_CENTER); m_Pixbuf = Gdk::Pixbuf::create_from_file("test.jpg"); .............. .............. .............. m_Image.set(m_Pixbuf); add(m_Image); show_all_children(); } WorkWindow::~WorkWindow() { } //main #include <gtkmm.g> #include "WorkWindow.h" int main(int argc, char *argv[]) { Gtk::Main kit(argc, argv); WorkWindow window; Gtk::Main::run(window); return 0; }
in den ......... zeilen fehlt halt der code zum ändern der einzelnen pixel. nur weiß ich leider nicht wie.
-
Hallo,
um Bilder zu manipulieren, nimmt man normal Gdk::Image. Da gibt's auch 'ne get_pixel(x,y) Methode.
Das Gdk::Pixbuf bietet zwar auch get_pixels, aber halt alles an einer Wurst. Normalerweise konvertiert man eher ein Image in ein Pixbuf, um das dann anzuzeigen.MfG
GPC
-
ok, dann werde ich das mal damit versuchen.
ich bin echt froh das mir hier ständig geholfen wird
fettes lob an GPC und natürlich auch an dieses forum!!!!
edit:
also irgendwie bekomme ich das nicht hin. ich weiß auch ehrlich nicht wo ich genau anfangen soll. für einen kleinen beispielcode bei dem ein pixel von einem bild geändert wird wäre ich wirklich sehr dankbar. bin schon fast am verzweifeln. ich dachte ich komme heute morgen ein wenig weiter. aber dem ist nicht so. ich muß gleich zur arbeit und werde deswegen heute abend wohl erst wieder reinschauen können. also, wäre wirklich nett wenn du mir da weiterhelfen könntest.
-
shorty_76 schrieb:
also irgendwie bekomme ich das nicht hin. ich weiß auch ehrlich nicht wo ich genau anfangen soll. für einen kleinen beispielcode bei dem ein pixel von einem bild geändert wird wäre ich wirklich sehr dankbar. bin schon fast am verzweifeln. ich dachte ich komme heute morgen ein wenig weiter. aber dem ist nicht so. ich muß gleich zur arbeit und werde deswegen heute abend wohl erst wieder reinschauen können. also, wäre wirklich nett wenn du mir da weiterhelfen könntest.
Sorry, von Bildbearbeitung habe ich keine Ahnung.
Ich kann dir nur sowas anbieten:
guint pixel = m_Image.get_pixel(0,0); pixel = ~pixel; //Hier wäre dann eine sinnvollere Aktion von nöten :) m_Image.set_pixel(0,0);
Ich habe bisher noch nie was damit gemacht. Schau dir die Doku auf den von mir verlinkten Seiten durch oder versuch's auf der Mailingliste.
-
mein problem ist das erstellen eines Gdk::Image. ein Gtk::Image bekomme ich ja noch hin. aber ich weiß nicht so recht wie ich es anstelle ein Gdk::Image zu erstellen. aus der doku werd ich nicht ganz schlau bzw. ich kann es nicht umsetzen. und ein richtiges beispiel dazu finde ich auch nirgens. die einzelnen methoden des Gdk::Image habe ich mir schon angeschaut. und das wäre genau das was ich brauche.
-
ka, ich kann mal einen Bekannten fragen, ob er sich das anschaut. Er hat viel mit Bildbearbeitung und GTK+ gemacht (lässt sich ja leicht übertragen). Mir selber fehlt die Zeit, mich näher mit diesem, mir unbekannten, Thema zu befassen.
-
das wäre sehr sehr nett.
-
Moin Shorty, moin GPC!
shorty_76 schrieb:
mein problem ist das erstellen eines Gdk::Image. ein Gtk::Image bekomme ich ja noch hin. aber ich weiß nicht so recht wie ich es anstelle ein Gdk::Image zu erstellen. aus der doku werd ich nicht ganz schlau bzw. ich kann es nicht umsetzen.
Das erste, was die Doku (GPCs Link) zum Thema Gdk::Image sagt ist folgendes:
"It has now been superceded" - auf Deutsch: veraltet - nicht mehr benutzen.
Kurz: RTFM
Du sollst ein Gdk::Drawable benutzen. Drawable ist eine Basisklasse Grafiken. Für Offline-Grafiken ist Gdk::Pixmap zuständig.
Die Aufrufe an Gtk/Gdk sind allerdings relativ teuer. Ich habe mir dafür eine eigene Klasse geschrieben, bearbeite die Bitmaps in meiner Klasse und kopiere die Daten dann in eine Gdk::Pixmap oder ein Gdk::Window.
-
ich würde sehr gerne deine klasse benutzen. mußt mir nur sagen wo ich die her bekokmme
-
shorty_76 schrieb:
ich würde sehr gerne deine klasse benutzen. mußt mir nur sagen wo ich die her bekokmme
Liegt auf meinem SVN-Server, aber das hilft Dir jetzt auch nicht.
Das ist nicht nur eine Klasse, das sind eine ganze Reihen Klassen, weil ich sehr vieles neu selbst definiere und das ganze über mehrere Hirachien geht, so dass Pixmaps und meine Bitmaps identisch funktionieren und über identische Manipulationsfunktionen verfügen. Das meiste davon brauchst Du vermutlich gar nicht.
Weiterhin ist die Klasse in Gtk+ implementiert und nicht GTKMM.Für Dich ist lediglich die Bitmap wichtig, die Du in einem Format halten musst, das von GTK verstanden wird.
Eine BitMap abzubilden ist sehr einfach, Du holst Dir einfach ein entsprechend großes Array.
Packst Du nun die Größe der BitMap in eine Klasse und implementierst noch ein paar einfache Zeichenfunktionen, hast Du alles, was Du brauchst.gdk_draw_gray_image() und gdk_draw_rgb_image() musst Du in der entsprechenden Abbildung unter GTKMM suchen.
Zumindest in der GTK-Dokumentation findest Du beschrieben, wie Du Dein Array organisieren musst, damit GTK Deine Bitmap versteht.Wenn Du Schwierigkeiten mit der Implementierung hast, kannst Du Deine Frage an diesen Thread packen, das Forum mailt mir dann.
Viel Erfolg.
-
Hi Xin!
Erstmal danke das du mir helfen willst und sorry das ich erst jetzt wieder was schreibe, aber ich hatte die Tage viel auf der Arbeit zu tun.
Ich muß leider sagen, das ich mit der ganze Thematik nicht so zurecht komme. Ich bräuchte wirklich nen Beispielcode, in dem ein Bild eingelesen und verändert werden kann. Ich würde mich echt freuen, wenn du mir dabei helfen könntest bzw wenn du so ein code schreiben könntest. Ich weiß das es wahrscheinlich arbeit bedeutet für dich (ich hoffe aber nicht so viel) und wäre dir wirklich dankbar. Weil sonst glaube ich bekomme ich es nicht hin. Mir fehlt wirklich schon der Ansatz wie ich an die Sache rangehe. Und ich finde die Doku ist nicht gerade sehr hilfreich und auch sonst findet man nichts im netz.
Also, wie gesagt, wäre nett, wenn du mir da helfen würdest.
Gruß!
ein mittlerweile total verzweifelnder shorty
-
shorty_76 schrieb:
Erstmal danke das du mir helfen willst und sorry das ich erst jetzt wieder was schreibe, aber ich hatte die Tage viel auf der Arbeit zu tun.
Kein Problem.
shorty_76 schrieb:
Ich muß leider sagen, das ich mit der ganze Thematik nicht so zurecht komme. Ich bräuchte wirklich nen Beispielcode, in dem ein Bild eingelesen und verändert werden kann. Ich würde mich echt freuen, wenn du mir dabei helfen könntest bzw wenn du so ein code schreiben könntest.
Folgenden Beispielcode hbae ich damals aus dem Inet geladen, der mir half:
/* gcc -o drawi drawi.c `gtk-config --libs --cflags` */ #include <stdio.h> #include <stdlib.h> #include <gtk/gtk.h> static GtkWidget *drawingarea = NULL; static GdkPixmap *pixmap = NULL; static gint area_event (GtkWidget * widget, GdkEventExpose * event, gpointer client_data) { /* Beim Expose-event Pixmap zeichnen */ gdk_draw_pixmap(widget->window, widget->style->fg_gc[GTK_STATE_NORMAL], pixmap, 0, 0, 50, 50, 100, 100); return TRUE; } int main(int argc, char **argv) { GtkWidget *window; GdkColormap *colormap; GdkGC *gc; GdkColor red, green, *bg; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (window), "Roter/Gruener Wuerfel"); gtk_window_set_policy (GTK_WINDOW (window), TRUE, TRUE, TRUE); gtk_signal_connect (GTK_OBJECT (window), "destroy", (GtkSignalFunc) gtk_main_quit, NULL); /* Ein Widget zum "Zeichenbereich" erzeugen - das Signal "expose-event" abfangen */ drawingarea = gtk_drawing_area_new (); gtk_drawing_area_size (GTK_DRAWING_AREA (drawingarea), 200, 200); gtk_widget_set_events (drawingarea, GDK_EXPOSURE_MASK); gtk_signal_connect(GTK_OBJECT (drawingarea), "expose-event", (GtkSignalFunc) area_event, (gpointer) drawingarea ); /* Alles verpacken */ gtk_container_add (GTK_CONTAINER (window), drawingarea); gtk_widget_show (drawingarea); gtk_widget_show (window); /* By now, the drawingarea widget has been realized, meaning that * its window and colormap have been assigned. We may now create * pixmaps and allocate colors, which depend on this information. */ /* Nach dem der "Zeichenbereich" festgelegt ist, benötigen wir die Colormap dieses Bereiches */ colormap = gdk_window_get_colormap (drawingarea->window); /* Rote Farbe erstellen */ red.red = 0xffff; red.green = 0; red.blue = 0; /* Speicher reservieren und zur Colormap hinzufügen */ gdk_color_alloc (colormap, &red); /* Dasselbe in grün ... */ green.red = 0; green.green = 0xffff; green.blue = 0; gdk_color_alloc (colormap, &green); /* für den Hintergrund */ bg = &drawingarea->style->bg[GTK_STATE_NORMAL]; /* Ein Pixmap erzeugen mit zwei farbigen Würfeln */ pixmap = gdk_pixmap_new( drawingarea->window, 100, 100, -1 ); /* Jetzt benötigst Du den Grafikkontex (Gdkgc) - also erzeugst du einen */ gc = gdk_gc_new (drawingarea->window); /* Nachdem Du den Grafikkontex hast, kannst Du loslegen mit dem Zeichenfunktionen */ gdk_gc_set_foreground (gc, bg); gdk_draw_rectangle (pixmap, gc, TRUE, 0, 0, 100, 100); gdk_gc_set_foreground (gc, &red); gdk_draw_rectangle (pixmap, gc, TRUE, 0, 0, 75, 75); gdk_gc_set_foreground (gc, &green); gdk_draw_rectangle (pixmap, gc, TRUE, 25, 25, 75, 75); gtk_main (); exit (0); }
Damit kannst Du in jedem Fall grundsätzlich schonmal sehen, wie man eine Grafik in GTK+ erstellen bzw. verändern kann. Spiel erstmal ein wenig damit rum, wenn Du in GTKmm arbeiten möchtest, schreibe es in GTKmm um, um erstmal Erfahrungen mit GTK(mm) zu sammeln.
Mit der Zeit wird die API auch leichter zu lesen - man man gewöhnt sich halt dranshorty_76 schrieb:
Ich weiß das es wahrscheinlich arbeit bedeutet für dich (ich hoffe aber nicht so viel) und wäre dir wirklich dankbar. Weil sonst glaube ich bekomme ich es nicht hin. Mir fehlt wirklich schon der Ansatz wie ich an die Sache rangehe. Und ich finde die Doku ist nicht gerade sehr hilfreich und auch sonst findet man nichts im netz.
Der richtige Ansatz wird unter GTK+ vermutlich PixBufLoader sein.
Alternativ befrage man google, mein erster Versuch mit "Load Image GDK" liefert als erstes Ergebnis eine Möglichkeit für GTKmm. Ich hab's nicht genau nachgelesen, aber es gibt im Netz definitiv Beispiel-Quelltexte und Tutorien.shorty_76 schrieb:
Also, wie gesagt, wäre nett, wenn du mir da helfen würdest.
Helfen gerne, doch was das Laden von Bilden angeht, so habe ich das durch eine eigene Klasse erledigt, die ein spezielleres Format liest bzw. schreibt.
-
nochmals danke für die antwort. ich werde damit ein wenig probieren und auf jedenfall nochmal posten ob ich es geschafft habe oder nicht. allerdings kann das wieder etwas dauern, weil ich im moment doch wenig zeit habe. aber es ist in bearbeitung. und danke für deine geduld.
-
shorty_76 schrieb:
nochmals danke für die antwort. ich werde damit ein wenig probieren und auf jedenfall nochmal posten ob ich es geschafft habe oder nicht.
Tu das - und schreib doch auch mal, was Du überhaupt programmierst.
shorty_76 schrieb:
allerdings kann das wieder etwas dauern, weil ich im moment doch wenig zeit habe. aber es ist in bearbeitung. und danke für deine geduld.
Kein Problem, wenn ich in der Zwischenzeit was anderes machen darf