GD库如何合并数组返回的链接图片?

2022-05-09 奥古斯宏

提问:

目前已经实现了前端显示数组的图片,但返回的图片如图1、2中的单张图片,原先代码如图3中。在原来的10-11行中显示代码如下:


echo "<img src='".$domain."/".$value.".png' />";

//修改前的代码
<?php include_once 'count.php';?>
<?php
$domain = './theme/moebooru'; // 文件目录名
$file_path = 'counter.dat'; // 访问次数存储文件名
$length = 7; // 最大单位为百万 即7位数。可修改
$count = trim(file_get_contents($file_path)); // 读取访问次数
$complete = str_repeat('0' , $length - strlen($count)) . $count; // 自动补全
$imageArray = str_split($complete); // 将字符串分割为字符数组
//$theme  = '';
foreach($imageArray as $key => $value){
	$imageArray[$key] = $domain . '/' . $value . '.png'; // 将数量对应为图片
	echo "<img src='".$domain."/".$value.".png' />";
}
?>

//修改新增
<?php
//1、导入图片,并计算宽高
$img = imagecreatefrompng($imageArray[$key]);
$width = imagesx($img);
$height = imagesy($img);
//2、查看并销毁
header("content-type:image/jpg");
imagepng($img);
imagedestroy($img);

现在想使用 GD库将上面输出的Arry数组 的图片链接 将$img赋值,然后依次拼接并显示到前端。

回答:

感觉你的思路有一些问题,你不能使用GD库返回一个数组,GD是处理图片的,并不能干更多的事情。这种情况的基本思路是先将0-9的图片存储到某个位置,前端展示的时候,每个数字有对应的图片地址。所以按你说的思路是不行的,没有这种说法。

版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。

然而我猜测,你的意思是说,并不是直接展示0-9的图片,而是通过使用PHP处理再展示。

方法1:

此时只要这样改就行:

// echo "<img src='".$domain."/".$value.".png' />";
// 把原来的这一行去掉。
// 这样读取图片
echo "<img src='".$domain."/readimg.php?value=".$value."' />";

这样最终的应当html如下:

<img src="/readimg.php?value=1" />
<img src="/readimg.php?value=2" />
<img src="/readimg.php?value=3" />

这样浏览器并不是直接去请求图片,而是请求PHP,在这个PHP中你使用GD加载响应图片,进行处理,然后直接输出到浏览器,就如你新增的那部分代码。但是只需要处理一个图片就行。

以上方法是一个思路更清晰的做法。

那么难道必须使用两个PHP文件吗?我直接将图片输出到页面上不行吗?可以的。但是这种做法在小编看来太复杂了,后面会简单对比一下两种做法。

版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。

方法2:

首先,你要遍历数组,处理每一个要处理的图片。然通过下面的方法获取到图片的结果,下面代码中的变量$image_data。

// $img = 要处理的图像资源;
ob_start();// 打开输出控制缓冲
imagepng($img);// 显示PNG图像
$image_data = ob_get_contents();// 返回输出缓冲区的内容
imagedestroy($img);// 释放与 image 关联的内存
ob_end_clean();// 清空(擦除)缓冲区并关闭输出缓冲

然后将图片数据输出到img标签里:

<img src='data:image/$format;base64,$data'>

此时就实现了你说的那种效果,遍历数组,将数组输出到页面上。

小结

这两种方法都是能实现效果,先用PHP处理图片再展示到页面上。

方法1中,PHP并不直接处理图片,而是输出指定的图片,与之前不同的是,并不是直接输出图片地址,而是一个PHP地址,并将图片对应的值通过get参数传进去。浏览器会readimg.php发起请求,并显示readimg.php输出内容,也就是GD库处理的结果。

在方法2中,PHP直接将要处理的图片处理好,并且将图片的结果存储为Base64格式,然后输出到img的src里。

版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。

这里面方法1的做法是比较好的,思路更清晰,代码也更简单,也更容易优化性能。一个明显的优点是,并没有在页面中处理图片,不需要等这些图片处理完在展示网页。

这里面你可能缺少几个知识点:

1.浏览器加载图片的流程,我们将一个图片路径写在html中,并没有将图片数据写在里面,只是一个路径,浏览器会去这个路径获取图片。

2.浏览器不会判断这个图片路径是否真的是一个图片路径,这个图片以png结尾和以PHP结尾都没有关系,浏览器都会请求,只要返回的数据是图片数据就能用。

3.html的img的src,支持base64的数据,你可以将图片数据转成base64的数据,直接输出在img的src中,浏览器会把它当做图片处理。

你可能不熟悉以上几个知识点,导致你陷入到了PHP直接输出多个图片的误区中。你没有办法在一个url中输出多个图片。

版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。

最近浏览
IP用户:52.230.*.*
12 小时前 GPTBot
IP用户:118.120.*.*
1 天前 Internet Explorer Windows 8.1
IP用户:110.89.*.*
2 天前 Internet Explorer Windows 7
IP用户:125.123.*.*
3 天前 Internet Explorer Windows 8.1
IP用户:42.52.*.*
3 天前 Chrome Windows 10
IP用户:36.6.*.*
4 天前 Internet Explorer Windows 7
IP用户:117.128.*.*
4 天前 Microsoft Edge Android 7.1
IP用户:23.95.*.*
5 天前 Chrome Windows 10
IP用户:66.249.*.*
6 天前 Googlebot
IP用户:66.249.*.*
6 天前 Googlebot
IP用户:173.252.*.*
7 天前 Generic Bot
IP用户:119.41.*.*
7 天前 Internet Explorer Windows 7
累计浏览次数:1010
评论
点击登录
phpreturn,PHP武器库,专注PHP领域的项目和资讯,收录和介绍PHP相关项目。
最近浏览 点击登录

本站所有权利归 phpreturn.com 所有

举报/反馈/投稿邮箱:phpreturn@ulthon.com

鲁ICP备19027671号-2