Gdk pixbuf 从内存加载图像

2023-12-28

使用 GTK+ 3.6 我想显示内存缓冲区中的图像,而不是磁盘上的文件。我有一个const char *data使用图像数据,我正在尝试从中创建 GTK 图像。 到目前为止,我已经尝试了两种我认为可行的方法。两者都使用GdkPixbuf,因此需要图像数据guchar* (unsigned char*).

根据这个要求,我必须转换数据:

guchar *gudata = reinterpret_cast<guchar*>(const_cast<char*>(data));

然后我尝试了以下操作:

  1. 将数据写入 Gdk Pixbuf Loadergdk_pixbuf_loader_write。这里我得到一个错误"Unrecognized image file format"或者,如果我使用特定类型 (jpg) 创建加载程序,我会收到一条错误消息,指出它不是 JPG 文件格式(确实如此,如下所述)。

    编辑:一些代码:

    guchar *gudata = reinterpret_cast<guchar*>(const_cast<char*>(data));
    int stride = ((1056 * 32 + 31) & ~31)/8;
    GdkPixbufLoader *loader = gdk_pixbuf_loader_new();
    GError *error = NULL;
    
    if(!gdk_pixbuf_loader_write(loader, gudata, data_size, &error)
    { 
        printf("Error:\n%s\n", error->message); 
    }
    

    编辑 2013 年 3 月 1 日: 从写入函数中删除了步幅参数 - 打印错误。

    开罗表面也不能正常工作。显示黑屏和噪音。

  2. 初始化 pixbufgdk_pixbuf_new_from_data然后图像看起来就像电视噪音,这表明数据错误(并且已被转换),或者其他参数错误(图像行步幅,但不是:))。

发生错误后我只是尝试将数据写入文件foo.jpg using ofstream是的,我得到了一个正常工作的图像文件。这file终端中的命令确认它是一个 JPEG 图像,并且通过一个简单的代码块,我从该 foo.jpg 创建了一个 GdkPixbuf 来检查它的行步长值,并且它与我传递给上述函数的值相匹配。

图像数据是否会因演员表而损坏,如果是这样,我该如何解决这个问题?我得到图像数据const char*。我看过 QtPixmap 它也加载unsigned char*.

我需要使用单独的库吗? (libjpeg?) 我安装了 libgtk3-dev。

谢谢你!


2012 年 3 月 1 日更新:

这是一个简单的工作应用程序,它在其附近加载一个“test.jpg”文件(文件大小必须

#include <glib.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
#include <gtk/gtk.h>

void on_destroy (GtkWidget *widget G_GNUC_UNUSED, gpointer user_data G_GNUC_UNUSED)
{
    gtk_main_quit ();
}

int main (int argc, char *argv[]) 
{
    FILE *f;
    guint8 buffer[100000];
    gsize length;
    GdkPixbufLoader *loader;
    GdkPixbuf *pixbuf;
    GtkWidget *window;
    GtkWidget *image;

    gtk_init (&argc, &argv);

    f = fopen ("test.jpg", "r");
    length = fread (buffer, 1, sizeof(buffer), f);
    fclose (f);

    loader = gdk_pixbuf_loader_new ();
    gdk_pixbuf_loader_write (loader, buffer, length, NULL);
    gdk_pixbuf_loader_close(loader, NULL);
    pixbuf = gdk_pixbuf_loader_get_pixbuf (loader);

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    image = gtk_image_new_from_pixbuf (pixbuf);
    gtk_container_add (GTK_CONTAINER (window), image);
    gtk_widget_show_all (GTK_WIDGET (window));
    g_signal_connect (window, "destroy", G_CALLBACK(on_destroy), NULL);
    gtk_main ();

    return 0;
}

原答案:

The char * or unsigned char *这里并不重要。

gdk_pixbuf_new_from_data http://developer.gnome.org/gdk-pixbuf/stable/gdk-pixbuf-Image-Data-in-Memory.html#gdk-pixbuf-new-from-data只会读取带 Alpha 通道 (RGBA) 或不带 Alpha 通道 (RGB) 的未压缩 RGB 数据(唯一支持的颜色空间是 GDK_COLORSPACE_RGB)。难怪传递 JPEG 会失败。

Calling gdk_pixbuf_loader_write看起来是一个更好的选择,但我们需要一些代码来看看您可能做错了什么。但是,通过在 shell 中运行以下命令来检查您是否安装了用于 jpg 的 pixbuf 加载程序:gdk-pixbuf-query-loaders命令,并验证 JPEG 是否存在。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Gdk pixbuf 从内存加载图像 的相关文章

  • 使用链表进行堆排序

    我想知道是否有人曾经使用链表进行堆排序 如果他们可以提供代码 我已经能够使用数组进行堆排序 但尝试在链表中进行排序似乎不切实际 而且在你知道的地方很痛苦 我必须为我正在做的项目实现链接列表 任何帮助将不胜感激 我也用C 答案是 你不想在链表
  • C# 静态类型不能用作参数

    public static void SendEmail String from String To String Subject String HTML String AttachmentPath null String Attachme
  • 如何从字符串中提取子字符串直到遇到第二个空格?

    我有一个像这样的字符串 o1 1232 5467 1232 5467 1232 5467 1232 5467 1232 5467 1232 5467 如何仅提取 o1 1232 5467 要提取的字符数并不总是相同 因此 我只想提取直到遇到
  • 关于逻辑/算法的想法以及如何防止线程写入 Sql Server 中的竞争

    我有以下逻辑 public void InQueueTable DataTable Table int incomingRows Table Rows Count if incomingRows gt RowsThreshold async
  • Boost ASIO 串行写入十六进制值

    我正在使用 ubuntu 通过串行端口与设备进行通信 所有消息都必须是十六进制值 我已经在 Windows 环境中使用白蚁测试了通信设置 并得到了我期望的响应 但在使用 Boost asio 时我无法得到任何响应 以下是我设置串口的方法 b
  • 在 Mono 中反序列化 JSON 数据

    使用 Monodroid 时 是否有一种简单的方法可以将简单的 JSON 字符串反序列化为 NET 对象 System Json 只提供序列化 不提供反序列化 我尝试过的各种第三方库都会导致 Mono Monodroid 出现问题 谢谢 f
  • 防止控制台应用程序中的内存工作集最小化?

    我想防止控制台应用程序中的内存工作集最小化 在Windows应用程序中 我可以这样做覆盖 SC MINIMIZE 消息 http support microsoft com kb 293215 en us fr 1 但是 如何在控制台应用程
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • 来自嵌入图像的 BitmapSource

    我的目标是在 WPF 窗口上重写 OnRender 方法中绘制图像 someImage png 它是嵌入资源 protected override void OnRender System Windows Media DrawingCont
  • 条件类型定义

    如果我有一小段这样的代码 template
  • 在 azure blob 存储中就地创建 zip 文件

    我将文件存储在 Blob 存储帐户内的一个容器中 我需要在第二个容器中创建一个 zip 文件 其中包含第一个容器中的文件 我有一个使用辅助角色和 DotNetZip 工作的解决方案 但由于 zip 文件的大小最终可能达到 1GB 我担心在进
  • 如何从 Boost.PropertyTree 复制子树

    我有一些boost property tree ptree 我需要树来删除一些具有特定标签名称的元素 例如 xml 表示源ptree如下
  • 当Model和ViewModel一模一样的时候怎么办?

    我想知道什么是最佳实践 我被告知要始终创建 ViewModel 并且永远不要使用核心模型类将数据传递到视图 这就说得通了 让我把事情分开 但什么是Model 和ViewModel一模一样 我应该重新创建另一个类还是只是使用它 我觉得我应该重
  • 读取依赖步行者输出

    I am having some problems using one of the Dlls in my application and I ran dependency walker on it i am not sure how to
  • C:设置变量范围内所有位的最有效方法

    让我们来int举个例子 int SetBitWithinRange const unsigned from const unsigned to To be implemented SetBitWithinRange应该返回一个int其中所有
  • 如何编写一个接受 int 或 float 的 C 函数?

    我想用 C 语言创建一个扩展 Python 的函数 该函数可以接受 float 或 int 类型的输入 所以基本上 我想要f 5 and f 5 5 成为可接受的输入 我认为我不能使用if PyArg ParseTuple args i v
  • 如何高效计算连续数的数字积?

    我正在尝试计算数字序列中每个数字的数字乘积 例如 21 22 23 98 99 将会 2 4 6 72 81 为了降低复杂性 我只会考虑 连续的数字 http simple wikipedia org wiki Consecutive in
  • ContentDialog Windows 10 Mobile XAML - 全屏 - 填充

    我在项目中放置了一个 ContentDialog 用于 Windows 10 上的登录弹出窗口 当我在移动设备上运行此项目时 ContentDialog 未全屏显示 并且该元素周围有最小的填充 在键盘上可见 例如在焦点元素文本框上 键盘和内
  • 如何在 C# 中获取 CMD/控制台编码

    我需要指定正确的代码页来使用 zip 库打包文件 正如我所见 我需要指定控制台编码 在我的例子中为 866 C Users User gt mode Status for device CON Lines 300 Columns 130 K
  • 如何为有时异步的操作创建和实现接口

    假设我有数百个类 它们使用 计算 方法实现公共接口 一些类将执行异步 例如读取文件 而实现相同接口的其他类将执行同步代码 例如将两个数字相加 为了维护和性能 对此进行编码的好方法是什么 到目前为止我读到的帖子总是建议将异步 等待方法冒泡给调

随机推荐

  • 使用 $apply 在 OData v4 规范中聚合筛选数据集的语法

    假设我正在查询一个名为Sales具有以下架构 id int price decimal active bit 使用 apply查询选项和aggregate的转变OData v4 规范 http docs oasis open org oda
  • 由于 xml 签名错误

    我有一个 xml 文档 当我使用 java libs 打印文档时 我得到了正确的 xml 输出 然后我使用 xmlsignatures 签署 xml 文档 签名后 我尝试再次打印该文档 但这次文档的打印方式是所有元素混乱 所以我想知道xml
  • 在Android上使用Gstreamer或ffmpeg创建rtsp客户端

    我想在android上流rtsp流 我终于来了 结论是我不能使用 android API 的 MediaPlayer Videoview 等 因为 延迟对我来说是个大问题 我需要 Gstreamer 或 ffmpeg 客户端是否能够提供 我
  • 如何在基于浏览器的url中将自定义对象发送到WCF REST服务[重复]

    这个问题在这里已经有答案了 我有一个可序列化的员工实体类 public class Emp public int Id get set public string Name get set 我想从浏览器将此类的对象发送到 WCF REST
  • Jenkins pipeline、bitbucket hook 和 maven 发布插件无限循环

    我一直找不到这方面的信息 所以希望大家能帮我解决这个问题 我有一个托管在 bitbucket 中的 Maven 项目 它有一个 BitBucket WebHook 指向 someurl bitbucket hook 这个钩子会触发我的项目的
  • 重用部分查询进行计数的 Java 编码最佳实践

    The 在 hibernate 中实现结果分页获取总行数 https stackoverflow com questions 1600215 implementing result paging in hibernate getting t
  • 如何将 @Query sql 存储在 CrudRepository 的外部文件中?

    我在用着spring with CrudRepositorys 用于数据库连接 现在我需要一个相当长 几行 的 SQL 查询 我更愿意将其维护在类路径中的文件中 而不是直接在代码中维护 但我怎样才能实现这个目标呢 我的仓库如下所示 Quer
  • 日期范围的 Facebook 广告洞察 GRAPH API 边缘

    我正在尝试使用 Facebook Graph API 获取给定日期范围内的 Facebook 广告统计信息 这似乎不起作用 lt gt 知道我应该怎么做吗 答案在上面的评论中 并将其添加到此处 以便清楚 问题出在 time range 参数
  • Google Chrome 是否有 API 来访问其下载页面?

    我可以通过扩展程序 附加组件 进入 Google Chrome 的下载页面吗 我想编写一个扩展 它需要用户当前正在下载的所有文件的文件名 或路径 这可能吗 我应该查看哪些 API 搜索这个非常棘手 我不知道从哪里开始 不 我找不到可以让您查
  • 如何在vagranted虚拟机上访问postgresql?

    我通过 Vagrant 虚拟机和 postgresql 进行制作 并希望将其用作我的 Rails 应用程序数据库 我使用类似的 Vagrantfile Vagrant configure 2 do config config vm netw
  • 遇到合并冲突标记

    SourceTree 合并冲突 我创建了一个本地 Test 分支进入源树用于测试一些新功能 一切似乎都工作正常 然后我合并了 master 分支到我本地 Test 分支 不幸的是 推了它 但从那以后通过跑步 服务 我收到以下错误 52 lt
  • VBA 复制和转置数据范围

    我正在工作中设置一些电子表格以简化我的工作 我还是 VBA 新手 我正在尝试从 Sheet1 中剪切列 E6 E14 中的一系列数据 并在将数据粘贴到 Sheet2 列 A 中的下一个可用行中之前转置数据 这是我迄今为止通过反复试验编写的代
  • 如何从 Web 服务中获取参数值

    我有一个 Web 服务 一个 ASP NET asmx 页面 出于调试目的 我需要记录对 Web 服务的所有调用 包括传递到每个调用的所有参数的值 因此基本上每个 WebMethod 应该做的第一件事就是记录它的状态以及传递给它的所有参数值
  • 是否有移动和覆盖文件的操作?

    我正在寻找移动和覆盖文件的操作 我知道有一个新方法Java7 http docs oracle com javase 7 docs api java nio file Files html move 28java nio file Path
  • 您是否需要一个框架来为 Web 编写 Ruby 或 Python 代码?

    每次我看到在 Web 开发背景下讨论 Ruby 或 Python 时 总是会提到一个框架 Rails for Ruby Django for Python 这些框架有必要吗 如果没有 是否有原因导致这些语言经常在框架内使用 而 Perl 和
  • 合并 - 条件“匹配时更新”

    下图中的亮点显示了我想要实现的逻辑 我意识到语法不正确 有没有办法有条件地更新 MERGE 语句中的记录 仅当目标表中某一列的值为 NULL 并且源表中相应的值不为 null 时 你建议如何重写这个 MERGE dbo input 311
  • 在哪里可以找到 Andrew Richards 为 WinDBG 编写的 pde 扩展?

    我在网上的一些资源中看到提到它 但我找不到它 它似乎没有包含在 WinDBG 发行版中 有一个公共 OneDrive 其中包含它的 ZIP 文件
  • 如何让 Wireshark 显示我的本地 HTTP 流量?

    当我输入此 URI 以在正在运行的 Web API 应用程序上调用 REST 方法时 http SHANNON2 21608 api inventory sendXML duckbill platypus someFileName usin
  • 从数据集到数据表获取过滤后的数据

    如何过滤数据集到数据表中的数据 就像代码 gt DataRow dr DS Tables 0 Select STAGENAME Develop AND DEVLAPSEDAYS IS NOT NULL 我如何在这里使用数据表 以下代码不反映
  • Gdk pixbuf 从内存加载图像

    使用 GTK 3 6 我想显示内存缓冲区中的图像 而不是磁盘上的文件 我有一个const char data使用图像数据 我正在尝试从中创建 GTK 图像 到目前为止 我已经尝试了两种我认为可行的方法 两者都使用GdkPixbuf 因此需要