Изменение отдельных пикселей Gtk.Image - PullRequest
4 голосов
/ 21 ноября 2011

Я пытаюсь установить отдельные пиксели на виджете Gtk.Image. В документации говорится, что свойство ImageProp объекта Gtk.Image возвращает Gdk.Image, которое, кажется, позволяет редактировать отдельные пиксели, но всякий раз, когда я использую это, оно возвращает только ноль.

Мое решение до сих пор состоит в том, чтобы загрузить изображение с диска как System.Drawing.Bitmap, отредактировать его, сохранить во временный файл, а затем загрузить обратно в Gtk.Image, но это, очевидно, не идеально.

Для

Gtk.Image image = new Gtk.Image("images/test.png");
Gdk.Image gdkImage = image.ImageProp;

Почему gdkImage всегда нулевой?

Само изображение загружается и отображается правильно.

Ответы [ 2 ]

1 голос
/ 01 декабря 2011

Хотя у меня нет предыдущего опыта работы с GTK # или C #, основываясь на том, что я мало знаю о Gtk и о том, что я могу посмотреть в Интернете, я попытаюсь предоставить некоторые входные данные.
Вы можете получить Gdk.Imageдля Gtk.Image только в том случае, если вы создали Gtk.Image из Gdk.Image с использованием упомянутого свойства, в противном случае вы получите null, как в случае, когда вы создаете его из файла, или в соответствии с предложением, создавая его изGdk.Pixbuf.В данном случае вы можете попытаться получить Gdk.Image из Gdk.Drawable, используя метод Gdk.Drawable.GetImage или метод Gdk.Image.Get.Вы можете использовать GdkWindow, связанный с Gtk.Image как Gdk.Drawable в упомянутых случаях.Чтобы Gdk.Window был действительным, виджет должен быть показан или реализован.Но вполне вероятно, что вы можете закончить с null в обоих случаях.
Примечание: GdkImage API не рекомендуется использовать в новых версиях Gtk , обратите внимание, что может В случае с GTK # это не так.
Таким образом, было бы неплохо использовать Gdk.Pixbuf вместо этого.Можно получить пиксели для GdkPixbuf и изменить их в GTK.Но, к сожалению, похоже, что в случае GTK # это конкретное свойство (пиксели) из Gdk.Pixbuf сделано только для чтения.Один из вариантов может использовать Gdk.Pixdata из Gdk.Pixbuf, который создается из изображения, изменять пиксели, используя методы из Gdk.Pixdata, создавать из него Gdk.Pixbuf и копировать его обратно в оригиналGdk.Pixbuf.К сожалению, я не могу быть уверен в этом, но вы можете попробовать.
В качестве альтернативы вы можете рассмотреть вопрос о Gdk.Drawable.Существуют примеры, в которых Gdk.Drawable, связанный с Gtk.Widget (обычно Gtk.DrawingArea), обновляется в обратном вызове Expose Event.
Я надеюсь, что предоставленная информация может предоставить вам некоторый указатель для продолжения.

0 голосов
/ 29 ноября 2011

Использование Pixbuf сначала:

Gdk.Pixbuf pixbufImage = new Gdk.Pixbuf(@"images/test.png");
Gtk.Image gtkImage = new Gtk.Image(pixbufImage);
Gdk.Image gdkImage = gtkImage.ImageProp;
...