0

写真ブログ Web サイトの一部の写真に透かしを追加するスクリプトがあります。透かしが入ったファイルはブラウザーに提供され、元のファイルはそのまま残ります。この部分は正常に動作しています。

最近、透かしに単純に GD を使用すると、元のファイルである EXIF データから重要な情報が取り除かれていることがわかりました。ソリューションがPELを使用していることがわかったので、それを使用するための助けが必要です。

PEL のインストール方法は理解できましたが、EXIF データを から にコピーすることはできませんでし$original_image$new_image

$jpeg = new PelJpeg($original_image);
$exif = $jpeg->getExif();
$tiff = $exif->getTiff();
$ifd0 = $tiff->getIfd();
$exif = $ifd0->getSubIfd(PelIfd::EXIF);
$ifd1 = $ifd0->getNextIfd();

/*
creates copy of $original_image to $new_image, adds watermark to $new_image
*/

$jpeg = new PelJpeg($new_image);
$jpeg->setExif($exif);
header("Content-Type: image/jpeg");
ImageJPEG($new_image);

これにより、次のようなエラーも発生します。

Catchable fatal error: Argument 1 passed to lsolesen\pel\PelJpeg::setExif() must be an instance of lsolesen\pel\PelExif, instance of lsolesen\pel\PelIfd given, called in /var/www/html/clerigo/exif.php on line 71 and defined in /var/www/html/clerigo/pel/src/PelJpeg.php on line 304.

[編集] OK、これを次のように機能させることができました:

$jpeg = new PelJpeg($original);
$exif = $jpeg->getExif();

/*
creates copy of $original_image to $new_image, adds watermark to $new_image
*/

$jpeg = new PelJpeg($new_image);
$jpeg->setExif($exif);
ImageJPEG($new_image, "new_image.jpg");
$jpeg->saveFile("/var/www/html/clerigo/new_image.jpg");

問題は、これは画像をファイルに保存することであり、目的は画像を保存することではなく、次のように要求に応じてブラウザーにのみ提供することです。

$jpeg = new PelJpeg($new_image);
$jpeg->setExif($exif);
$jpeg->saveFile($new_image);
header("Content-Type: image/jpeg");
ImageJPEG($new_image);
imagedestroy($new_image);

ただし、これによりエラーが発生します。 Warning: file_put_contents() expects parameter 1 to be a valid path, resource given in /var/www/html/clerigo/pel/src/PelJpeg.php on line 600

これを解決する方法はありますか?

4

2 に答える 2

0

ここで行っていることをよく見てください。

$jpeg = new PelJpeg($new_image);
$jpeg->setExif($exif);
header("Content-Type: image/jpeg");
ImageJPEG($new_image);

という新しい画像を作成し、$jpegそれに EXIF データを適用していますが$new_imageImageJPEG(). PelJpeg::saveFile()行った変更を保存し、そのファイルを提供するには、 を呼び出す必要があります。

于 2015-11-16T18:06:38.153 に答える
0

わかりました。これが最終的な動作コードです。

$jpeg = new PelJpeg($original_image);
$exif = $jpeg->getExif();

/*
creates copy of $original_image to $new_image, adds watermark to $new_image
*/

$jpeg = new PelJpeg($new_image);
$jpeg->setExif($exif);
header("Content-Type: image/jpeg");
echo $jpeg->getBytes();
于 2015-11-17T12:29:18.850 に答える