我有一个资源对象(图像),它是在经过大量处理后从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");
问题是:我是否有任何技巧可以从内存中获取此图像路径/更好的方法来实现它?
答案 0 :(得分: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磁盘应用程序(可在此处使用: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像素;我将其写出,并从硬盘和RAM磁盘上读取了1000次。
在一个空闲的系统上(不是任何人都可以知道他的窗口是否空闲:)),我测量了每种存储类型的响应时间约为8秒(7.3s-9.1s)。
然后我开始在硬盘上复制一些文件。 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 //
当然和您的差不多。