这几天解决了一个困扰已久的问题,我的博客系统在文章上传图片生成缩略图时,在本地测试环境没有任何问题,但在服务器环境中总是生成缩略图失败,报错:"Implicit conversion from float"。排查了 PHP 和环境扩展组件库、目录权限、图片格式大小等都没有问题。在百思不得其解时,我注意到了一个平时不太注意的细节,我在本地测试环境用的是 PHP 8.0,服务器上用的是 PHP 8.1,经过反复测试问题果然出在这里。
由于生成缩略图时会对图片进行宽高尺寸和比例计算,然后对图片进行等比例缩放和裁切,生成相应尺寸的缩略图。在 PHP 8.1 中,报错 "Implicit conversion from float" 通常是因为在代码中将一个浮点数转换为了整数,而这个浮点数可能无法精确地表示为整数,从而导致了这个错误,而在 PHP 8.0 中没有这么严格的判定,则不会报错。
要解决这个问题,可以采取以下几种方法:
使用 (int) 强制转换:如果你确定要将浮点数转换为整数,可以使用 (int) 来强制转换。这将确保将浮点数舍入为最接近的整数。例如:
$floatValue = 10.5;
$intValue = (int)$floatValue; // 将浮点数转换为整数
使用 floatval() 函数:floatval() 函数可以将一个字符串或变量转换为浮点数。如果你不确定一个变量是否为浮点数,可以使用该函数来确保将其转换为浮点数。例如:
$value = "10.5";
$floatValue = floatval($value); // 将字符串转换为浮点数
避免隐式转换:在编写代码时,尽量明确地进行类型转换,而不是依赖于隐式转换。使用 (int) 或 (float) 来明确地指定你要进行的类型转换。例如:
$floatValue = 10.5;
$intValue = (int)$floatValue; // 明确转换
$floatValue2 = (float)$intValue; // 明确转换
这是我用的缩略图生成类:
// 应用公共文件
* 居中裁剪图片
* @param string $source [原图路径]
* @param int $width [设置宽度]
* @param int $height [设置高度]
* @param string $target [目标路径]
* @return bool [裁剪结果]
function image_center_crop($source, $width, $height, $target)
if (!file_exists($source)) return false;
/* 根据类型载入图像 */
switch (exif_imagetype($source)) {
case IMAGETYPE_JPEG:
$image = imagecreatefromjpeg($source);
break;
case IMAGETYPE_PNG:
$image = imagecreatefrompng($source);
break;
case IMAGETYPE_GIF:
$image = imagecreatefromgif($source);
break;
if (!isset($image)) return false;
/* 获取图像尺寸信息 */
$target_w = $width;
$target_h = $height;
$source_w = imagesx($image);
$source_h = imagesy($image);
/* 计算裁剪宽度和高度 */
$judge = (($source_w / $source_h) > ($target_w / $target_h));
$resize_w = $judge ? ($source_w * $target_h) / $source_h : $target_w;
$resize_h = !$judge ? ($source_h * $target_w) / $source_w : $target_h;
$start_x = $judge ? ($resize_w - $target_w) / 2 : 0;
$start_y = !$judge ? ($resize_h - $target_h) / 2 : 0;
/* 绘制居中缩放图像 */
$resize_img = imagecreatetruecolor($resize_w, $resize_h);
imagecopyresampled($resize_img, $image, 0, 0, 0, 0, $resize_w, $resize_h, $source_w, $source_h);
$target_img = imagecreatetruecolor($target_w, $target_h);
imagecopy($target_img, $resize_img, 0, 0, $start_x, $start_y, $resize_w, $resize_h);
/* 将图片保存至文件 */
if (!file_exists(dirname($target))) mkdir(dirname($target), 0777, true);
switch (exif_imagetype($source)) {
case IMAGETYPE_JPEG:
imagejpeg($target_img, $target);
break;
case IMAGETYPE_PNG:
imagepng($target_img, $target);
break;
case IMAGETYPE_GIF:
imagegif($target_img, $target);
break;
return boolval(file_exists($target));
知道问题的所在了,通过使用 (int) 进行显式转换,确保传递给图像处理函数的参数是整数类型,从而避免隐式类型转换错误。修改后的第 41 - 44 行代码:
$resize_img = imagecreatetruecolor((int)$resize_w, (int)$resize_h);
imagecopyresampled($resize_img, $image, 0, 0, 0, 0, (int)$resize_w, (int)$resize_h, (int)$source_w, (int)$source_h);
$target_img = imagecreatetruecolor((int)$target_w, (int)$target_h);
imagecopy($target_img, $resize_img, 0, 0, (int)$start_x, (int)$start_y, (int)$resize_w, (int)$resize_h);
本站原创内容,如需转载请注明来源:
https://www.liutonghui.com/231.html
8月12日,国足公布了最新一期备战12强赛的球员名单,在李铁观察的60人中选择了其中31个进入本次国家队名单,其中包括了郭田雨、朱辰杰、高准翼等近期表现好的年轻小将。
最新一期国足名单:
门将:刘殿座、颜骏凌、王大雷、董春雨
后卫:蒋光太、张琳芃、高准翼、于大宝、李磊、王刚、王燊超、李昂、朱辰杰
中场:张稀哲、池忠国、金敬道、徐新、吴曦、尹鸿博、王秋明、蒿俊闵
前锋:武磊、艾克森、阿兰、韦世豪、洛国富、张玉宁、......
2021-08-14
12月17日,消失在歌迷视线中多年的老牌创作型歌手王杰突然发布了一首新歌《一场游戏一场梦(结束篇)》,今年是2022年,正好是王杰出道35年整。1987年12月19日,王杰在台湾发行首张专辑《一场游戏一场梦》正式出道,这张专辑一经发行就轰动了整个华语乐坛,在中国台湾、中国香港、中国大陆、东南亚等地都创下了惊人的销量,专辑中的同名主打歌《一场游戏一场梦》、《安妮》等歌曲直到今天依然是KTV点唱率非常高的歌曲。
点击上方播放视......
2022-12-24
刀郎的新歌《罗刹海市》最近引起了轰动,但这次不是因为它的音乐本身有多么好听或传唱度有多高,而是因为歌词被许多网友解读为内涵了那英、汪峰、杨坤和高晓松等名人,引发了广泛的兴趣和热议。
歌词中的一些词汇和意象被认为与这些名人的特点和经历有关,网友们纷纷展开联想,将歌词与这些名人一一对应起来。那英被指歌词中“那又鸟”所指,杨坤被描述为“马户”,高晓松被称为“拿扇子的公公&r......
2023-08-03
HTML5是HTML的最新版本,引入了一系列新的元素、属性和API,使得开发者可以创建更强大、更交互性的Web页面。以下是HTML5新手入门指南的一些建议:
1. 基础结构
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="......
2015-02-18
没开发布会,没有预告就直接开卖备受关注的旗舰手机,华为Mate60系列算是开了个头。这几天华为登上了热搜,这次是因为华为Mate60手机携带“麒麟芯片”提前开售,瞬间售罄,同时也标志着麒麟5G芯片的正式回归。这一消息在各大主流媒体平台上迅速引发热议,网友们纷纷发表意见,自媒体人也争相蹭热度,提出各自观点。
如果你打开华为商城app,可以看到华为已经在自家商城上架了华为Mate60系列手机,而这些手机已经......
2023-08-31
王冰冰是央视近年来力推的知名记者,她以初恋般的清纯可爱的外貌形象走红,被称为“央视收视密码”。走红后的王冰冰也被受邀参加了很多节目和活动,她本人的自媒体账号也收获了500万的粉丝。
不过,人红事非多,近日,就有人爆出了王冰冰大量的个人隐私内容,她早年英语四级成绩只有369分。考了两次才合格。爆料中还提到王冰冰其实早就结过婚了,并且现在属于离婚状态。还说王冰冰19岁就和男友同居,后来被甩了,嫁给了吉林......
2022-01-24
在PHP中,类(Class)和对象(Object)是面向对象编程的核心概念。类是创建对象的蓝图或模板,而对象则是类的实例。通过使用类和对象,可以模拟现实世界中的情况,并封装相关的属性和方法。
下面是一个简单的示例,展示了如何在PHP中定义一个类和创建对象:
class Car {
// 属性
public $color;
public $speed;
// 方法
......
2018-05-28