Това е много стабилна рутина, която създава 2 изображения за визуализация и големи.
Той също така проверява 3-те типа изображения за най-малкия изход. Не ме интересува какъв формат е изображението, тъй като го поставям в HTML страницата като base64.
Той също така преобразува изображенията в base64 и ги записва в SQL таблица и записва изображението на base64 в HTML страница.
Докато прави мащабирането, снимките се показват за преглед.
Изглежда имате достатъчно познания за това, за да разберете кода ми.
Мога да го коментирам.
$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 = '';
Вземете типа на изображението според неговия MIME тип.
След това проверете отново с imagecreatefrom
Независимо от разширението, MIME тип, ако е изображение jpg, PNG или gif, то ще идентифицира положително типа.
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;}
}
}
}
}
Мащабиране до размера за визуализация
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();
Проверете кой тип изображение създава най-малък брой байтове
$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">';
}
Конвертирайте в bas64 и запазете
Използвам base64 изображения в моите HTML страници. Той елиминира HTTP двупосочно пътуване за всяко изображение.
Противниците се оплакват, че base64 добавя 30% към размера на изображението. И го прави.
Когато base64 е вграден в HTML, той се zgipped. А допълнителните 30% се компресират от gzip до много по-малко, типичност само няколко процента.
HTTP двупосочно пътуване варира от сървър до сървър, време на деня и т.н., но обикновено 200 милисекунди. Времето за предаване на base64 обикновено е само няколко милисекунди.
$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");
Мащаб до голямо изображение:
$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");