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 として画像を必要とします。

すべての画像について、画像を保存し、iptc タグの iptcembed から読み込む必要があります。

これは大きなパフォーマンスの問題です。汚いコードも。

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) を使用しています。これまでのところ、私の最速のソリューションは、小さな専用 RAM ディスクです。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

最近、サンプルの jpeg 画像を使用して (Windows PC で) 小さなベンチマークを実行しました。画像のサイズは 1.83 MB、解像度は 1520x1200 ピクセルです。私はそれを書き出して、HDD と RAM ディスクとの間で 1000 回読み返しました。

アイドル状態のシステム (ウィンドウがアイドル状態かどうかは誰にもわかりません:)) で、各ストレージ タイプで約 8 秒 (7.3 秒 - 9.1 秒) の応答時間を測定しました。

次に、HDD間でいくつかのファイルをコピーし始めました。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 に答える