当前位置: 首页 > news >正文

【图片合并转换PDF】如何将每个文件夹下的图片转化成PDF并合并成一个文件?下面基于C++的方式教你实现

医院在为患者进行诊断和治疗过程中,会产生大量的医学影像图片,如 X 光片、CT 扫描图、MRI 图像等。这些图片通常会按照检查时间或者检查项目存放在不同的文件夹中。为了方便医生查阅和患者病历的长期保存,需要将每个患者文件夹下的图片合并成一个 PDF 文件。

使用方式:医院的档案管理人员将患者的影像资料文件夹整理好,运行程序生成包含所有影像图片的 PDF 病历,便于在不同科室之间共享和远程医疗会诊。

要在 C++ 中实现将每个文件夹下的图片转化为 PDF 并合并成一个文件,可以使用一些第三方库,比如Magick++用于处理图片,Poppler用于处理 PDF(虽然 Poppler 主要用于 PDF 读取,但结合其他操作也可用于创建 PDF)。

以下是一个示例代码,使用Magick++库来将图片转换为 PDF 并合并:

首先,确保你已经安装了Magick++库。在 Ubuntu 上,可以使用以下命令安装:

bash

sudo apt-get install libmagick++-dev

下面是示例代码:

cpp

#include <iostream>
#include <vector>
#include <Magick++.h>
#include <filesystem>namespace fs = std::filesystem;// 获取指定目录下的所有图片文件路径
std::vector<fs::path> getImageFiles(const fs::path& directory) {std::vector<fs::path> imageFiles;for (const auto& entry : fs::recursive_directory_iterator(directory)) {if (entry.is_regular_file() && (entry.path().extension() == ".jpg" || entry.path().extension() == ".jpeg" || entry.path().extension() == ".png")) {imageFiles.push_back(entry.path());}}return imageFiles;
}// 将图片转换为PDF并合并
void imagesToCombinedPDF(const std::vector<fs::path>& imagePaths, const fs::path& outputPDF) {Magick::ImageList images;for (const auto& path : imagePaths) {try {Magick::Image image(path.string());image.magick("PDF");images.append(image);} catch (Magick::Exception& e) {std::cerr << "Error processing image " << path << ": " << e.what() << std::endl;}}if (!images.empty()) {try {images.write(outputPDF.string());std::cout << "Successfully created combined PDF: " << outputPDF << std::endl;} catch (Magick::Exception& e) {std::cerr << "Error writing combined PDF: " << e.what() << std::endl;}}
}int main() {Magick::InitializeMagick(nullptr);fs::path outputPDF = "combined.pdf";std::vector<fs::path> allImageFiles;// 假设当前目录下有多个文件夹,获取所有文件夹下的图片for (const auto& entry : fs::directory_iterator(".")) {if (entry.is_directory()) {auto imageFiles = getImageFiles(entry.path());allImageFiles.insert(allImageFiles.end(), imageFiles.begin(), imageFiles.end());}}imagesToCombinedPDF(allImageFiles, outputPDF);return 0;
}

这个代码实现了以下功能:

  1. getImageFiles函数用于获取指定目录及其子目录下的所有图片文件路径。
  2. imagesToCombinedPDF函数将这些图片转换为 PDF 格式,并合并到一个 PDF 文件中。
  3. main函数中,首先初始化Magick++库,然后遍历当前目录下的所有文件夹,获取所有图片文件路径,最后将这些图片合并成一个 PDF 文件。

请根据实际需求调整代码,例如图片格式支持、目录遍历逻辑等。

相关文章:

【图片合并转换PDF】如何将每个文件夹下的图片转化成PDF并合并成一个文件?下面基于C++的方式教你实现

医院在为患者进行诊断和治疗过程中&#xff0c;会产生大量的医学影像图片&#xff0c;如 X 光片、CT 扫描图、MRI 图像等。这些图片通常会按照检查时间或者检查项目存放在不同的文件夹中。为了方便医生查阅和患者病历的长期保存&#xff0c;需要将每个患者文件夹下的图片合并成…...

从基础到人脸识别与目标检测

前言 从本文开始&#xff0c;我们将开始学习ROS机器视觉处理&#xff0c;刚开始先学习一部分外围的知识&#xff0c;为后续的人脸识别、目标跟踪和YOLOV5目标检测做准备工作。我采用的笔记本是联想拯救者游戏本&#xff0c;系统采用Ubuntu20.04&#xff0c;ROS采用noetic。 颜…...

Elasticsearch:在 Elastic 中玩转 DeepSeek R1 来实现 RAG 应用

在这个春节&#xff0c;如一声春雷&#xff0c;DeepSeek R1 横空出世。现在人人都在谈论 DeepSeek R1。这个大语言模型无疑在中国及世界的人工智能发展史上留下了重要的里程碑。那么我们改如何结合 DeepSeek R1 及 Elasticsearch 来实现 RAG 呢&#xff1f;在之前的文章 “使用…...

寒假2.6--SQL注入之布尔盲注

知识点 原理&#xff1a;通过发送不同的SQL查询来观察应用程序的响应&#xff0c;进而判断查询的真假&#xff0c;并逐步推断出有用的信息 适用情况&#xff1a;一个界面存在注入&#xff0c;但是没有显示位&#xff0c;没有SQL语句执行错误信息&#xff0c;通常用于在无法直接…...

CTF中特别小的EXE是怎么生成的

我们在打CTF时候&#xff0c;出题的爷爷们给出的exe都很小 就10k左右&#xff0c;有的甚至就5k&#xff0c;那时候我很郁闷啊。现在我也能了啊哈哈 不多bb按如下操作&#xff1a; 我们来看看正常的release生成的代码# Copy #include "windows.h" int main(){ Messa…...

git rebase 和 git merge的区别

Rebase 可使提交树变得很干净, 所有的提交都在一条线上。 Merge 则是包含所有的调试记录&#xff0c;合并之后&#xff0c;父级的所有信息都会合并在一起 Rebase 修改了提交树的历史 比如, 提交 C1 可以被 rebase 到 C3 之后。这看起来 C1 中的工作是在 C3 之后进行的&#xf…...

Gitlab中如何进行仓库迁移

需求&#xff1a;之前有一个自己维护的新仓库A&#xff0c;现在需要将这个仓库提交并覆盖另一个旧的仓库B&#xff0c;需要保留A中所有的commit信息。 1.方法一&#xff1a;将原有仓库A导出后再导入到新的仓库B中 适用场景&#xff1a;新的仓库B是一个待建仓库&#xff0c;相当…...

LabVIEW 开发航天项目软件

在航天项目软件开发中&#xff0c;LabVIEW 凭借其图形化编程优势被广泛应用。然而&#xff0c;航天项目的高可靠性、高精度及复杂环境适应性要求&#xff0c;使得在使用 LabVIEW 开发时&#xff0c;有诸多关键要点需要特别关注。本文将详细分析在开发航天项目软件时需要重点注意…...

深度整理总结MySQL——MySQL加锁工作原理

MySQL加锁工作原理 前言前置知识- 锁为什么加在索引上锁的粒度优化提高并发性避免全表扫描优化死锁处理解决幻读问题 什么SQL语句会加行级锁MySQL是如何加行级锁场景模拟代码唯一索引等值查询退化为记录锁为什么会退化为记录锁分析加了什么锁为什么会退化为间隙锁为什么我可以插…...

kafka专栏解读

kafka专栏文章的编写将根据kafka架构进行编写&#xff0c;即先编辑kafka生产者相关的内容&#xff0c;再编写kafka服务端的内容&#xff08;这部分是核心&#xff0c;内容较多&#xff0c;包含kafka分区管理、日志存储、延时操作、控制器、可靠性等&#xff09;&#xff0c;最后…...

1-portal认证功能

很多时候公共网络需要提供安全认证功能&#xff0c;比如我们去星巴克或者商场、酒店&#xff0c;我们连接wifi上网的时候&#xff0c; 需要认证后才可以上网。 用户可以主动访问已知的Portal认证网站&#xff0c;输入用户名和密码进行认证&#xff0c;这种开始Portal认证的方式…...

MySQL面试题合集

1.MySQL中的数据排序是怎么实现的? 回答重点 排序过程中,如果排序字段命中索引,则利用 索引排序。 反之,使用文件排序。 文件排序中,如果数据量少则在内存中排序, 具体是使用单路排序或者双路排序。 如果数据大则利用磁盘文件进行外部排序,一 般使用归并排序。 知识…...

spring学习(druid、c3p0的数据源对象管理)(案例学习)

目录 一、博客引言。 二、阿里云-druid案例准备(依赖坐标、配置文件、测试类)。 &#xff08;1&#xff09;初始依赖坐标、配置文件与测试类。 &#xff08;2&#xff09;导入阿里云-druid依赖坐标。 &#xff08;3&#xff09;DruidDataSource。 &#xff08;4&#xff09;set…...

WordPress博客在fnOS环境下的极简搭建与公网地址配置指南

文章目录 前言1. Docker下载源设置2. Docker下载WordPress3. Docker部署Mysql数据库4. WordPress 参数设置5. 飞牛云安装Cpolar工具6. 固定Cpolar公网地址7. 修改WordPress配置文件8. 公网域名访问WordPress 前言 你是否曾经为搭建自己的网站而头疼不已&#xff1f;是不是觉得…...

【PG】DROP TABLE ... CASCADE

问题 ERROR: cannot drop table wx_user_tag because other objects depend on it DETAIL: default value for column id of table wx_user_tag depends on sequence wx_user_tag_id_seq HINT: Use DROP … CASCADE to drop the dependent objects too. 解决 这个错误消息表…...

绕组电感 - Ansys Maxwell 磁通链与电流

在本博客中&#xff0c;我将演示如何使用 Ansys Maxwell 中磁瞬态求解器的磁通链和电流结果来计算绕组电感。Ansys Maxwell 磁瞬态求解器在场计算中考虑了涡流效应&#xff0c;我将展示一种使用磁通链和电流结果来计算绕组电感的简单方法。 实际上&#xff0c;电感是非线性的…...

物联网软件开发与应用方向应该怎样学习,学习哪些内容,就业方向是怎样?(文末领取整套学习视频,课件)物联网硬件开发与嵌入式系统

随着物联网技术的飞速发展&#xff0c;物联网软件开发与应用方向成为了众多开发者关注的焦点。那么&#xff0c;如何在这个领域中脱颖而出呢&#xff1f;本文将为你提供一份详细的学习指南&#xff0c;帮助你从零开始&#xff0c;逐步掌握物联网软件开发与应用的核心技能。 一…...

《LeetCode Hot100》 Day01

Day01 轮转数组 思路&#xff1a; &#xff08;1&#xff09; 使用O(1) 空间复杂度解决&#xff0c;就需要原地解决&#xff0c;不能创建新的数组。 &#xff08;2&#xff09; 先整体反转数组&#xff0c;再反转前k个数&#xff0c;再反转剩下的数。即可完整本题。 &…...

vue动态table 动态表头数据+动态列表数据

效果图: <template><div style"padding: 20px"><el-scrollbar><div class"scrollbar-flex-content"><div class"opt-search"><div style"width: 100px"> </div><div class"opt-b…...

1.3 GPT vs BERT 终极选择指南:从架构差异到企业级落地策略

GPT vs BERT 终极选择指南&#xff1a;从架构差异到企业级落地策略 引言&#xff1a;两大巨头的分道扬镳 2018年&#xff0c;BERT和GPT系列同时引爆NLP领域&#xff0c;却在架构选择上走向截然不同的道路&#xff1a; BERT采用双向Transformer Encoder&#xff0c;在11项NLP…...

NeoPixel Painter:嵌入式HSV动画的固定点实现

1. NeoPixel Painter 库概述NeoPixel Painter 是一个面向嵌入式 LED 动画开发的轻量级 Arduino 库&#xff0c;专为简化 WS2812B&#xff08;NeoPixel&#xff09;LED 灯带的动态效果编程而设计。它并非对 Adafruit_NeoPixel 库的简单封装&#xff0c;而是构建在其之上的状态驱…...

BlueprintJS:企业级React组件库的架构设计与实战应用

BlueprintJS&#xff1a;企业级React组件库的架构设计与实战应用 【免费下载链接】blueprint A React-based UI toolkit for the web 项目地址: https://gitcode.com/gh_mirrors/bl/blueprint 在现代企业级Web应用开发中&#xff0c;UI框架的选择直接影响开发效率、产品…...

从LED驱动到充电桩:拆解PFC双环控制在5个真实产品里的不同玩法

从LED驱动到充电桩&#xff1a;拆解PFC双环控制在5个真实产品里的不同玩法 当你在深夜加班时&#xff0c;LED驱动电源的稳定输出让办公室保持明亮&#xff1b;当你为电动车充电时&#xff0c;充电桩高效转换着电网能量&#xff1b;这些场景背后都离不开一个关键技术——PFC双环…...

Karabiner-Elements设备过滤与条件判断深度解析

Karabiner-Elements设备过滤与条件判断深度解析 【免费下载链接】Karabiner-Elements Karabiner-Elements is a powerful utility for keyboard customization on macOS Sierra (10.12) or later. 项目地址: https://gitcode.com/gh_mirrors/ka/Karabiner-Elements Kara…...

TypeScript——声明合并

声明合并1、接口声明合并2、枚举声明合并3、类声明合并4、命名空间声明合并4.1、命名空间与命名空间合并4.2、 命名空间与函数合并4.3、 命名空间与类合并4.4、 命名空间与枚举合并5、扩充模块声明6、扩充全局声明声明是编程语言中的基础结构&#xff0c;它描述了一个标识符…...

Linux下Conda+R+RStudio环境配置全攻略:从零搭建高效数据分析平台

1. 为什么选择Conda管理R环境&#xff1f; 很多数据分析师习惯直接在系统里安装R和R包&#xff0c;但很快就会遇到版本冲突的麻烦。比如你需要安装一个要求R 4.3.0的包&#xff0c;但系统里装的是R 4.2.0&#xff0c;更糟的是其他所有包都是基于4.2.0编译的。这时候conda的价值…...

嵌入式系统错误处理机制与实现

嵌入式系统中的错误处理机制深度解析1. 错误概念与分类1.1 错误分类体系在嵌入式系统开发中&#xff0c;错误处理是确保系统可靠性的关键环节。从严重性维度分析&#xff0c;程序错误可分为两类&#xff1a;致命性错误&#xff1a;系统无法执行恢复操作&#xff0c;典型处理方式…...

【LaTeX】学术论文高效排版:从零搭建初稿模板

1. 为什么你需要LaTeX论文模板&#xff1f; 第一次写学术论文时&#xff0c;我像大多数人一样打开了Word。结果光是调整格式就花了三天——页码突然跑到封面中间、参考文献编号莫名其妙重置、公式和图片永远对不齐。直到导师扔给我一个.tex文件说"用这个"&#xff0c…...

Depth Pro:重新定义单目深度估计的速度与精度边界

Depth Pro&#xff1a;重新定义单目深度估计的速度与精度边界 【免费下载链接】ml-depth-pro Depth Pro: Sharp Monocular Metric Depth in Less Than a Second. 项目地址: https://gitcode.com/gh_mirrors/ml/ml-depth-pro 技术原理&#xff1a;如何让机器真正"看…...

BatchNorm实战避坑指南:为什么你的小批量训练总是不稳定?

BatchNorm实战避坑指南&#xff1a;小批量训练不稳定的深层解析与解决方案 1. 问题背景&#xff1a;为什么小批量训练总是不稳定&#xff1f; 在深度学习实践中&#xff0c;Batch Normalization&#xff08;批归一化&#xff09;已成为许多模型架构的标准组件。然而&#xff0c…...