ホームページ >バックエンド開発 >PHPチュートリアル >PHP は画像のカスタム情報 _exif などを読み書きしますか?

PHP は画像のカスタム情報 _exif などを読み書きしますか?

WBOY
WBOYオリジナル
2016-06-23 14:19:031132ブラウズ

PHP 画像

要件の説明:

PHP を使用して画像ファイルを最適化しますが、この最適化は 1 回しか実行できず、2 回実行すると画像に修復不可能な損傷が生じます。画像が一度処理された後、画像ファイルにカスタム文字列が書き込まれることが期待されます。これは、画像が処理されたかどうかを判断するためにのみ使用されます。


PHP を使用して解決することを楽しみにしています。現在、JPEG形式といえばEXIF情報がありますが、これを打開策としてEXIF情報にカスタム文字列を書き込んでみることができます。しかし、GIF、PNG、BMP についてはどうすればよいでしょうか?

Google からこの製品を入手しました
Imagick::setImageProperty

ドキュメントによると http://www.php.net/manual/zh/imagick.setimageproperty.php

要件を満たしているようですが、この関数を使用します画像を保存してもう一度読みますが、私の使い方に問題があるかどうかはわかりません


これはアイデアですが、まだ実装されていないと思います。これは私の使い方の問題であり、この機能が実装できないということではありません。

APP13 をもう一度使用しようとしました

$image = new Imagick($file);$image->setImageProperty('Exif:Make', 'Imagick');$image->writeImage($file2);$image2 = new Imagick($file2);echo $image->getImageProperty('Exif:Make');


でも、それもうまくいきませんでした。

遠回りしてませんか?何か良い方法はありますか?必要なことはそれほど多くはありません。画像を壊さずに画像データに文字列を書き込み、次回その文字列を読み取れるようにしたいだけです。

皆さん、来て、いくつかのヒントを与えて、すぐに問題を解決してください。


ディスカッションへの返信(解決策)

GD でサポートされている画像の場合、画像の内容に影響を与えることなく、画像データの終了後にカスタム データを追加できます

サンプル コード

$size = getimagesize('1.jpg', $info);var_dump($size);if(isset($info['APP13'])){    $iptc = iptcparse($info['APP13']);    var_dump($iptc);}

画像データが正しいことをご自身で確認してください破棄されていません

実際、一般的な概念があります。読み取り中に表示できるものは基本的にストリーミング データであり、そのようなデータの場合、ヘッダー ファイルは MIME タイプと長さ (または終了フラグ) を示し、その後長さ (または終了) を示します。 flag) 「余分な」データはメインデータの表示には影響しません、この概念によれば、rar、zip なども操作できます、笑

という考えのようです。同じ、つまりファイルのデータ形式の外に文字を挿入します。

私も最初はこの方法を考えて、いくつかのファイルを手動で編集したところ、GIFの動的画像が破損しました。当時はこの方法は無理だと思ったので、それ以上は進めませんでした。手動修正により破損したGIF画像を使用してxuzuningのコードでテストしたところ、手動​​修正はできないことが判明しました。

この解決策は基本的には実行可能と思われますが、問題は、すべての画像形式をテストすることはできないのではないかということです。この方法は決定的ですか? (GD がサポートしていれば問題ないのでしょうか?)

PS: まずはいくつかの形式で画像をテストしてみます。



これは、PHP で imagemagick 拡張モジュールをインストールする必要がある Imagick クラスを使用して実現できます

Google で Imagick 関数を見つけたと投稿したときにすでに述べましたが、実際には書き込み不可能です。上の人が言ったこと Imagick を使用してどのように実装されますか?

はい、GD でサポートされているすべての画像を使用できます (gif、jpg、png)

このような画像は圧縮されて保存されるため、ファイル ヘッダーにデータ領域の長さが示されます。

画像が表示されると、ソフトウェアはこの識別子を通じてデータを読み取り、解凍します

ただし、bmp ファイルなど、GD がサポートしていないファイルの場合は、それほど幸運ではありません。
bmp データはファイルの末尾からファイルの先頭まで配置されています。ファイルの末尾にコンテンツを追加すると、画像データが破壊されます



実際、最も簡単なテスト方法は、バイナリデータと元のファイルをコピーし、DOS コマンドを使用します

copy /b 元のファイル + バイナリデータの新しいファイル

次に、この新しいファイルに問題があるかどうかを確認します

まずこの解決策を使用しましょう PHP クラスまたは。さまざまな画像形式と互換性のあるもの。たとえば、画像にバッチで透かしを入れる場合、画像に透かしが入っているかどうかを判断する属性を追加できます。

お二人とも投稿ありがとうございます

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。