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}