#php
Вопрос:
Я попытался создать миниатюру для каждого загруженного изображения. Это включает в себя изменение размера изображения до заданного соотношения, а также преобразование его в расширение .webp.
Но после загрузки он становится черным. Все, что я искал, не работает для меня, особенно это
imagealphablending($resized, false);
imagesavealpha($resized, true);
Я также попытался сохранить его в файл .png imagepng($resized, $thumbnail_dir, $quality)
, чтобы посмотреть, влияет ли это на проблему. Но все равно не повезло.
Вот мой код для создания миниатюр. Я надеюсь, что вы сможете мне помочь.
// Create thumbnail
public function createThumbnail($image, $new_height, $dir, $quality = 100){
$image_info = pathinfo($image);
$ext = $image_info['extension'];
$filename = $image_info['filename'];
// Open original image
if($ext == "jpeg" || $ext == "jpg"){
$original = imagecreatefromjpeg($image);
}else if($ext == "png"){
$original = imagecreatefrompng($image);
}else if($ext == "webp"){
$original = imagecreatefromwebp($image);
}
// Get image dimensions
$size = getimagesize($image);
$original_width = $size[0];
$original_height = $size[1];
// Resize image
if($new_height < $original_height){
$ratio = $original_width / $original_height;
$new_width = ceil($ratio * $new_height);
}else{
$new_width = $original_width;
$new_height = $original_height;
}
$resized = imagecreatetruecolor($new_width, $new_height);
$background = imagecolorallocate($resized, 255, 255, 255);
imagecolortransparent($resized, $background);
imagealphablending($resized, false);
imagesavealpha($resized, true);
imagecopyresampled(
$resized, $original,
0,0,0,0,
$new_width, $new_height,
$original_width, $original_height
);
// Save thumbnail
$thumbnail_dir = $dir."thumb/".$filename.".webp";
imagewebp($resized, $thumbnail_dir, $quality);
imagedestroy($original);
imagedestroy($resized);
return $thumbnail_dir;
}
Комментарии:
1. Вы проверяли, активирована ли библиотека GD в вашем php.ini ?
2. Да, он уже активирован в моем php.ini
Ответ №1:
Вы можете попробовать это. Это должно сработать.
Я использую следующие две библиотеки для устранения этой проблемы.
https://github.com/rosell-dk/webp-convert
http://image.intervention.io/getting_started/installation
use InterventionImageImageManager;
use WebPConvertWebPConvert;
function create_thumbnail_webp_image(){
$msg = null;
$target_dir = $_SERVER['DOCUMENT_ROOT'] . "/converted_images/";
$target_file = $target_dir . basename($_FILES["upload_file_name"]["name"]);
$unique_file_name = md5($_FILES["upload_file_name"]["name"] . time());
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file, PATHINFO_EXTENSION));
$image_info = pathinfo($target_file);
$target_file = $target_dir . $unique_file_name . '.' . $image_info['extension'];
// Check if image file is a actual image or fake image
if (isset($_POST["submit"])) {
$check = getimagesize($_FILES["upload_file_name"]["tmp_name"]);
if ($check !== false) {
$uploadOk = 1;
} else {
$msg .= " File is not an image.";
$uploadOk = 0;
}
}
// Check if file already exists
if (file_exists($target_file)) {
$msg .= " File already exists.";
$uploadOk = 0;
}
// Check file size
if ($_FILES["upload_file_name"]["size"] > 500000) {
$msg .= " Your file is too large.";
$uploadOk = 0;
}
// Allow certain file formats
if ($imageFileType != "jpg" amp;amp; $imageFileType != "png" amp;amp; $imageFileType != "jpeg"
amp;amp; $imageFileType != "gif" amp;amp; $imageFileType != "webp") {
$msg .= " Only JPG, JPEG, PNG, GIF, WEBP files are allowed.";
$uploadOk = 0;
}
// Check if $uploadOk is set to 0 by an error
if ($uploadOk == 0) {
$msg .= " Sorry, your file was not uploaded.";
redirect('new_banner_image', $image_id, $msg, 'warn');
// if everything is ok, try to upload file
} else {
if (move_uploaded_file($_FILES["upload_file_name"]["tmp_name"], $target_file)) {
if ($imageFileType != 'webp') {
// Save the webp image
WebPConvert::convert($target_file, $image_info['dirname'] . '/' . $unique_file_name . '.webp');
}
// use third party image library to fetch the image
$manager = new ImageManager(array('driver' => 'gd'));
// open an image file
$img = $manager->make($target_file);
// now you are able to resize the instance
$img->resize(320, 240);
// finally we save the image as a new file
$img->save($image_info['dirname'] . '/' . $unique_file_name . '.png');
$msg .= " The file " . basename($_FILES["upload_file_name"]["name"]) . " has been uploaded.";
} else {
$msg .= "Sorry, there was an error uploading your file.";
}
}
}
Комментарии:
1. Спасибо, я не знал об этих библиотеках. На самом деле я пытаюсь преобразовать измененное изображение в файл .webp, а не в исходное. Я просто немного подправил код, который вы предоставили, и, наконец, заставил его работать.