リサイズしてExifを残す
PHPで画像のリサイズをするときは、新しい画像を作って、リサイズしながらコピーして保存する方法が一般的だと思う。でもそれだとExifデータはなくなってしまう。
PELライブラリに入っているexamples/resize.phpを参考にExifを残すリサイズプログラムを作った。
ソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<?php require_once('pel/PelJpeg.php'); $src_filename = "tmp.jpg"; $dst_filename = "test_dst.jpg"; /* 元のファイルをロードし PelJpeg objectとする */ $input_jpeg = new PelJpeg($src_filename); /* PelJpeg objectの内部のイメージバイトでイメージリソースを生成 */ $src_img = ImageCreateFromString($input_jpeg->getBytes()); $original_width = ImagesX($src_img); $original_height = ImagesY($src_img); /* リサイズの計算 */ $scale = 0.5; $new_width = $original_width * $scale; $new_height = $original_height * $scale; /* イメージのリサイズ */ $dst_img = ImageCreateTrueColor($new_width, $new_height); ImageCopyResampled($dst_img, $src_img, 0, 0, 0, 0, $new_width, $new_height, $original_width, $original_height); /* JPEG data から PelJpeg object の生成 */ $output_jpeg = new PelJpeg($dst_img); /* 元のファイルからEXIFデータを取得 */ $exif = $input_jpeg->getExif(); /* EXIFデータが存在すれば、リサイズされるデータに設定 */ if ($exif != null) $output_jpeg->setExif($exif); /* リサイズ先ファイルに書き込む */ file_put_contents($dst_filename, $output_jpeg->getBytes()); |