PHP JPEG Progressive Check 21,045 views

A PHP script to determine if a jpeg is progressive (Flash 7 can't display progressive pics) and if so, it resaves it in a non-progressive format.

  1<?php  2// this code (C) Musicman 2001  3// this code is GPL  4// feel free to obtain a copy of LICENSE.TXT from  5// the Free Software Foundation  6// and read up the details  7  8define("MARKER", 0xff);  9define("SOI", 0xd8); 10define("EOI", 0xd9); 11define("JFIF", 0xe0); 12define("APP", 0xe0); 13define("QUANT", 0xdb); 14define("HUFF", 0xc4); 15define("SOF0", 0xc0); 16define("SOF1", 0xc1); 17define("SOF2", 0xc2); 18define("SOS", 0xda); 19define("ED", 0xed); 20define("EE", 0xee); 21define("DD", 0xdd); 22function u16($fp) 23{  $res = ord(fread($fp, 1)) << 8; 24  $res += ord(fread($fp, 1)); 25  return $res; 26} 27function jpeghdr($fp) 28{  if(ord(fread($fp, 1)) != MARKER || ord(fread($fp, 1)) != SOI) 29    return false; 30  $length = 2; 31  $res = false; 32  while(ord(fread($fp, 1)) == MARKER) 33  {  $cod = ord(fread($fp, 1)); 34    if($cod == SOS) 35      break; 36    $len = u16($fp); 37    if($cod == QUANT || $cod == HUFF || $cod == DD || $cod == SOF0 || $cod == SOF1) 38      $length += 2 + $len; 39    if($cod == SOF0 || $cod == SOF1) 40    {  $len -= 5; 41      $res = array(); 42      $res["prec"] = ord(fread($fp, 1)); 43      $res["height"] = u16($fp); 44      $res["width"] = u16($fp); 45    }   46    else if($cod == SOF2) 47      return false; 48    else if($cod != JFIF && $cod != QUANT && $cod != HUFF && $cod != DD && ($cod & APP) != APP) 49      return false; 50    fseek($fp, $len-2, 1); 51  } 52  if($cod == SOS) 53  {  $pos = ftell($fp); 54    fseek($fp, 0, 2); 55    $length += ftell($fp) - $pos; 56    $res['length'] = $length; 57    return $res; 58  } 59  return false; 60} 61function testjpeg($name) 62{  if(!($fp = @fopen($name, "rb"))) 63    return false; 64  $res = jpeghdr($fp); 65  fclose($fp); 66  return $res; 67} 68 69function readjpeg($fp) {  rewind($fp); 70  if(ord(fread($fp, 1)) != MARKER || ord(fread($fp, 1)) != SOI) 71    return false; 72  $buf = chr(MARKER) . chr(SOI); 73  while(ord(fread($fp, 1)) == MARKER) 74  {  $cod = ord(fread($fp, 1)); 75    if($cod == SOS) 76      break; 77    if($cod == QUANT || $cod == HUFF || $cod == DD || $cod == SOF0 || $cod == SOF1) 78    {  $len = u16($fp); 79      $buf .= chr(MARKER) . chr($cod); 80      $buf .= chr($len >> 8); 81      $buf .= chr($len & 0xff); 82      $buf .= fread($fp, $len-2); 83    } 84    else 85    {  $len = u16($fp); 86      fseek($fp, $len-2, 1); 87    } 88  } 89  $buf .= chr(MARKER) . chr($cod); 90  while($next = fread($fp, 4096)) 91    $buf .= $next; 92  return $buf; 93} 94 95// $pic is a local filename path to the image. 96if ($jh = testjpeg($pic)) { 97  echo 'good'; 98} else { 99  echo 'Could be saved as progressive - fixing.';100101  $imagedata = getimagesize($pic);102  $width = $imagedata[0];103  $height = $imagedata[1];104105  $im2 = ImageCreateTrueColor($width, $height);106  $image = ImageCreateFromJpeg($pic);107  imageCopyResampled($im2, $image, 0, 0, 0, 0, $width, $height, $imagedata[0], $imagedata[1]);108  @imagejpeg($im2, $pic);109}