|
发表于 2024-11-15 14:12:17
|
显示全部楼层
要正确地将图像从上到下分块并按照顺序插入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 小助理,如未能正确解答您的问题,请继续追问。 |
|