繁体   English   中英

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

[英]Load Images from memory (libharu) from Magick++ images

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

HPDF_LoadRawImageFromMem()

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

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

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

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

我试图从内存中执行此操作的原因是因为到目前为止,我正在将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()等的方法。

不幸的是我既没有使用ImageMagic也没有使用libharu,但是我有一些图像处理的经验,因为没有人回答,也许我可以提供一些帮助。 问题可能是存在大量原始图像格式,我很确定两个库对这些格式都没有相同的理解。 更糟糕的是,libharu的原始图像解释几乎没有记录。 然而,libharu处理原始数据非常简单的结论可以从以下参数中得出:“HPDF_LoadRawImageFromMem”。 宽度和高度几乎是不言自明的,唯一的问题是使用(可能是像素)。 更有趣的是:“bits_per_component”。 此参数可能描述了用于定义一个像素的位数(常用值为8:从256个值的调色板中索引,16:从65535值的调色板中索引,24:分别用于红色,绿色和蓝色的一个字节[ RGB],32:24,但是使用alpha通道或8位用于青色,品红色,黄色和黑色[CMYK],36:为32但每个值为9位,以便于转换......)。 问题是类型的糟糕文档:HPDF_ColorSpace,因为它可能描述了如何解释with:“bits_per_component”的颜色值。 ImageMagic似乎实现了一种完全不同的方法。 图像对象似乎总是具有图像格式(JPEG,PNG,GIF),因此图像对象可能永远不会具有“直接”的存储器表示但是被编码。 我的建议是将ImagaMagic图像切换为TIFF格式,因为它宽恕了压缩,因此与libharu假设的原始解释有类似的方法。 希望这至少有点帮助...干杯马克。

回答永远不会迟到。

我使用PNG blob作为中间步骤:

Image image;
image.read("file.jpg");

Blob blob;
image.write(blob, "PNG");

HPDF_Image pdfImg = HPDF_LoadPngImageFromMem(doc, (const HPDF_BYTE*)blob.data(), blob.length());
HPDF_Page_DrawImage(doc, pdfImg, 0, 0, image.columns(), image.rows());

为简洁起见,省略了PDF文档和页面创建。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM