【问题标题】:Initialize Magick++ from stream buffer in C++从 C++ 中的流缓冲区初始化 Magick++
【发布时间】:2020-01-08 14:30:01
【问题描述】:

我似乎找不到从 C++ 中的 iostream stream_buffer 初始化 ImageMagick Magick++ 对象的正确语法/方法的示例。

我正在尝试使用 aws sdk getObject 的结果,它似乎返回一个流缓冲区以推送到 ImageMagick 以通过 lambda 按需创建缩略图。

我用来检索对象的 aws-sdk-cpp 中的相关代码示例:

auto get_object_outcome = s3_client.GetObject(object_request);
if (get_object_outcome.IsSuccess())
{
    // Get an Aws::IOStream reference to the retrieved file
    auto &retrieved_file = get_object_outcome.GetResultWithOwnership().GetBody();

    // read the object's contents and write to a file
    std::ofstream output_file(file_name, std::ios::binary);
    output_file << retrieved_file.rdbuf();
    return true;
}
else
{
    auto error = get_object_outcome.GetError();
    std::cout << "ERROR: " << error.GetExceptionName() << ": "
              << error.GetMessage() << std::endl;
    return false;
}

感谢任何帮助 - c++ 新手,所以我还不精通转换更高级的数据格式,例如流/blob/缓冲区。

【问题讨论】:

    标签: c++ magick++ aws-sdk-cpp


    【解决方案1】:

    我尝试获取您的检索文件,将其复制到 std::vector 中,创建一个魔法 blob,从该 blob 创建一个图像:

    // create an empty buffer        
    std::vector<char> buffer; 
    
    // file your buffer with the retrieved file
    std::copy(istream_iterator(retrieved_file), istream_iterator(), std::back_inserter(buffer));
    
    // create a Magick++ blob with your data
    Blob my_blob(buffer.data(), buffer.size());
    
    // create a Magick++ image from your blob
    Image image_from_blob(my_blob);
    

    【讨论】:

    • 我尝试了很多方法来尝试创建一个 blob,但对使用缓冲区的 c++ 工作还不够熟悉,不知道如何操作。谢谢,我会尽快尝试一下。目前正在与 Magick++ 依赖作斗争。
    • 该语法在 std::copy 上抱怨:“使用类模板 'istream_iterator' 需要模板参数”
    • 我看到了在每个 istream_iterator 之后插入 的示例,它消除了警告,但数据似乎以某种方式损坏。我将 buffer.size() 设置为 size_t 变量以确保它有内容并且确实有,但它抱怨 jpeg 损坏,“Bogus DQT index 5”。我首先使用保存到文件的方法确认数据是好的。
    猜你喜欢
    • 2010-11-29
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    • 2021-10-27
    • 1970-01-01
    相关资源
    最近更新 更多