123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520 |
- <?php
- $orig_srcpath='../tests/tiger.png'; // as specified in your file (could be full URL)
- $file = 'http://127.0.0.1/MPDF1.com/common/mpdf/tests/tiger.png'; // Full URL
- $fileIsLocal = true; // is the file in the same domain?
- //======================================================================
- $ppUx = 0;
- $type = '';
- $data = '';
- echo 'File: ' .$orig_srcpath . '<br />';
- echo 'Full File URL: ' .$file . '<br />';
- if ($orig_srcpath && $fileIsLocal && $check = @fopen($orig_srcpath,"rb")) {
- fclose($check);
- $file=$orig_srcpath;
- $data = file_get_contents($file);
- $type = _imageTypeFromString($data);
- echo 'File accessed using fopen on $orig_srcpath' . '<br />';
- }
- if (!$data && $check = @fopen($file,"rb")) {
- fclose($check);
- $data = file_get_contents($file);
- $type = _imageTypeFromString($data);
- echo 'File accessed using fopen on $file' . '<br />';
- }
- if ((!$data || !$type) && !ini_get('allow_url_fopen') ) { // only worth trying if remote file and !ini_get('allow_url_fopen')
- file_get_contents_by_socket($file, $data); // needs full url?? even on local (never needed for local)
- if ($data) { $type = _imageTypeFromString($data); }
- echo 'File accessed using socket ' . '<br />';
- }
- if ((!$data || !$type) && !ini_get('allow_url_fopen') && function_exists("curl_init")) {
- file_get_contents_by_curl($file, $data); // needs full url?? even on local (never needed for local)
- if ($data) { $type = _imageTypeFromString($data); }
- echo 'File accessed using cURL ' . '<br />';
- }
- if (!$data) { echo 'Could not access image file' . '<br />'; exit; }
- echo 'Image type determined: ' .strtoupper($type) . '<br />';
- // JPEG
- if ($type == 'jpeg' || $type == 'jpg') {
- $hdr = _jpgHeaderFromString($data);
- if (!$hdr) { echo 'Error parsing JPG header' . '<br />'; exit; }
- $a = _jpgDataFromHeader($hdr);
- $channels = intval($a[4]);
- echo 'Width: ' . $a[0]. '<br />';
- echo 'Height: ' . $a[1]. '<br />';
- echo 'Colorspace: ' . $a[2]. '<br />';
- echo 'BPC (bits per channel): ' . $a[3]. '<br />';
- echo 'Channels: ' . $channels. '<br />';
- $j = strpos($data,'JFIF');
- if ($j) {
- //Read resolution
- $unitSp=ord(substr($data,($j+7),1));
- if ($unitSp > 0) {
- $ppUx=_twobytes2int(substr($data,($j+8),2)); // horizontal pixels per meter, usually set to zero
- if ($unitSp == 2) { // = dots per cm (if == 1 set as dpi)
- $ppUx=round($ppUx/10 *25.4);
- }
- }
- echo 'Resolution ppUx: ' . $ppUx. '<br />';
- }
- else echo 'JFIF not found in header' . '<br />';
- // mPDF 6 ICC profile
- $offset = 0;
- $icc = array();
- while (($pos = strpos($data, "ICC_PROFILE\0", $offset)) !== false) {
- // get ICC sequence length
- $length = _twobytes2int(substr($data, ($pos - 2),2)) - 16;
- $sn = max(1, ord($data[($pos + 12)]));
- $nom = max(1, ord($data[($pos + 13)]));
- $icc[($sn - 1)] = substr($data, ($pos + 14), $length);
- $offset = ($pos + 14 + $length);
- }
- // order and compact ICC segments
- if (count($icc) > 0) {
- echo 'ICC profile present' . '<br />';
- ksort($icc);
- $icc = implode('', $icc);
- if (substr($icc, 36, 4) != 'acsp') {
- // invalid ICC profile
- echo 'ICC profile INVALID (no acsp flag)' . '<br />';
- }
- $input = substr($icc, 16, 4);
- $output = substr($icc, 20, 4);
- echo 'ICC profile Input: ' . $input. '<br />';
- echo 'ICC profile Output: ' . $output. '<br />';
- // Ignore Color profiles for conversion to other colorspaces e.g. CMYK/Lab
- if ($input != 'RGB ' || $output != 'XYZ ') { echo 'ICC profile ignored by mPDF' . '<br />'; }
- }
- }
- // PNG
- else if ($type == 'png') {
- //Check signature
- if(substr($data,0,8)!=chr(137).'PNG'.chr(13).chr(10).chr(26).chr(10)) {
- echo 'Error parsing PNG identifier<br />'; exit;
- }
- //Read header chunk
- if(substr($data,12,4)!='IHDR') {
- echo 'Incorrect PNG file (no IHDR block found)<br />'; exit;
- }
- $w=_fourbytes2int(substr($data,16,4));
- $h=_fourbytes2int(substr($data,20,4));
- $bpc=ord(substr($data,24,1));
- $errpng = false;
- $pngalpha = false;
- $channels = 0;
- echo 'Width: ' .$w . '<br />';
- echo 'Height: ' .$h . '<br />';
- echo 'BPC (bits per channel): ' .$bpc . '<br />';
- $ct=ord(substr($data,25,1));
- if($ct==0) { $colspace='DeviceGray'; $channels = 1; }
- elseif($ct==2) { $colspace='DeviceRGB'; $channels = 3; }
- elseif($ct==3) { $colspace='Indexed'; $channels = 1; }
- elseif($ct==4) { $colspace='DeviceGray'; $channels = 1; $errpng = 'alpha channel'; $pngalpha = true; }
- else { $colspace='DeviceRGB'; $channels = 3; $errpng = 'alpha channel'; $pngalpha = true; }
- echo 'Colorspace: ' . $colspace. '<br />';
- echo 'Channels: ' . $channels. '<br />';
- if ($pngalpha) echo 'Alpha channel detected'. '<br />';
- if ($ct < 4 && strpos($data,'tRNS')!==false) { echo 'Transparency detected'. '<br />'; $errpng = 'transparency'; $pngalpha = true;}
- if ($ct == 3 && strpos($data,'iCCP')!==false) { echo 'Indexed plus ICC'. '<br />'; $errpng = 'indexed plus ICC'; }
- if(ord(substr($data,26,1))!=0) { echo 'compression method not set to zero<br />'; $errpng = 'compression method'; } // only 0 should be specified
- if(ord(substr($data,27,1))!=0) { echo 'filter method not set to zero<br />'; $errpng = 'filter method'; } // only 0 should be specified
- if(ord(substr($data,28,1))!=0) { echo 'interlaced file not set to zero<br />'; $errpng = 'interlaced file'; }
- $j = strpos($data,'pHYs');
- if ($j) {
- //Read resolution
- $unitSp=ord(substr($data,($j+12),1));
- if ($unitSp == 1) {
- $ppUx=_fourbytes2int(substr($data,($j+4),4)); // horizontal pixels per meter, usually set to zero
- $ppUx=round($ppUx/1000 *25.4);
- }
- echo 'Resolution ppUx: ' . $ppUx. '<br />';
- }
- // mPDF 6 Gamma correction
- $gamma_correction = 0;
- $gAMA = 0;
- $j = strpos($data,'gAMA');
- if ($j && strpos($data,'sRGB')===false) { // sRGB colorspace - overrides gAMA
- $gAMA=_fourbytes2int(substr($data,($j+4),4)); // Gamma value times 100000
- $gAMA /= 100000;
- }
- if ($gAMA) { $gamma_correction = 1/$gAMA; }
- // Don't need to apply gamma correction if == default i.e. 2.2
- if ($gamma_correction > 2.15 && $gamma_correction < 2.25) { $gamma_correction = 0; }
- if ($gamma_correction) { echo 'Gamma correction detected'. '<br />'; }
- // NOT supported at present
- if (strpos($data,'sRGB')!==false) echo 'sRGB colorspace - NOT supported at present'. '<br />';
- if (strpos($data,'cHRM')!==false) echo 'Chromaticity and Whitepoint - NOT supported at present'. '<br />';
- if (($errpng || $pngalpha || $gamma_correction)) {
- if (function_exists('gd_info')) { $gd = gd_info(); }
- else {$gd = array(); }
- if (!isset($gd['PNG Support'])) { echo 'GD library required for PNG image ('.$errpng.')'. '<br />';}
- $im = imagecreatefromstring($data);
- if (!$im) { echo 'Error creating GD image from PNG file ('.$errpng.')'. '<br />';}
- $w = imagesx($im);
- $h = imagesy($im);
- if ($im) {
- // Alpha channel set (including using tRNS for Paletted images)
- if ($pngalpha) {
- echo 'Alpha channel will be used by mPDF (including when tRNS present in Paletted images)<br />';
- if ($colspace=='Indexed') { echo '...Generating Alpha channel values from tRNS (Indexed)<br />'; }
- else if ($ct===0 || $ct==2) { echo '...Generating Alpha channel values from tRNS (non-Indexed)<br />'; }
- else { echo '...Extracting Alpha channel<br />'; }
- }
- else { // No alpha/transparency set (but cannot read directly because e.g. bit-depth != 8, interlaced etc)
- echo 'No alpha/transparency set (but cannot read directly because e.g. bit-depth != 8, interlaced etc)<br />';
- // ICC profile
- $icc = false;
- $p = strpos($data,'iCCP');
- if ($p && $colspace=="Indexed") {
- $p += 4;
- $n=_fourbytes2int(substr($data,($p-8),4));
- $nullsep = strpos(substr($data,$p,80), chr(0));
- $icc = substr($data, ($p+$nullsep+2), ($n-($nullsep+2)) );
- // Test if file is gzcompressed
- if (ord(substr($str, 0, 1)) == 0x1f && ord(substr($str, 1, 1)) == 0x8b) {
- $icc = @gzuncompress($icc); // Ignored if fails
- }
- if ($icc) {
- echo 'ICC profile present' . '<br />';
- if (substr($icc, 36, 4) != 'acsp') { echo 'ICC profile INVALID (no acsp flag)' . '<br />'; $icc = false; } // invalid ICC profile
- else {
- $input = substr($icc, 16, 4);
- $output = substr($icc, 20, 4);
- echo 'ICC profile Input: ' . $input. '<br />';
- echo 'ICC profile Output: ' . $output. '<br />';
- // Ignore Color profiles for conversion to other colorspaces e.g. CMYK/Lab
- if ($input != 'RGB ' || $output != 'XYZ ') { $icc = false; echo 'ICC profile ignored by mPDF' . '<br />'; }
- }
- }
- // Convert to RGB colorspace so can use ICC Profile
- if ($icc) { echo 'ICC profile and Indexed colorspace both present - need to Convert to RGB colorspace so can use ICC Profile<br />'; }
- }
- }
- }
- echo 'PNG Image parsed on second pass' . '<br />';
- // SECOND PASS
- imagealphablending($im, false);
- imagesavealpha($im, false);
- imageinterlace($im, false);
- ob_start();
- $check = @imagepng($im);
- if (!$check) { echo 'Error creating temporary image object whilst using GD library to parse PNG image' . '<br />'; }
- $data = ob_get_contents();
- ob_end_clean();
- if (!$data) { echo 'Error parsing temporary file image object created with GD library to parse PNG image' . '<br />'; }
- imagedestroy($im);
- //Check signature
- if(substr($data,0,8)!=chr(137).'PNG'.chr(13).chr(10).chr(26).chr(10)) {
- echo 'Error parsing PNG identifier<br />'; exit;
- }
- //Read header chunk
- if(substr($data,12,4)!='IHDR') {
- echo 'Incorrect PNG file (no IHDR block found)<br />'; exit;
- }
- $w=_fourbytes2int(substr($data,16,4));
- $h=_fourbytes2int(substr($data,20,4));
- $bpc=ord(substr($data,24,1));
- $errpng = false;
- $pngalpha = false;
- $channels = 0;
- echo 'Width: ' .$w . '<br />';
- echo 'Height: ' .$h . '<br />';
- echo 'BPC (bits per channel): ' .$bpc . '<br />';
- $ct=ord(substr($data,25,1));
- if($ct==0) { $colspace='DeviceGray'; $channels = 1; }
- elseif($ct==2) { $colspace='DeviceRGB'; $channels = 3; }
- elseif($ct==3) { $colspace='Indexed'; $channels = 1; }
- elseif($ct==4) { $colspace='DeviceGray'; $channels = 1; $errpng = 'alpha channel'; $pngalpha = true; }
- else { $colspace='DeviceRGB'; $channels = 3; $errpng = 'alpha channel'; $pngalpha = true; }
- echo 'Colorspace: ' . $colspace. '<br />';
- echo 'Channels: ' . $channels. '<br />';
- if ($pngalpha) echo 'Alpha channel detected'. '<br />';
- if ($ct < 4 && strpos($data,'tRNS')!==false) { echo 'Transparency detected'. '<br />'; $errpng = 'transparency'; $pngalpha = true;}
- if ($ct == 3 && strpos($data,'iCCP')!==false) { echo 'Indexed plus ICC'. '<br />'; $errpng = 'indexed plus ICC'; }
- if(ord(substr($data,26,1))!=0) { echo 'compression method not set to zero<br />'; $errpng = 'compression method'; } // only 0 should be specified
- if(ord(substr($data,27,1))!=0) { echo 'filter method not set to zero<br />'; $errpng = 'filter method'; } // only 0 should be specified
- if(ord(substr($data,28,1))!=0) { echo 'interlaced file not set to zero<br />'; $errpng = 'interlaced file'; }
- $j = strpos($data,'pHYs');
- if ($j) {
- //Read resolution
- $unitSp=ord(substr($data,($j+12),1));
- if ($unitSp == 1) {
- $ppUx=_fourbytes2int(substr($data,($j+4),4)); // horizontal pixels per meter, usually set to zero
- $ppUx=round($ppUx/1000 *25.4);
- }
- echo 'Resolution ppUx: ' . $ppUx. '<br />';
- }
- //Gamma correction
- $gamma_correction = 0;
- $gAMA = 0;
- $j = strpos($data,'gAMA');
- if ($j && strpos($data,'sRGB')===false) { // sRGB colorspace - overrides gAMA
- $gAMA=_fourbytes2int(substr($data,($j+4),4)); // Gamma value times 100000
- $gAMA /= 100000;
- }
- if ($gAMA) { $gamma_correction = 1/$gAMA; }
- // Don't need to apply gamma correction if == default i.e. 2.2
- if ($gamma_correction > 2.15 && $gamma_correction < 2.25) { $gamma_correction = 0; }
- if ($gamma_correction) { echo 'Gamma correction detected'. '<br />'; }
- // NOT supported at present
- if (strpos($data,'sRGB')!==false) echo 'sRGB colorspace - NOT supported at present'. '<br />';
- if (strpos($data,'cHRM')!==false) echo 'Chromaticity and Whitepoint - NOT supported at present'. '<br />';
- }
- else { // PNG image with no need to convert alpha channels, bpc <> 8 etc.
- //Scan chunks looking for palette, transparency and image data
- $pal='';
- $trns='';
- $pngdata='';
- $icc = false;
- $p = 33;
- do {
- $n=_fourbytes2int(substr($data,$p,4)); $p += 4;
- $type=substr($data,$p,4); $p += 4;
- if ($type=='PLTE') {
- //Read palette
- $pal=substr($data,$p,$n); $p += $n;
- $p += 4;
- }
- else if($type=='tRNS') {
- //Read transparency info
- $t=substr($data,$p,$n); $p += $n;
- if ($ct==0) $trns=array(ord(substr($t,1,1)));
- else if ($ct==2) $trns=array(ord(substr($t,1,1)),ord(substr($t,3,1)),ord(substr($t,5,1)));
- else {
- $pos=strpos($t,chr(0));
- if(is_int($pos)) $trns=array($pos);
- }
- $p += 4;
- }
- else if ($type=='IDAT') {
- $pngdata.=substr($data,$p,$n); $p += $n;
- $p += 4;
- }
- else if ($type=='iCCP') {
- $nullsep = strpos(substr($data,$p,80), chr(0));
- $icc = substr($data, ($p+$nullsep+2), ($n-($nullsep+2)) );
- // Test if file is gzcompressed
- if (ord(substr($str, 0, 1)) == 0x1f && ord(substr($str, 1, 1)) == 0x8b) {
- $icc = @gzuncompress($icc); // Ignored if fails
- }
- if ($icc) {
- echo 'ICC profile present' . '<br />';
- if (substr($icc, 36, 4) != 'acsp') { echo 'ICC profile INVALID (no acsp flag)' . '<br />'; $icc = false; } // invalid ICC profile
- else {
- $input = substr($icc, 16, 4);
- $output = substr($icc, 20, 4);
- echo 'ICC profile Input: ' . $input. '<br />';
- echo 'ICC profile Output: ' . $output. '<br />';
- // Ignore Color profiles for conversion to other colorspaces e.g. CMYK/Lab
- if ($input != 'RGB ' || $output != 'XYZ ') { $icc = false; echo 'ICC profile ignored by mPDF' . '<br />'; }
- }
- }
- $p += $n;
- $p += 4;
- }
- else if($type=='IEND') { break; }
- else if (preg_match('/[a-zA-Z]{4}/',$type)) { $p += $n+4; }
- else { echo 'Error parsing PNG image data<br />'; }
- }
- while($n);
- if (!$pngdata) { echo 'Error parsing PNG image data - no IDAT data found<br />';}
- if ($colspace=='Indexed' && empty($pal)) { echo 'Error parsing PNG image data - missing colour palette<br />'; }
- echo 'PNG Image parsed directly' . '<br />';
- }
- }
- // GIF
- else if ($type == 'gif') {
- }
- // BMP (Windows Bitmap)
- else if ($type == 'bmp') {
- }
- // WMF
- else if ($type == 'wmf') {
- }
- // UNKNOWN TYPE - try GD imagecreatefromstring
- else {
- if (function_exists('gd_info')) { $gd = gd_info(); }
- else {$gd = array(); }
- if (isset($gd['PNG Support']) && $gd['PNG Support']) {
- $im = @imagecreatefromstring($data);
- if ($im) { echo 'Image type not recognised, but image created from file using GD imagecreate' . '<br />'; }
- else { echo 'Error parsing image file - image type not recognised, and not supported by GD imagecreate' . '<br />'; }
- }
- }
- exit;
- //==============================================================
- function _fourbytes2int($s) {
- //Read a 4-byte integer from string
- return (ord($s[0])<<24) + (ord($s[1])<<16) + (ord($s[2])<<8) + ord($s[3]);
- }
- function _twobytes2int($s) { // equivalent to _get_ushort
- //Read a 2-byte integer from string
- return (ord(substr($s, 0, 1))<<8) + ord(substr($s, 1, 1));
- }
- function _jpgHeaderFromString(&$data) {
- $p = 4;
- $p += _twobytes2int(substr($data, $p, 2)); // Length of initial marker block
- $marker = substr($data, $p, 2);
- while($marker != chr(255).chr(192) && $marker != chr(255).chr(194) && $p<strlen($data)) {
- // Start of frame marker (FFC0) or (FFC2) mPDF 4.4.004
- $p += (_twobytes2int(substr($data, $p+2, 2))) + 2; // Length of marker block
- $marker = substr($data, $p, 2);
- }
- if ($marker != chr(255).chr(192) && $marker != chr(255).chr(194)) { return false; }
- return substr($data, $p+2, 10);
- }
- function _jpgDataFromHeader($hdr) {
- $bpc = ord(substr($hdr, 2, 1));
- if (!$bpc) { $bpc = 8; }
- $h = _twobytes2int(substr($hdr, 3, 2));
- $w = _twobytes2int(substr($hdr, 5, 2));
- $channels = ord(substr($hdr, 7, 1));
- if ($channels==3) { $colspace='DeviceRGB'; }
- elseif($channels==4) { $colspace='DeviceCMYK'; }
- else { $colspace='DeviceGray'; }
- return array($w, $h, $colspace, $bpc, $channels);
- }
- function file_get_contents_by_curl($url, &$data) {
- $timeout = 5;
- $ch = curl_init($url);
- curl_setopt($ch, CURLOPT_HEADER, 0);
- curl_setopt($ch, CURLOPT_NOBODY, 0);
- curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , 1 );
- curl_setopt ( $ch , CURLOPT_CONNECTTIMEOUT , $timeout );
- $data = curl_exec($ch);
- curl_close($ch);
- }
- function file_get_contents_by_socket($url, &$data) {
- // mPDF 5.7.3
- $timeout = 1;
- $p = parse_url($url);
- $file = $p['path'];
- if ($p['scheme']=='https') {
- $prefix = 'ssl://';
- $port = ($p['port'] ? $p['port'] : 443);
- }
- else {
- $prefix = '';
- $port = ($p['port'] ? $p['port'] : 80);
- }
- if ($p['query']) { $file .= '?'.$p['query']; }
- if(!($fh = @fsockopen($prefix.$p['host'], $port, $errno, $errstr, $timeout))) { return false; }
- $getstring =
- "GET ".$file." HTTP/1.0 \r\n" .
- "Host: ".$p['host']." \r\n" .
- "Connection: close\r\n\r\n";
- fwrite($fh, $getstring);
- // Get rid of HTTP header
- $s = fgets($fh, 1024);
- if (!$s) { return false; }
- $httpheader .= $s;
- while (!feof($fh)) {
- $s = fgets($fh, 1024);
- if ( $s == "\r\n" ) { break; }
- }
- $data = '';
- while (!feof($fh)) {
- $data .= fgets($fh, 1024);
- }
- fclose($fh);
- }
- //==============================================================
- function _imageTypeFromString(&$data) {
- $type = '';
- if (substr($data, 6, 4)== 'JFIF' || substr($data, 6, 4)== 'Exif' || substr($data, 0, 2)== chr(255).chr(216)) { // 0xFF 0xD8
- $type = 'jpeg';
- }
- else if (substr($data, 0, 6)== "GIF87a" || substr($data, 0, 6)== "GIF89a") {
- $type = 'gif';
- }
- else if (substr($data, 0, 8)== chr(137).'PNG'.chr(13).chr(10).chr(26).chr(10)) {
- $type = 'png';
- }
- /*-- IMAGES-WMF --*/
- else if (substr($data, 0, 4)== chr(215).chr(205).chr(198).chr(154)) {
- $type = 'wmf';
- }
- /*-- END IMAGES-WMF --*/
- else if (preg_match('/<svg.*<\/svg>/is',$data)) {
- $type = 'svg';
- }
- // BMP images
- else if (substr($data, 0, 2)== "BM") {
- $type = 'bmp';
- }
- return $type;
- }
|