解决 PHP 8.1 隐式类型转换导致缩略图生成错误

  这几天解决了一个困扰已久的问题,我的博客系统在文章上传图片生成缩略图时,在本地测试环境没有任何问题,但在服务器环境中总是生成缩略图失败,报错:"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; // 明确转换

  这是我用的缩略图生成类:

<?php
// 应用公共文件

/**
 * 居中裁剪图片
 * @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

上一篇 2023-08-31
下一篇 2023-10-02

评论列表(0条)

  • 暂时没有评论!

发表评论

captcha

相关推荐

  • 如此国足名单是要放弃12强赛吗

      8月12日,国足公布了最新一期备战12强赛的球员名单,在李铁观察的60人中选择了其中31个进入本次国家队名单,其中包括了郭田雨、朱辰杰、高准翼等近期表现好的年轻小将。   最新一期国足名单:   门将:刘殿座、颜骏凌、王大雷、董春雨   后卫:蒋光太、张琳芃、高准翼、于大宝、李磊、王刚、王燊超、李昂、朱辰杰   中场:张稀哲、池忠国、金敬道、徐新、吴曦、尹鸿博、王秋明、蒿俊闵   前锋:武磊、艾克森、阿兰、韦世豪、洛国富、张玉宁、......

    2021-08-14
    14850
  • 王杰出道35周年出新歌,60岁浪子仍洒脱

      12月17日,消失在歌迷视线中多年的老牌创作型歌手王杰突然发布了一首新歌《一场游戏一场梦(结束篇)》,今年是2022年,正好是王杰出道35年整。1987年12月19日,王杰在台湾发行首张专辑《一场游戏一场梦》正式出道,这张专辑一经发行就轰动了整个华语乐坛,在中国台湾、中国香港、中国大陆、东南亚等地都创下了惊人的销量,专辑中的同名主打歌《一场游戏一场梦》、《安妮》等歌曲直到今天依然是KTV点唱率非常高的歌曲。 点击上方播放视......

    2022-12-24
    8140
  • 刀郎新歌《罗刹海市》引发轰动

      刀郎的新歌《罗刹海市》最近引起了轰动,但这次不是因为它的音乐本身有多么好听或传唱度有多高,而是因为歌词被许多网友解读为内涵了那英、汪峰、杨坤和高晓松等名人,引发了广泛的兴趣和热议。   歌词中的一些词汇和意象被认为与这些名人的特点和经历有关,网友们纷纷展开联想,将歌词与这些名人一一对应起来。那英被指歌词中&ldquo;那又鸟&rdquo;所指,杨坤被描述为&ldquo;马户&rdquo;,高晓松被称为&ldquo;拿扇子的公公&r......

    2023-08-03
    5840
  • 创业是条有趣的路,FC游戏网8周年

      能够创办一个网站,源源不断的为用户带来服务,是每个站长的梦想。2015年1月1日,也就是8年前的今天,我创办了FC游戏网,时间过得真的很快,一转眼已经过了8年。说起创办FC游戏网的初衷,其实是我自己喜欢玩游戏,能玩到那些各式各样的游戏,可以说是童年最快乐的时光,长大后对那些游戏依然念念不忘,因此,我就想一定有很多人像我一样,特别喜欢这些小时候玩的游戏,要是做一个网站把这些游戏收集整理起来,不光我自己玩着方便,也可以提供给别人下载,就......

    2023-01-01
    4980
  • HTML5新手入门指南

      HTML5是HTML的最新版本,引入了一系列新的元素、属性和API,使得开发者可以创建更强大、更交互性的Web页面。以下是HTML5新手入门指南的一些建议:   1. 基础结构 &lt;!DOCTYPE html&gt; &lt;html lang="en"&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;meta name="viewport" content="......

    2015-02-18
    18320
  • 华为Mate60手机开售,麒麟5G芯片回归,遥遥领先!

      没开发布会,没有预告就直接开卖备受关注的旗舰手机,华为Mate60系列算是开了个头。这几天华为登上了热搜,这次是因为华为Mate60手机携带&ldquo;麒麟芯片&rdquo;提前开售,瞬间售罄,同时也标志着麒麟5G芯片的正式回归。这一消息在各大主流媒体平台上迅速引发热议,网友们纷纷发表意见,自媒体人也争相蹭热度,提出各自观点。   如果你打开华为商城app,可以看到华为已经在自家商城上架了华为Mate60系列手机,而这些手机已经......

    2023-08-31
    7250
  • 王冰冰不能结婚离婚吗?谁规定的?

      王冰冰是央视近年来力推的知名记者,她以初恋般的清纯可爱的外貌形象走红,被称为&ldquo;央视收视密码&rdquo;。走红后的王冰冰也被受邀参加了很多节目和活动,她本人的自媒体账号也收获了500万的粉丝。   不过,人红事非多,近日,就有人爆出了王冰冰大量的个人隐私内容,她早年英语四级成绩只有369分。考了两次才合格。爆料中还提到王冰冰其实早就结过婚了,并且现在属于离婚状态。还说王冰冰19岁就和男友同居,后来被甩了,嫁给了吉林......

    2022-01-24
    12562
  • PHP中的类与对象和继承

      在PHP中,类(Class)和对象(Object)是面向对象编程的核心概念。类是创建对象的蓝图或模板,而对象则是类的实例。通过使用类和对象,可以模拟现实世界中的情况,并封装相关的属性和方法。   下面是一个简单的示例,展示了如何在PHP中定义一个类和创建对象: class Car { // 属性 public $color; public $speed; // 方法 ......

    2018-05-28
    17030