【问题标题】:How to store wxImage into database, using C++?如何使用 C++ 将 wxImage 存储到数据库中?
【发布时间】:2010-03-30 19:40:38
【问题描述】:

我有一些 wxImages,我想将它们存储到 MySQL 数据库中的 BLOB(二进制大对象)字段中。

wxImagewxBitmap 中没有用于获取二进制数据作为 unsigned char 数组的方法,因此我可以加载到数据库中。

我目前的解决方法是将图像写入临时文件,然后直接从文件中加载 BLOB 字段。

有没有更有效的方法来加载 wxImage 对象并将其存储到 MySQL BLOB 字段中?

我正在使用 MySql C++ 连接器 1.05、MS Visual Studio 2008、wxWidgets 和 C++。

【问题讨论】:

    标签: c++ mysql wxwidgets blobstorage


    【解决方案1】:

    wxWidgets 不为来自 wxBitmap 的数据提供任何 API(因为它依赖于平台),但 wxImage 使用定义明确(并且非常简单)的格式,您可以使用其 GetData() 方法访问它上文提到的。请注意,如果您的图像具有 Alpha 通道,您可能还需要使用 GetAlpha()

    但我不会这样做,因为如果你这样做,数据将会巨大。虽然像上面建议的那样压缩它是可能的,但当wxImage 已经支持以任何标准图像格式写入图像时,为什么还要手动执行它。只需创建一个wxMemoryOutputStream 并将其传递给SaveFile()。然后直接使用GetOutputStreamBuffer()->GetBufferStart()和相关函数直接访问流缓冲区。

    【讨论】:

    • 上次我尝试保存未压缩,我无法从数据中创建图像。当我走临时文件路线时,图像没有问题。 API 说不要使用SetData,除非你知道自己在做什么。
    • 即使我建议这样做,但仍然没有任何理由不应该这样做,所以我只能说一定有一些某处代码中的错误。不幸的是,如果没有任何其他信息,就不可能更精确。
    【解决方案2】:

    除非我遗漏了什么,你不能使用 WxImage::GetData (http://docs.wxwidgets.org/2.8/wx_wximage.html#wximagegetdata) 来获取数据,然后使用 ::GetHeight 和 ::GetWidth 来知道指针指向的数据的长度吗? WxImage::GetData 返回的 unsigned char * 看起来应该指向构成图像的 RGB 数据。

    【讨论】:

    • 你是对的。这应该有效。但是,您可能需要压缩数据。
    • 一些 MySQL BLOB 示例说要对数据进行编码,使其在可打印范围内,以避免任何 dangerous 二进制值。另外,如何从数据中创建图像?
    猜你喜欢
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    • 1970-01-01
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    相关资源
    最近更新 更多