Detta är en mycket robust rutin som skapar 2 bilder förhandsgranskning och stora.
Den kontrollerar också de tre bildtyperna för den minsta utskriften. Jag bryr mig inte om vilket format bilden är eftersom jag skrev den på HTML-sidan som base64.
Den konverterar också bilderna till base64 och sparar dem i en SQL-tabell och sparar base64-bilden till en HTML-sida.
Medan den gör skalningen visas bilderna för granskning.
Du verkar ha tillräckligt med kunskap om detta för att förstå min kod.
Jag får kommentera det.
$thumbWidth = 60;
$thumbHeight = 60;
$previewWidth = 200;
$previewHeight = 150;
$bigWidth = 800;
$bigHeight = 600;
if( is_uploaded_file($_FILES['ava']['tmp_name']) || !($_FILES['ava']['error'] !== UPLOAD_ERR_OK)){
$save = false;
$jspan = '';
$gspan = '';
$pspan = '';
Hämta typen av bild efter dess MIME-typ.
Kontrollera sedan igen med imagecreatefrom
Oavsett filnamnstillägg, MIME-typ, om det är en bild jpg, png eller gif, kommer den att identifiera typen positivt.
switch(strtolower($_FILES['ava']['type'])){
case 'image/jpeg':
$image = @imagecreatefromjpeg($_FILES['ava']['tmp_name']);
if ($image !== false){$save = true;break;}
case 'image/png':
$image = @imagecreatefrompng($_FILES['ava']['tmp_name']);
if ($image !== false){$save = true;break;}
case 'image/gif':
$image = @imagecreatefromgif($_FILES['ava']['tmp_name']);
if ($image !== false){$save = true;break;}
default:
$img = @getimagesize($_FILES['ava']['tmp_name']);
switch(strtolower($img['mime'])){
case 'image/jpeg':
$image = @imagecreatefromjpeg($_FILES['ava']['tmp_name']);
if ($image !== false){$save = true;break;}
case 'image/png':
$image = @imagecreatefrompng($_FILES['ava']['tmp_name']);
if ($image !== false){$save = true;break;}
case 'image/gif':
$image = @imagecreatefromgif($_FILES['ava']['tmp_name']);
if ($image !== false){$save = true;break;}
default:
$filename = $_FILES['ava']['name'];
$ext = substr($filename,-3);
switch(strtolower($ext)){
case 'jpg':
$image = @imagecreatefromjpeg($_FILES['ava']['tmp_name']);
if ($image !== false){$save = true;break;}
case 'gif':
$image = @imagecreatefromgif($_FILES['ava']['tmp_name']);
if ($image !== false){$save = true;break;}
case 'png':
$image = @imagecreatefrompng($_FILES['ava']['tmp_name']);
if ($image !== false){$save = true;break;}
default:
$image = @imagecreatefromjpeg($_FILES['ava']['tmp_name']);
if ($image !== false){$save = true;break;}
$image = @imagecreatefrompng($_FILES['ava']['tmp_name']);
if ($image !== false){$save = true;break;}
$image = @imagecreatefromgif($_FILES['ava']['tmp_name']);
if ($image !== false){$save = true;break;}
}
}
}
}
Skala till förhandsgranskningsstorleken
if ($save === true){
$originalWidth = imagesx($image);
$originalHeight = imagesy($image);
$scale = min($previewWidth/$originalWidth, $previewHeight/$originalHeight);
$newWidth = ceil($scale*$originalWidth);
$newHeight = ceil($scale*$originalHeight);
$newPic = imagecreatetruecolor($newWidth, $newHeight);
imagecopyresampled($newPic, $image,0, 0, 0, 0,$newWidth, $newHeight, $originalWidth, $originalHeight);
ob_start();
imagejpeg($newPic, NULL, 70);
$jpg = ob_get_clean();
ob_clean();
ob_end_flush();
$jLen = strlen($jpg);
ob_start();
imagepng($newPic, NULL, 9);
$png = ob_get_clean();
ob_clean();
ob_end_flush();
$pLen = strlen($png);
ob_start();
imagegif($newPic);
$gif = ob_get_clean();
ob_clean();
ob_end_flush();
Kontrollera vilken bildtyp som skapar det minsta antalet byte
$gLen = strlen($gif);
if ($gLen < $jLen){
if ($pLen < $gLen){
$raw = $png;
$png = null;
$type = 'png';
$pspan = '<span class="size">';
}
else{
$raw = $gif;
$gif = null;
$type = 'gif';
$gspan = '<span class="size">';
}
}
elseif($pLen < $jLen){
$raw = $png;
$png = null;
$type = 'png';
$pspan = '<span class="size">';
}
else{
$raw = $jpg;
$jpg = null;
$type = 'jpg';
$jspan = '<span class="size">';
}
Konvertera till bas64 och spara
Jag använder base64-bilder i mina HTML-sidor. Det eliminerar HTTP tur och retur för varje bild.
Nejsägarna klagar på att base64 lägger till 30 % till bildstorleken. Och det gör det.
När base64 är inbäddad i HTML, blir den zgipped. Och de extra 30 % komprimeras av gzip till mycket mindre, typiskt bara några få procent.
En HTTP-rundtur varierar från server till server, tid på dygnet etc. men vanligtvis 200 millisekunder. Sändningstiden för base64 är vanligtvis bara några millisekunder.
$base64 = base64_encode($raw);
$thumb1 = "<img width=\"$newWidth\" height=\"$newHeight\" src=\"data:image/$type;base64,$base64\" alt =\"profile thumb one\"/>";
$size = 'Thumb';
echo "<p>Image $num $size <br>$jspan jpg: $jLen bytes</span>, <br>$gspan gif: $gLen bytes</span>, <br>$pspan png: $pLen bytes</span></p> $thumb1";
$filename = 'thumb1.' . $type;
$fp = fopen($filename ,"w");
fwrite($fp, $raw);
fclose($fp);
imagedestroy($newPic);
$filename = "thumb1_$type.html";
$fp = fopen($filename ,"w");
fwrite($fp, $thumb1);
fclose($fp);
$thumb1 = mysql_escape_string($thumb1);
@mysql_unbuffered_query("UPDATE `photos` SET `thumb1`='$thumb1' WHERE `id`=$id");
Skala till stor bild:
$scale = min($bigWidth/$originalWidth, $bigHeight/$originalHeight);
$newWidth = ceil($scale*$originalWidth);
$newHeight = ceil($scale*$originalHeight);
$newPic = imagecreatetruecolor($newWidth, $newHeight);
imagecopyresampled($newPic, $image,0, 0, 0, 0,$newWidth, $newHeight, $originalWidth, $originalHeight);
ob_start();
imagejpeg($newPic, NULL, 70);
$jpg = ob_get_clean();
ob_clean();
ob_end_flush();
$jLen = strlen($jpg);
ob_start();
imagepng($newPic, NULL, 9);
$png = ob_get_clean();
ob_clean();
ob_end_flush();
$pLen = strlen($png);
ob_start();
imagegif($newPic);
$gif = ob_get_clean();
ob_clean();
ob_end_flush();
$gLen = strlen($gif);
if ($gLen < $jLen){
if ($pLen < $gLen){
$raw = $png;
$png = null;
$type = 'png';
$pspan = '<span class="size">';
}
else{
$raw = $gif;
$gif = null;
$type = 'gif';
$gspan = '<span class="size">';
}
}
elseif($pLen < $jLen){
$raw = $png;
$png = null;
$type = 'png';
$pspan = '<span class="size">';
}
else{
$raw = $jpg;
$jpg = null;
$type = 'jpg';
$jspan = '<span class="size">';
}
$base64 = base64_encode($raw);
$size = 'Full Size';
$filename = 'big1.' . $type;
$big1 = "<img width=\"$newWidth\" height=\"$newHeight\" src=\"data:image/$type;base64,$base64\" alt =\"profile photo one\"/>";
echo "<p>Image $num $size <br>$jspan jpg: $jLen bytes</span>, <br>$gspan gif: $gLen bytes</span>, <br>$pspan png: $pLen bytes</span></p> $big1";
$fp = fopen($filename ,"w");
fwrite($fp, $raw);
fclose($fp);
imagedestroy($newPic);
$filename = "big1_$type.html";
$fp = fopen($filename ,"w");
fwrite($fp, $big1);
fclose($fp);
$big1 = mysql_escape_string($big1);
@mysql_unbuffered_query("UPDATE `photos` SET `big1`='$big1' WHERE `id`=$id");