gpt4 book ai didi

c++ - 从 Magick++ 图像从内存 (libharu) 加载图像

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:45:23 26 4
gpt4 key购买 nike

我正在开发一些基于 libharu 的 C++ pdf 生成软件我希望能够首先使用 Magick++ 处理图像然后使用 libharu 函数从内存中加载它们:

HPDF_LoadRawImageFromMem()

根据documentation本质上是从一些 void *buffer 加载图像。

我的目标是能够从 Magick::Image 中获取此 void* 数据实例并根据此数据将此图像加载到我的 haru pdf 中。

我已经尝试写入 void*Magick::Blob但到目前为止我唯一的成就是一些黑色矩形而不是我期待的图像。

有没有人有将原始图像数据从一个库转换到另一个库的经验?

我试图从内存中执行此操作的原因是因为到目前为止我正在将 Magick::Image 实例写入一个文件,然后从该文件读取以加载然后在 haru 中,这在上下文中是一个巨大的性能损失我的应用程序。

最佳答案

我想我回答有点晚了,但这是一个真实的答案。

我使用 LibHaru 成功地将 itk::Image 添加到我的 pdf 中,所以它应该对你来说大致相同。首先,你需要知道你使用的库是行专业还是列专业。 LibHaru(以及我所知道的所有图书馆)以行为主,所以您的图书馆也应该如此,否则您将需要“转置”您的数据。

// Black and white image (8 bits per pixel)
itk::Image<unsigned char, 2>::Pointer image = ...;
const unsigned char *imageData = image->GetBufferPointer();
const HPDF_Image image = HPDF_LoadRawImageFromMem(m_Document,
imageData, width, height, HPDF_CS_DEVICE_GRAY, 8);

// Or color image (24 bits per pixel, 8 bits per color component)
itk::Image<RGBPixel, 2>::Pointer image = ...;
const RGBPixel *imageData = image->GetBufferPointer();
const HPDF_Image image = HPDF_LoadRawImageFromMem(m_Document,
reinterpret_cast<const unsigned char *>(imageData),
width, height, HPDF_CS_DEVICE_RGB, 8);

// Usual LibHaru code. EndText, Position, Draw, StartText, etc.
// This code should not be dependant on the type
InsertImage(image);

我认为唯一复杂的部分是 reinterpret_cast。黑白图像不需要一个,因为它已经定义为字节。例如,如果你有这张图片

102 255 255
99 200 0
255 0 100
imageData == {102, 255, 255, 99, 200, 0, 255, 0, 100};

但是,如果你有这张彩色图片

(  0,   0, 255) (0, 255, 255) ( 42, 255, 242)
(200, 200, 255) (0, 199, 199) (190, 190, 190)
imageData == {0, 0, 255, 0, 255, 255, 42, 255, 242, 200, 200, 255, ... }

LibHaru 会理解,因为你告诉他使用 HPDF_CS_DEVICE_RGB,这意味着它将把数据分组在 (R, G, B) 中。

当然,使用 ImageMagick,您需要找到如何访问第一个像素。大概是data()、begin()、pointer()等方法吧。

关于c++ - 从 Magick++ 图像从内存 (libharu) 加载图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10758761/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com