PHP使用Imagick库操作tiff

1. 获取tiff页数

php 复制代码
function page_count($tiffPath): int
{
    $image = new \Imagick($tiffPath);
    // 获取TIFF文件中的页数
    $pages = $image->getNumberImages();
    // 释放内存
    $image->clear();
    return (int) $pages;
}

2. 拆分tiff页面为jpeg

php 复制代码
function extract($tiffPath, int $quality = 90, string $savePath = ''): array
{
    if (empty($savePath)) {
        $savePath = dirname($tiffPath) . DIRECTORY_SEPARATOR . pathinfo($tiffPath, PATHINFO_FILENAME);
    }
    if (! is_dir($savePath)) {
        mkdir($savePath, 0777, true);
    }
    // 创建Imagick对象
    $image = new \Imagick($tiffPath);

    // 获取TIFF文件中的页数
    $pages = $image->getNumberImages();
    $res   = [];
    for ($i = 0; $i < $pages; $i++) {
        // 分离每一页
        $image->setIteratorIndex($i);
        $page = $image->getImage();

        // 设置JPEG格式和质量
        $page->setImageFormat('jpeg');
        $page->setImageCompressionQuality($quality);

        // 生成输出文件名
        $outputFile = $savePath . DIRECTORY_SEPARATOR . ($i + 1) . '.jpg';

        // 保存JPEG文件
        $page->writeImage($outputFile);

        // 释放内存
        $page->clear();
        $res[] = $outputFile;
    }

    // 释放内存
    $image->clear();
    return $res;
}

3. tiff转pdf

php 复制代码
function to_pdf($tiffPath, string $pdfPath = '', bool $force = false): bool
{
    if (is_file($pdfPath) && ! $force) {
        return true;
    }
    if (empty($pdfPath)) {
        $pdfPath = $tiffPath . '.pdf';
    }
    $imagick = new \Imagick();

    // 分页读取
    $imagick->readImage($tiffPath);

    // 逐页处理
    $imagick->setIteratorIndex(0);
    $pdf = new Imagick();

    do {
        $page = $imagick->getImage();
        $page->setImageFormat('pdf');
        $pdf->addImage($page);
        $page->clear();
    } while ($imagick->nextImage());

    $pdf->writeImages($pdfPath, true);
    $pdf->clear();
    $imagick->clear();

    return file_exists($pdfPath);
}

唉 不过这个方案有个硬伤,针对大文件会爆内存,也只能对付一下小文件了

因此在此记录一下,然后我要在项目里清理掉这些代码了,因为我用python来实现了相应的处理,然后php通过api进行调用了, 本来信心满满的用rust也写了一个tiff转pdf,可能是俺的rust水平太菜,费了我3天时间,虽然最后搞出来了,打包exe也才5MB,但是耗时并没有缩短,还不如python的方案, 唉 白费了我3天, 真的是用生命诠释了"人生苦短 请用python"

相关推荐
傻啦嘿哟6 小时前
某招聘平台爬虫:爬取招聘岗位数据,分析各城市薪资水平
开发语言·爬虫·python
2501_933670796 小时前
2026秋招量化分析岗技能栈:Python、SQL、统计建模、回测项目怎么准备
开发语言·python·sql
李少兄7 小时前
JavaScript 数据类型完全指南
开发语言·javascript·ecmascript
Seoyoneh7 小时前
Agentic Workflow编排架构:云客服从“被动响应”迈向“主动执行”的技术实现
java·开发语言·架构
Tangyuewei8 小时前
Java 写 Agent:模型只是组件
java·开发语言
小玮看世界8 小时前
[Python]从合并区间到传感器融合区:合并区间在传感器区域融合的实际落地
开发语言·python
繁星蓝雨9 小时前
C++的设计与演进大纲(如何从C语言一步步成长为C++)
c语言·开发语言·c++·c++历史·c++演进
Evand J9 小时前
【MATLAB例程,图像降噪滤波9】自适应维纳滑动窗口滤波(Wiener)图像降噪、方法对比,有中文注释
开发语言·图像处理·计算机视觉·matlab·滑动窗口·滤波·降噪
杜大哥10 小时前
python程序:如何查看电脑【电池电量的剩余百分比】 和 【是否插入连接着充电器】?
开发语言·python
wuyk55510 小时前
Python网络爬虫入门到实战 第01章:爬虫到底是什么?原理、流程、合法性、风险全解析(零基础必看)
开发语言·爬虫·python