У меня есть сайт электронной коммерции, в системе «Пользователи», когда пользователь загружает / обновляет свое изображение профиля, оно должно быть сжато следующим образом: если реальный размер изображения составляет 1 МБ, то после загрузки оно должно быть сжато и сохранено с размером 50 КБ. минимум и максимум 200 КБ, я делаю это так, Вот мой код:
public function updateProfilePic($file, $userid) {
$filename = $file['user_img']['name'];
$filetmp = $file['user_img']['tmp_name'];
$valid_ext = array('png', 'jpeg', 'jpg');
$location = "user/profilepic/" . $filename;
$file_extension = pathinfo($location, PATHINFO_EXTENSION);
$file_extensionstr = strtolower($file_extension);
if(!empty($filename)){
if (in_array($file_extensionstr, $valid_ext)) {
//Here i am compressing image
$this->compressImage($filetmp, $location, 9);
return $this->updateProfilePicture($filename, $userid);
} else {
$msg = '<div class="alert alert-danger" role="alert">Invalid file type. You can upload only:-' . implode(', ', $valid_ext) . '<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button></div>';
return $msg;
}
} else {
$msg = '<div class="alert alert-danger" role="alert">Please upload your profile picture.<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button></div>';
return $msg;
}
}
public function updateProfilePicture($filename, $userid){
$update = "UPDATE users SET user_img = '$filename' WHERE user_id = '$userid'";
$result = $this->db->update($update);
if($result){
$msg = '<div class="alert alert-success" role="alert">Profile picture uploaded successfully <a href="profile.php">Go back</a><button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button></div>';
return $msg;
} else {
$msg = '<div class="alert alert-danger" role="alert">Error while uploading profile picture. Pleas try again!<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button></div>';
return $msg;
}
}
public function compressImage($source, $destination, $quality) {
$info = getimagesize($source);
if ($info['mime'] == 'image/jpeg'){
$image = imagecreatefromjpeg($source);
} elseif ($info['mime'] == 'image/png'){
$image = imagecreatefrompng($source);
imagealphablending($image, false);
imagesavealpha($image, true);
}
imagepng($image, $destination, $quality);
}
Вы можете увидеть мою compressImage()
функцию, если я напишу imagejpeg()
Функция затем сжимает нормально, но в PNG (прозрачное) изображение, сохраняет с черным фоном. Итак, я заменил на imagepng()
функцию, но она не сжимает изображение, она увеличивает размер изображения после сохранения до Database
, как мой размер изображения был 2 MB
, когда я загружаю, то сохраняет с размером11 MB
. Я не знаю, что произошло.
Для ясности: Я просто хочу сжать изображения в формате png и jpg, а прозрачные изображения не следует сохранять на черном фоне. Пожалуйста, помогите мне