LoginSignup
11
10

More than 5 years have passed since last update.

PHPで、JPEGファイルのコメントデータやExif情報を削除する

Last updated at Posted at 2014-08-08

概要

JPEGファイルのコメントデータ及びExif情報を、ライブラリを使用して削除します

前投稿「PHPで、PNGファイルのコメントデータを削除する」はPHP標準関数だけで処理しましたが、
PNGと違ってJPEGの直接操作は断念したためライブラリ使用の方法を投稿します。
前回同様、Windows版PHP 5.4.5での動作は確認できています。

他の画像形式のコメントデータを削除したい場合、関連記事を参照してください。

使用ライブラリ

The PHP JPEG Metadata Toolkit

PHP4での動作を前提とした設計となっており、かなり古米のライブラリです。一部修正が必要ですが、きちんと動作しました。
このライブラリそのものには、PHP Exif LibraryのようにExif情報の削除関数などは存在しません。
そこで、The PHP JPEG Metadata Toolkitの関数で取得したデータ配列を自前で加工し、削除します。

以下のファイル構成となっていることを前提とします。
clean_jpeg.phpがテストコードです。

clean_jpeg.php

The_PHP_JPEG_Metadata_Toolkit/
    EXIF.php
    EXIF_Makernote.php
    EXIF_Tags.php
    IPTC.php
    JFIF.php
    JPEG.php
    Photoshop_IRB.php
    PictureInfo.php
    PIM.php
    pjmt_utils.php
    Unicode.php
    XML.php
    XMP.php
    Makernotes/
        agfa.php
        canon.php
        casio.php
        epson.php
        fujifilm.php
        konica_minolta.php
        kyocera.php
        nikon.php
        olympus.php
        panasonic.php
        Pentax.php
        ricoh.php
        sony.php

JFIF.phpPictureInfo.phpは今回のコードでは使用されませんが、一応記載しておきます。
JFIF.phpPictureInfo.php以外のファイルはライブラリにより読み込まれるため、全て必要です。

問題の一部修正

一部のファイルが<?phpではなく<?で始まるPHPコードとなっているため、修正しないとHTMLとして解釈されライブラリのコードが直接表示されていまいます。

…だったはずなのですが、再ダウンロードしてみたら全て<?phpで始まっていました。
おかしいな…とりあえずメモ。

なお、PHP Exif Libraryは…

Exif情報を削除するだけなら、PHP Exif Libraryの方がもっと簡単にできます。

しかしPHP Exif Libraryは、コメントデータの操作には対応していません。
携帯端末で再配布を防止するためのcopy="NO"kddi_copyright=onの追加も不可能です。
一方、The PHP JPEG Metadata ToolkitはExif以外のJPEGファイル追加ヘッダの操作も可能です。

コメントデータの操作も行う場合、The PHP JPEG Metadata Toolkitが最適です。
化石と化したPHP4対応のコードですが…

コード

clean_jpeg.php
<?php
/**
 * 変数定義
 */
//対象のJPEGファイル
$filename     = 'example.jpg';
//コメントデータおよびExif情報を削除したJPEGファイルのファイル名(作成するファイル名)
$out_filename = 'example.clean.jpg';





/**
 * ライブラリ読み込み
 */
require 'The_PHP_JPEG_Metadata_Toolkit/EXIF.php';





/**
 * 対象ファイルのJPEGヘッダを取得
 */
$jpeg_header_data=get_jpeg_header_data($filename);



/**
 * コメントデータを削除
 */
if(is_array($jpeg_header_data)){
    foreach($jpeg_header_data as $k=>$v){
        $seg_name=$v['SegName'];
        if(strcmp($seg_name,'COM')===0){
            unset($jpeg_header_data[$k]);
        }
    }
}



/**
 * Exif情報の配列を取得
 */
$exif_data=get_EXIF_JPEG($filename);
/**
 * Exif情報を削除
 * Exif情報の配列にある値から配列のものを探し、さらにその値の配列からキーが数値の値を削除する。
 * つまりどういうことかというと…
 *
 * Before:
 *
 *  Array(
 *      [0] => Array(
 *          [Tags Name] => TIFF
 *          [Tiff Offset] => 7894
 *          [274] => Array(
 *              ...
 *          )
 *          [0] => Array(
 *              ...
 *          )
 *          ...
 *      )
 *      [1] => Array(
 *          [Tags Name] => TIFF
 *          [Tiff Offset] => 7894
 *          [259] => Array(
 *              ...
 *          )
 *          ...
 *      )
 *      [Makernote_Tag] => 
 *      [Tags Name] => TIFF
 *      [Byte_Align] => MM
 *  )
 *
 * After:
 *
 *  Array(
 *      [0] => Array(
 *          [Tags Name] => TIFF
 *          [Tiff Offset] => 7894
 *      )
 *      [1] => Array(
 *          [Tags Name] => TIFF
 *          [Tiff Offset] => 7894
 *      )
 *      [Makernote_Tag] => 
 *      [Tags Name] => TIFF
 *      [Byte_Align] => MM
 *  )
 *
 * Note:
 *  この処理は適当にいじった結果うまく動作しているにすぎず、
 *  ライブラリの構造に則った最適な処理への変更が必要と思われる。
 */
if(is_array($exif_data)){
    foreach($exif_data as &$var){
        /* 値が配列の場合、キーが数値の値を削除 */
        if(is_array($var)){
            $var=array_intersect_ukey($var,$var,function($key){
                return !is_int($key) ? 0 : 1;
            });
        }
    }
}
/* JPEGヘッダに改変したExif情報を保存 */
$jpeg_header_data=put_EXIF_JPEG(
    $exif_data,
    $jpeg_header_data
);



/**
 * ファイルを保存
 */
put_jpeg_header_data(
    $filename,
    $out_filename,
    $jpeg_header_data
);

やっていること

ライブラリにより取得したデータを弄り回しています。

コメントデータの削除はput_jpeg_Commentの内部処理を参考にしていますが、
Exif情報の削除はget_EXIF_JPEG関数の出力データを適当にいじって動作させています
ライブラリの処理は追っていないため、これが正しい方法なのかは不明です。
とりあえず、Google Chromeと以下のソフトでエラーを吐かず読み込めるのでよしとしています。

繰り返しますが、Exif情報の削除は適当にいじって動作させています
ライブラリの処理に沿った正しい方法がある場合、コメントにてお知らせください。

参考サイト

PNGにJPEGときたら…?

GIFについてはJPEGより先に仕様を調べていたのですが、PNGより難しそうなフォーマットであるために希望が見えません。
というより、PNGが簡単すぎてゆとりになってしまったのかも…
GIFのコメントデータ用ライブラリ無いかな…

GIFのコメントデータの削除方法について投稿しました。

関連記事を参照してください。

最後に

先人の創ったライブラリって、本当に便利ですね。
車輪を再発明し、あらゆる環境でテストする手間が省けます。

この調子でGIFのコメントデータ用ライブラリも見つからないかな…

関連記事

11
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
10