2017-11-27 7 views
0

EX35タグでいくつかの設定を使ってPHP でPNG画像を作成する方法を探しています。 これを達成するにはどうすればいいですか?作成時にPNGファイルからこれらのタグを読み取ることができますか? 私はヘッダ( "Key:"、値)を試しました。それは動作しません。 提案がありますか? ファイルからデータを読み取るにはどうすればよいですか?私は彼らが "png:IHDR"に終わるだろうと思うが、これをどのように読むことができるだろうか? ImageMagickは使用できません。exifでGDを使ってPHPでPNG形式の画像を作成

どのようにタグを見ることができますか(どのツールが良いですか)?

+2

exifはpngで使用されません。 「JPEG2000、PNG、GIFでは使用されていません。」 'https://en.wikipedia.org/wiki/Exif –

+0

[' IHDR'チャンク]にはメタデータのための空きがありません(https: //en.wikipedia.org/wiki/Portable_Network_Graphics#Critical_chunks)。 EXIFメタデータは['eXIf'チャンク](https://en.wikipedia.org/wiki/Portable_Network_Graphics#Ancillary_chunks)にとどまるべきです。 – axiac

答えて

0

次のリンクを経由することができます exifはpngで使用されていません。

https://stackoverflow.com/questions/9542359/does-png-contain-exif-data-like-jpg 

が、今、いくつかのPNG画像は、EXIFのtag.uを保存する日が、それは以下の http://php.net/manual/en/function.exif-read-data.php

を助けるかもしれない怒鳴るリンクを試すことができます。この意志は怒鳴る出力を与えるサンプルコード

<?php 
//path of the image 
$image_name = "1.PNG"; 

//read all the image attributes 
$exif = exif_read_data($image_name, 0, true); 
echo $exif===false ? "No header data found.<br />\n" : "Image contains headers\n"; 


//print the name of the image 
echo "Image Name:".$image_name."\n\n"; 

//iterate trough the image to list all the attributes 
foreach ($exif as $key => $section) { 
    echo "############### Section Name :".$key." #############\n"; 
    foreach ($section as $name => $val) { 
     echo "$key.$name: $val\n"; 
    } 
    echo "\n"; 
} 

?> 

ある

Image contains headers 
Image Name:1.PNG 

############### Section Name :FILE ############# 
FILE.FileName: 1.PNG 
FILE.FileDateTime: 1511089868 
FILE.FileSize: 6251146 
FILE.FileType: 2 
FILE.MimeType: image/jpeg 
FILE.SectionsFound: ANY_TAG, IFD0, EXIF, MAKERNOTE 

############### Section Name :COMPUTED ############# 
COMPUTED.html: width="5184" height="3456" 
COMPUTED.Height: 3456 
COMPUTED.Width: 5184 
COMPUTED.IsColor: 1 
COMPUTED.ByteOrderMotorola: 0 
COMPUTED.ApertureFNumber: f/5.0 

############### Section Name :IFD0 ############# 
IFD0.Make: Canon 
IFD0.Model: Canon EOS 1300D 
IFD0.Orientation: 1 
IFD0.XResolution: 72/1 
IFD0.YResolution: 72/1 
IFD0.ResolutionUnit: 2 
IFD0.DateTime: 2017:11:19 16:41:08 
IFD0.Artist: 
IFD0.YCbCrPositioning: 2 
IFD0.Copyright: 

############### Section Name :EXIF ############# 
EXIF.ExposureTime: 1/60 
EXIF.FNumber: 5/1 
EXIF.ExposureProgram: 2 
EXIF.ISOSpeedRatings: 800 
EXIF.UndefinedTag:0x8830: 2 
EXIF.UndefinedTag:0x8832: 800 
EXIF.ExifVersion: 0230 
EXIF.DateTimeOriginal: 2017:11:19 16:41:08 
EXIF.DateTimeDigitized: 2017:11:19 16:41:08 
EXIF.ComponentsConfiguration: 

これが役に立ったらいいですか?

+0

自分でチャンクを作成して読みたい場合はどうしたらいいですか? – Popeye

+0

警告:exif_read_data(png_.png):行6の/opt/lampp/htdocs/Indoor_Simulator/read_png.phpでサポートされていないファイル ヘッダーデータが見つかりません。 イメージ名:./image/png/png_.png 警告:14行目の/opt/lampp/htdocs/Indoor_Simulator/read_png.phpのforeach()に無効な引数が指定されました – Popeye

+0

PNGのコメントを作成できませんあなたのコードに従って何も表示されません。 私のコードのように保存しようとすると、チャンクはIENDセクションで終了し、値は返されません(チャンクが来ます)。 – Popeye

0

これは自分のチャンクを保存しようとしている私の機能です。

function save($image){ 
    header("Content-type: image/png"); 
    $name = "png"; 
    $save = "./image/png/". strtolower($name) ."_.png"; 
    imagepng($image, $save); 

    // cmBn: c = not critical; m = private; B must be capital; n = depends on image data 
    $chunk = "cmBn"; 
    $build_id = 2139; // Building ID (Uint32), positive values 32-bit up to 4,294,967,295 (232 − 1) 
    $floor_id = 12345; // Floor ID (Uint8), positive values 8-bit up to 255 
    $max_lat = 51.897867564536452; // Max Latitude (Float) 
    $min_long = 13.1234567890123; // Min Longitude (Float) 
    $min_lat = 51.97867564518453; // Min Latitude (Float) 
    $max_long = 13.2223334445551; // Max Longitude (Float) 

    // insert a BKGD chunk into the PNG file for graceful image degradation in IE6 
    $pngData = bin2hex(file_get_contents($save)); 

    $idatMarker = '200049444154'; //? 
    $bkgdMarker = '624b4744'; //cmBn 

    $bkgdChunk = '0006' . $bkgdMarker; //? 
    //oreach ($bgColor as $bit) 
    //{ 
     //$bkgdChunkData .= '00' . dechex($bit); 
     $bkgdChunkData .= '00' . dechex($build_id); 
     $bkgdChunkData .= '00' . dechex($floor_id); 
     $bkgdChunkData .= '00' . dechex($max_lat); 
     $bkgdChunkData .= '00' . dechex($min_long); 
     $bkgdChunkData .= '00' . dechex($min_lat); 
     $bkgdChunkData .= '00' . dechex($max_long); 
    //} 
    $bkgdChunk .= $bkgdChunkData; 
    $bkgdChunk .= dechex(crc32(pack('H*', $bkgdMarker . $bkgdChunkData))) . '0000'; 

    $parsed = explode($idatMarker, $pngData, 2); // split file by first 'IDAT' chunk 
    $pngData = pack('H*', $parsed[0] . $bkgdChunk . $idatMarker . $parsed[1]); 
    file_put_contents($save, $pngData); 
}