|
发表于 2024-11-15 10:34:19
|
显示全部楼层
输出PDF文件大且无法显示的问题,可能是因为直接将每个像素都作为一个绘图操作进行处理。这样处理图像时会生成大量绘图命令,从而增加文件的大小。为了避免这种情况,应该尝试压缩图像数据或使用效率更高的方法。
libharu库不支持直接保存二值图图像为PDF。因此,为了将图像添加到PDF,可以先将该图像转换为一种支持压缩的格式,比如JPEG或者带有压缩的PNG,然后再嵌入PDF。
在此之前,我们假设您已经将图像转换为PNG或JPEG格式。您需要确保图像最终是二元化的,并且可以通过OpenCV进行格式转换。
### 具体步骤
1. **转换并保存为PNG或JPEG格式**:
使用OpenCV将图像作为PNG或JPEG格式保存:
- cv::Mat image = cv::imread("binary_image.png", cv::IMREAD_GRAYSCALE);
- if (image.empty()) {
- std::cerr << "Error: Could not open or find the image" << std::endl;
- return;
- }
- // 为确保二值化,使用阈值处理
- cv::threshold(image, image, 128, 255, cv::THRESH_BINARY);
- // 保存为PNG(PNG包含无损压缩)
- cv::imwrite("binary_image_converted.png", image);
复制代码
2. **使用libharu将图像嵌入PDF:**
- #include <hpdf.h>
- #include <iostream>
- void error_handler(HPDF_STATUS error_no, HPDF_STATUS detail_no, void *user_data) {
- std::cerr << "ERROR: error_no=" << error_no << ", detail_no=" << detail_no << std::endl;
- }
- int main() {
- HPDF_Doc pdf = HPDF_New(error_handler, nullptr);
- if (!pdf) {
- std::cerr << "Error: Cannot create pdf object" << std::endl;
- return 1;
- }
- HPDF_SetCompressionMode(pdf, HPDF_COMP_ALL);
- HPDF_Page page = HPDF_AddPage(pdf);
- HPDF_Page_SetSize(page, HPDF_PAGE_SIZE_A4, HPDF_PAGE_PORTRAIT);
- // 加载图像
- HPDF_Image image = HPDF_LoadPngImageFromFile(pdf, "binary_image_converted.png");
- float page_width = HPDF_Page_GetWidth(page);
- float page_height = HPDF_Page_GetHeight(page);
- float aspect_ratio = float(HPDF_Image_GetWidth(image)) / float(HPDF_Image_GetHeight(image));
- float width = page_width;
- float height = page_width / aspect_ratio;
- HPDF_Page_DrawImage(page, image, 0, (page_height - height) / 2, width, height);
- HPDF_SaveToFile(pdf, "output.pdf");
- HPDF_Free(pdf);
- }
复制代码
### 说明
- 通过这种方法,将二值图像转换为一种可以优化存储的格式。
- 使用 `HPDF_SetCompressionMode(pdf, HPDF_COMP_ALL);` 以压缩PDF中的图像数据。
- 注意页面大小和图像大小的匹配,以确保图像在PDF上适当显示。这里根据A4页面自动调整大小。
这种方式会显著减小文件大小并提速。尝试调整输出图像的格式和压缩级别以达到最佳效果。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|