从Magick ++图像中加载内存(libharu)中的图像

rpe*_*ayr 5 c++ image imagemagick libharu magick++

我正在研究基于libharu的 c ++中的一些pdf生成软件,我希望能够首先使用Magick ++操作图像,然后使用libharu函数从内存加载它们:

HPDF_LoadRawImageFromMem()
Run Code Online (Sandbox Code Playgroud)

根据文档,本质上从一些void *缓冲区加载图像.

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

我曾尝试写过一个void*或一个Magick::Blob但是我迄今为止唯一的成就是一些黑色矩形而不是我期待的图像.

有没有人有将Raw图像数据从一个库转换为另一个库的经验?

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

Nil*_*Nil 2

我想我回答有点晚了,但这是一个现实生活中的答案。

我使用 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);
Run Code Online (Sandbox Code Playgroud)

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

102 255 255
 99 200   0
255   0 100
imageData == {102, 255, 255, 99, 200, 0, 255, 0, 100};
Run Code Online (Sandbox Code Playgroud)

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

(  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, ... }
Run Code Online (Sandbox Code Playgroud)

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

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