2012-01-12 13 views
1

私はこれをどこでも見回しました。私はそれがネットでいくつかのライブラリを使用して行うことができることを知っていますが、私は本当に "マークされた"画像を生成するスクリプトをしたい。その理由は、私たちがフォーラムの主催者であり、テーマ作成会社とチームを組んでいるからです。テーマ作成会社は、違法に配布されたテーマを追跡できるようにしたいと考えています。私はiTXtのGCHQ CanYouCrackit演習でのコメントを見て、それが最高で、私たちの財産を保護する侵入的な方法ではないと思っています。PHPはPNG画像にiTXtのコメントを追加します

+0

ImageMagickにはこれを行うことができるように思われる - を参照します。http://www.imagemagick .org/discourse-server/viewtopic.php?f = 1&t = 18891 PHPのための既成のソリューションがあるように見えません。 –

答えて

7

提案:画像に追加する固定のiTXtチャンクがある場合、素早く汚れた手順は、元の画像のIENDチャンク(12バイト)の直前に挿入するだけです。 iTXtは画像データの後に置くことができるので、これはうまくいくはずです。もちろん、これはチャンクが既に存在するかどうかをチェックしません。

ここtEXtチャンク(やや簡素)を使用して、サンプルコードです、それはいくつかの研磨を必要としますが、それは基本的に動作します:

<?php 

    addTextToPngFile("x.png","x2.png","Watermark","Hi this is a TEXT test"); 

    function addTextToPngFile($pngSrc,$pngTarget,$key,$text) { 
     $chunk = phpTextChunk($key,$text); 
     $png = file_get_contents($pngSrc); 
     $png2 = addPngChunk($chunk,$png); 
     file_put_contents($pngTarget,$png2); 
    } 

    // creates a tEXt chunk with given key and text (iso8859-1) 
    // ToDo: check that key length is less than 79 and that neither includes null bytes 
    function phpTextChunk($key,$text) { 
     $chunktype = "tEXt"; 
     $chunkdata = $key . "\0" . $text; 
     $crc = pack("N", crc32($chunktype . $chunkdata)); 
     $len = pack("N",strlen($chunkdata)); 
     return $len . $chunktype . $chunkdata . $crc; 
    } 

    // inserts chunk before IEND chunk (last 12 bytes) 
    function addPngChunk($chunk,$png) { 
     $len = strlen($png); 
     return substr($png,0,$len-12) . $chunk . substr($png,$len-12,12); 
    } 

?> 
+0

答えてくれてありがとうございますが、iTXtをある画像から別の画像に移動するのではなく、動的テキストを追加する方法はありますか(これは、このスニペットが行っていると思います)。 – Tommykent1210

+0

@ Tommykent1210:テキストはここでは動的です。私のコードの最初の行を見てください。これはiTXtではなくtEXtですが、iTXtが本当に必要な場合は変更するのが簡単です。 – leonbloy

+0

OK、2つの入力画像が再び表示されるのはなぜですか? – Tommykent1210