<?php
// this code (C) Musicman 2001
// this code is GPL
// feel free to obtain a copy of LICENSE.TXT from
// the Free Software Foundation
// and read up the details
define("MARKER", 0xff);
define("SOI", 0xd8);
define("EOI", 0xd9);
define("JFIF", 0xe0);
define("APP", 0xe0);
define("QUANT", 0xdb);
define("HUFF", 0xc4);
define("SOF0", 0xc0);
define("SOF1", 0xc1);
define("SOF2", 0xc2);
define("SOS", 0xda);
define("ED", 0xed);
define("EE", 0xee);
define("DD", 0xdd);
function u16($fp)
{ $res = ord(fread($fp, 1)) << 8;
$res += ord(fread($fp, 1));
return $res;
}
function jpeghdr($fp)
{ if(ord(fread($fp, 1)) != MARKER || ord(fread($fp, 1)) != SOI)
return false;
$length = 2;
$res = false;
while(ord(fread($fp, 1)) == MARKER)
{ $cod = ord(fread($fp, 1));
if($cod == SOS)
break;
$len = u16($fp);
if($cod == QUANT || $cod == HUFF || $cod == DD || $cod == SOF0 || $cod == SOF1)
$length += 2 + $len;
if($cod == SOF0 || $cod == SOF1)
{ $len -= 5;
$res = array();
$res["prec"] = ord(fread($fp, 1));
$res["height"] = u16($fp);
$res["width"] = u16($fp);
}
else if($cod == SOF2)
return false;
else if($cod != JFIF && $cod != QUANT && $cod != HUFF && $cod != DD && ($cod & APP) != APP)
return false;
fseek($fp, $len-2, 1);
}
if($cod == SOS)
{ $pos = ftell($fp);
fseek($fp, 0, 2);
$length += ftell($fp) - $pos;
$res['length'] = $length;
return $res;
}
return false;
}
function testjpeg($name)
{ if(!($fp = @fopen($name, "rb")))
return false;
$res = jpeghdr($fp);
fclose($fp);
return $res;
}
function readjpeg($fp) { rewind($fp);
if(ord(fread($fp, 1)) != MARKER || ord(fread($fp, 1)) != SOI)
return false;
$buf = chr(MARKER) . chr(SOI);
while(ord(fread($fp, 1)) == MARKER)
{ $cod = ord(fread($fp, 1));
if($cod == SOS)
break;
if($cod == QUANT || $cod == HUFF || $cod == DD || $cod == SOF0 || $cod == SOF1)
{ $len = u16($fp);
$buf .= chr(MARKER) . chr($cod);
$buf .= chr($len >> 8);
$buf .= chr($len & 0xff);
$buf .= fread($fp, $len-2);
}
else
{ $len = u16($fp);
fseek($fp, $len-2, 1);
}
}
$buf .= chr(MARKER) . chr($cod);
while($next = fread($fp, 4096))
$buf .= $next;
return $buf;
}
// $pic is a local filename path to the image.
if ($jh = testjpeg($pic)) {
echo 'good';
} else {
echo 'Could be saved as progressive - fixing.';
$imagedata = getimagesize($pic);
$width = $imagedata[0];
$height = $imagedata[1];
$im2 = ImageCreateTrueColor($width, $height);
$image = ImageCreateFromJpeg($pic);
imageCopyResampled($im2, $image, 0, 0, 0, 0, $width, $height, $imagedata[0], $imagedata[1]);
@imagejpeg($im2, $pic);
}