更改 Gtk.Image 的各个像素

本文关键字:像素 Gtk Image 更改 | 更新日期: 2023-09-27 18:15:15

我正在尝试在Gtk.Image小部件上设置单个像素。文档指出,Gtk.Image 的 ImageProp 属性返回一个 Gdk.Image,它似乎允许您编辑单个像素,但每当我使用它时,它只返回 null。

到目前为止,我的解决方案是从磁盘加载图像作为System.Drawing.Bitmap,对其进行编辑,将其保存到临时文件中,然后将其加载回Gtk.Image,但这显然并不理想。

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

为什么 gdkImage 总是为空?

图像本身正确加载和显示。

更改 Gtk.Image 的各个像素

虽然我之前没有GTK#或C#的经验,但基于我对Gtk的了解以及我可以在网上查找的内容,我将尝试提供一些输入。
仅当您使用上述属性从Gdk.Image创建Gtk.Image时,您才能获得Gtk.ImageGdk.Image,否则您将获得null,就像您从文件创建它一样,或者按照从Gdk.Pixbuf创建它的建议。在当前情况下,您可以尝试使用Gdk.Drawable.GetImage方法或使用Gdk.Image.Get方法从Gdk.Drawable获取Gdk.Image。在上述情况下,您可以使用与Gtk.Image相关的GdkWindow作为Gdk.Drawable。为了使Gdk.Window有效,小部件应该已经显示或实现。但在这两种情况下,您很可能会以null结尾。
旁注:GdkImage API 在较新版本的 Gtk 中被弃用,但请注意,在 GTK# 的情况下可能还没有。
因此,改用Gdk.Pixbuf可能是个好主意。可以获取GdkPixbuf像素并在 GTK 中修改相同的像素。但不幸的是,在 GTK# 的情况下,Gdk.Pixbuf的特定属性(像素(似乎是只读的。一种选择可能是使用从图像创建的Gdk.Pixbuf中的Gdk.Pixdata,使用Gdk.Pixdata中的方法修改像素,从中创建Gdk.Pixbuf并将其复制回原始Gdk.Pixbuf。不幸的是,我不能确定这一点,你可以试一试。
或者,您可以考虑绘制Gdk.Drawable。有一些示例可用,其中与Gtk.Widget(通常Gtk.DrawingArea(相关的Gdk.DrawableExpose Event回调中更新。
我希望所提供的信息可以为您提供一些继续的指示。

首先使用Pixbuf

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