РЕДАКТИРОВАТЬ
Спасибо за все ваши ответы, особенно @Mailerdaimon, которые заметили, что я не использовал вычисляемые значения в функции imagecopyresampled
.
Я больше не получаю черных изображений, но у меня все еще есть черная часть, поэтому я считаю, что моя формула соотношения должна быть обновлена: если я загружу ландшафтное изображение, высота нового изображения меньше 170 пикселей, а затем появится черный показ.
Как я могу убедиться, что высота изображения идет полностью?
Ниже приведен простой сценарий, позволяющий пользователям загружать фотографии . После завершения загрузки изображения отображаются как миниатюра 170px (h) x 150px (w).
Часть изменения размера работает, поскольку выходное изображение равно 170x150px, но я все равно получаю черную область, если
if ($_SERVER["REQUEST_METHOD"] == "POST") { $maxWidth = 150; $maxHeight = 170; $name = $_FILES ['image'] ['name']; $type = $_FILES ["image"] ["type"]; $size = $_FILES ["image"] ["size"]; $tmp_name = $_FILES ['image'] ['tmp_name']; list($originalWidth, $originalHeight) = getimagesize($tmp_name); if ($originalWidth > $originalHeight) { $thumbnail_height = floor(($originalHeight/$originalWidth)*$maxWidth); $thumbnail_width = $maxWidth; } else { $thumbnail_width = floor(($originalWidth/$originalHeight)*$maxHeight); $thumbnail_height = $maxHeight; } // Resample $image_p = imagecreatetruecolor($maxWidth, $maxHeight); imagecreatefrompng($tmp_name); imagecopyresampled($image_p, 0, 0, 0, 0, $thumbnail_width, $thumbnail_height, $originalWidth, $originalHeight); //start upload process $RandomNumber = uniqid(); $location = "uploads/$RandomNumber"; imagejpeg($image_p, $location, 100); $sql=query("UPDATE users SET image = '".$location."' WHERE id = '$id'"); } }
Любая идея, что я делаю неправильно?
Я никогда не использовал php, так что это может быть неверно, но я не вижу, где вы используете рассчитанные значения для ширины и высоты!
if ($originalWidth > $maxWidth || $originalHeight > $maxHeight) { if ($originalWidth / $maxWidth > $originalHeight / $maxHeight) { // width is the limiting factor $width = $maxWidth; $height = floor($width * $originalHeight / $originalWidth); } else { // height is the limiting factor $height = $maxHeight; $width = floor($height * $originalWidth / $originalHeight); }
здесь вы вычисляете высоту и ширину, и после этого они не отображаются нигде в вашем коде …
EDIT: вы используете:
$image_p = imagecreatetruecolor($maxWidth, $maxHeight); imagecreatefrompng($tmp_name); imagecopyresampled($image_p, 0, 0, 0, 0, $thumbnail_width, $thumbnail_height,$originalWidth, $originalHeight);
Но документация imagecopyresmapled
гласит, что функция принимает следующее
imagecopyresampled ($dst_image ,$src_image ,$dst_x ,$dst_y ,$src_x ,$src_y ,$dst_w , $dst_h ,$src_w ,$src_h )
Хотя я думаю, что ваш код должен быть
imagecopyresampled($image_p,$tmp_name, 0, 0, 0, 0, $thumbnail_width, $thumbnail_height,$originalWidth, $originalHeight);
как уже упоминалось @Manolo Salsas (и несколько других)
EDIT2: еще одна проблема заключается в том, как вы вычисляете значения Heigth и Width. если $height
вычисляется, нравится это
$height = floor($width * $originalHeight / $originalWidth);
он может быть меньше $maxHeight
, хотя и создает черную (незаполненную) область в вашем итоговом изображении, так как вы создали это изображение, используя максимальные значения
$image_p = imagecreatetruecolor($maxWidth, $maxHeight);
Чтобы исправить это, используйте рассчитанные значения $ thumbnail_height и $ thumbnail_width для создания изображения
$image_p = imagecreatetruecolor($thumbnail_width, $thumbnail_height);
или всегда изменяйте размер изображения до максимальных значений
imagecopyresampled($image_p,$tmp_name, 0, 0, 0, 0, $maxWidth, $maxHeight,$originalWidth, $originalHeight);
которые могут искажать изображение. Если вы не хотите, чтобы изображение исказилось, сначала подумайте об изменении размера, чтобы размер поместился в миниатюре, а затем обрезал более длинную сторону.
Вы можете изменить последнюю часть:
…
$ RandomNumber = md5 ($ image_p); $ location = "/ var / www / mysite / uploads / $ RandomNumber"; if (imagejpeg ($ image_p, $ location, 100)) {
query ("UPDATE users SET image = '". $ location. "' WHERE id = '$ id'"); }
…
Прежде всего,
@getimagesize($_FILES['userfile']['tmp_name']))
Эта функция проверяет, является ли файл реальным изображением (а не только расширением). Если файл не является изображением, он вернет false (и предупреждение, поэтому at).
Если файл является реальным изображением, можно вернуть его, если хотите:
list($width, $height, $type, $attributes) = @getimagesize($_FILES['userfile']['tmp_name']))
или просто размер:
$size = @getimagesize($_FILES['userfile']['tmp_name']))
Поэтому, если вы используете эту функцию, не забудьте добавить значение at и использовать условие if
чтобы проверить, действительно ли вы получаете реальный образ.
С другой стороны, после проверки того, что вы получаете реальное изображение и меньше размера, который вы хотите, вы можете сделать:
if(move_uploaded_file($_FILES['userfile']['tmp_name'], $imagePath)
где $imagePath
– это путь, по которому вы хотите $imagePath
изображение.
Затем вы можете:
$image = imagecreatefromjpeg($imagePath); $canvas=imagecreatetruecolor($maxwidth,$maxheight); imagecopyresampled($canvas, $image ,0,0,0,0,$maxwidth, $maxheight, $originalWidth, $originalHeight);
И у вас будет правильный размер изображения.