1

我有一个经过大量处理后从 imagecreatetruecolor 创建的资源对象(图像)。

$image = imagecreatetruecolor($dst_width, $dst_height);

最后一步是向图像添加 iptc 标签。

为了添加 iptc 标签,php 具有称为 iptcembed 的本机功能

iptcembed ( string $iptcdata , string $jpeg_file_name [, int $spool ] );

问题是:我将图像存储为资源对象。但是 iptcembed 需要图像作为文件路径字符串 $jpeg_file_name。

对于每个图像,我应该保存图像并从 iptcembed 加载它以获取 iptc 标签。

这是一个很大的性能问题。还有脏代码。

我想 php 包装器可以解决这个问题,但我了解到它们不是路径。它们只是参考。以下代码对我不起作用。

    $data = null;
    ob_start();
    imagejpeg($this->image['src_image'], null, $compression);
    $data = ob_get_contents();
    ob_end_clean();

    $img = fopen("php://temp", 'wb+');
    fwrite($img, $data);
    fclose($img);

    $content = iptcembed('', "php://temp");

问题是:有什么技巧可以让我从内存中达到这个图像路径/更好的方法来完成它吗?

4

1 回答 1

0

同样的问题在这里:)

我有存储在数据库中的高分辨率“主”jpeg 图像流。我必须为下载请求提供随机调整大小、裁剪和压缩参数。最后一步是将一些元数据添加到创建的临时图像中。

我正在使用 PHP 5.6(Windows 7)和 7.2(Ubuntu 18)。到目前为止,我最快的解决方案是一个小型的专用 ramdisk。在 Ubuntu 上,我只是创建并安装了一个 tmpfs 文件系统:

$ sudo bash
# mkdir -p /media/ramdisk
# chmod 1777 /media/ramdisk
# mount -t tmpfs -o size=256M tmpfs /media/ramdisk
# grep /media/ramdisk /etc/mtab | tee -a /etc/fstab
tmpfs /media/ramdisk tmpfs rw,relatime,size=262144k 0 0
# ^D
$ df -m /media/ramdisk
Filesystem     1M-blocks  Used Available Use% Mounted on
tmpfs                256     0       256   0% /media/ramdisk
$

在 Windows 上,我从 SoftPerfect 安装了免费的 RAM Disk 应用程序(可在此处获得:https ://www.softperfect.com/products/ramdisk/ )。

C:\>dir k:
 Volume in drive K is Ram Disk
 Volume Serial Number is 5566-7788

 Directory of K:\

2018-11-14  19:18    <DIR>          cache
2018-11-14  19:18    <DIR>          temp
               0 File(s)              0 bytes
               2 Dir(s)     117 518 336 bytes free

我最近(在我的 Windows PC 上)使用示例 jpeg 图像执行了一个小型基准测试。图像大小为 1.83 MB,分辨率为 1520x1200 像素;我把它写出来并从我的 HDD 和我的 RAM 磁盘读回 1000 次。

在空闲系统上(不是任何人都可以判断他的窗口是否空闲:)),我测量了每种存储类型的大约 8 秒(7.3 秒 - 9.1 秒)响应时间。

然后我开始在我的硬盘上复制一些文件。ram 磁盘的行为与以前相同,但是 - 毫不奇怪 - HDD 的响应开始在 8 到 40 秒之间波动。

所以,我想出了以下伪代码片段:

$raw = ...; // obtain untagged jpeg stream //
$temp = '/path/to/file/on/ram/disk';
file_put_contents($temp, $raw);
$meta = ...; // set the metadata as needed //
$raw = iptcembed($meta, $temp); // reload tagged image stream //
unlink($temp); // don't forget to clean up //

当然,这与您的几乎相同。

于 2018-11-16T12:41:29.560 回答