要正确地将图像从上到下分块并按照顺序插入PDF页面,您需要在绘制每一块时计算正确的y坐标。因为在PDF坐标系中,(0,0)通常位于页面的左下角,而图像数据通常是从左上角开始的。因此,调整绘制的y坐标是至关重要的。
请参考以下代码示例,它将图像按照正确的上下顺序分块并绘制到PDF页面中:
#include <iostream>
#include <opencv2/opencv.hpp>
#include <hpdf.h>
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;
}
void saveMatAsPDF(const cv::Mat& image, const std::string& pdfFileName, int blockHeight) {
HPDF_Doc pdf = HPDF_New(error_handler, nullptr);
if (!pdf) {
std::cerr << "Failed to create PDF object." << std::endl;
return;
}
HPDF_SetCompressionMode(pdf, HPDF_COMP_ALL);
HPDF_Page page = HPDF_AddPage(pdf);
HPDF_Page_SetWidth(page, image.cols);
HPDF_Page_SetHeight(page, image.rows);
for (int y = 0; y < image.rows; y += blockHeight) {
int actualBlockHeight = std::min(blockHeight, image.rows - y);
cv::Rect roi(0, y, image.cols, actualBlockHeight);
cv::Mat subImg = image(roi);
// Create a raw image from the sub-region
HPDF_Image pdf_image = HPDF_LoadRawImageFromMem(
pdf, subImg.data, subImg.cols, subImg.rows, HPDF_CS_DEVICE_GRAY, 8);
if (!pdf_image) {
std::cerr << "Failed to load image sub-region." << std::endl;
continue;
}
// Draw the image at the correct position, note the PDF coordinates
HPDF_Page_DrawImage(page, pdf_image, 0, image.rows - (y + actualBlockHeight), image.cols, actualBlockHeight);
}
HPDF_SaveToFile(pdf, pdfFileName.c_str());
HPDF_Free(pdf);
}
int main() {
cv::Mat image = cv::imread("large_image.tif", cv::IMREAD_GRAYSCALE);
if (image.empty()) {
std::cerr << "Image not found or unable to open." << std::endl;
return -1;
}
saveMatAsPDF(image, "output.pdf", 100); // Adjust blockHeight as needed
return 0;
}
### 代码说明:
1. **图像分块**:通过循环,遍历图像的每个垂直块,将其逐块绘制到页面。
2. **y坐标处理**:每次绘制子图像时,使用 `image.rows - (y + actualBlockHeight)` 计算正确的y坐标,以确保图片从上到下按顺序添加。
3. **HPDF_LoadRawImageFromMem**:这个函数用于将图像数据直接加载为PDF图像对象。
4. **首选构建**:确保 `libhpdf`、`opencv` 包括文件和库文件已正确链接。根据项目设置调整路径。
请根据你的开发环境和库的实际位置修改路径和链接设置。通过这个方法,图像应该会按照正确的顺序从上到下绘制到PDF中。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |