I am trying to set individual pixels on a Gtk.Image widget. The documentation states that the ImageProp property of a Gtk.Image returns a Gdk.Image which seems to let you edit the individual pixels, but whenever I use this it only returns null.
My solution so far is to load the image from disk as a System.Drawing.Bitmap, edit it, save it to a temporary file, then load it back into a Gtk.Image, but this is obviously not ideal.
For
Gtk.Image image = new Gtk.Image("images/test.png");
Gdk.Image gdkImage = image.ImageProp;
Why is gdkImage always null?
The image itself loads and displays correctly.
Although I have no prior experience with GTK# or C#, based on whatever little I know about Gtk & what I could look up online, I will make an attempt to provide some inputs.
You can get Gdk.Image
for a Gtk.Image
only if you have created the Gtk.Image
from a Gdk.Image
using the mentioned property, otherwise you will get null
as in your case where you are creating it from a file or as suggested by creating it from Gdk.Pixbuf
. In current case, you could try to get Gdk.Image
from Gdk.Drawable
using Gdk.Drawable.GetImage
method or use Gdk.Image.Get
method. You can make use of GdkWindow
associated with Gtk.Image
as Gdk.Drawable
in the mentioned cases. For Gdk.Window
to be valid the widget should have been shown or realized. But it is quite likely that you may end with null
in both the cases.
Side Note: GdkImage
APIs are deprecated in the newer versions of Gtk, please note it may not be so in the case of GTK# as yet.
Thus it might be a good idea to use Gdk.Pixbuf
instead. It is possible to get pixels for GdkPixbuf
and modify the same in GTK. But unfortunately it appears that in case of GTK# that particular property (Pixels) of Gdk.Pixbuf
is made as read only. One option maybe to use Gdk.Pixdata
from Gdk.Pixbuf
which is created from the image, modify the pixels using methods in Gdk.Pixdata
, create a Gdk.Pixbuf
out of it & copy that back to the original Gdk.Pixbuf
. Unfortunately I cannot be sure about this, you can give it a shot though.
Alternatively you can consider drawing onto Gdk.Drawable
. There are examples available wherein the Gdk.Drawable
assocaited with Gtk.Widget
(usually Gtk.DrawingArea
) is updated in the Expose Event
callback.
I hope that the information provided can provide you with some pointer to proceed.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With