PHP gd库澄清

PHP gd库澄清,php,gd,Php,Gd,我正在查看这段代码,并且已经阅读了文档,但仍然不明白这应该如何工作。代码可以正常工作,但我想知道是否应该将标题输出为png而不是jpeg 这段代码到底是怎么回事?png图像是否转换为jpeg 我最终想做的是在一个目录中为所有gif、jpg、bmp和png图像添加水印。我将输出所有标题,而不管图像类型为jpg。这是正确的吗?我希望我说的有道理,我有点累了 $im2 = imagecreatefrompng($image) imagecopy() and more code here header(

我正在查看这段代码,并且已经阅读了文档,但仍然不明白这应该如何工作。代码可以正常工作,但我想知道是否应该将标题输出为png而不是jpeg

这段代码到底是怎么回事?png图像是否转换为jpeg

我最终想做的是在一个目录中为所有gif、jpg、bmp和png图像添加水印。我将输出所有标题,而不管图像类型为jpg。这是正确的吗?我希望我说的有道理,我有点累了

$im2 = imagecreatefrompng($image)
imagecopy() and more code here
header("Content-Type: image/jpeg");
imagejpeg($im2,'',50);

您的代码大致如下所示:

// Load the PNG file from disk into memory
$im2 = imagecreatefrompng($image) 
$im2
现在是引用图像的
资源。一旦进入内存,它就不是png或jpeg;它是未压缩的原始数据。图像的“格式”指定如何打包和格式化原始数据;此时,它没有这样的格式。它只是内存中的数据

// Some code which works with the image in memory, adding your watermark?
imagecopy() and more code here

// Tell the browser that we're output a JPG
header("Content-Type: image/jpeg");
如果您请求一个jpg(ie),那么服务器将负责为您编写此头。如果您正在通过PHP动态生成JPG,则必须手动输出标题。否则,PHP会假设您正在编写HTML,并在向stdout写入任何内容时立即输出相应的标题,可以通过
echo
或仅通过在
标记之外添加文本/空白

// compress as a jpeg, and send to browser
imagejpeg($im2,'',50);

imagejpeg
获取原始图像,将其压缩为jpg,然后将其写入文件(如果您为其提供文件名)或标准输出(将其发送到浏览器)。从技术上讲,要输出到浏览器,第二个参数应该是
null
,而不是
'
。最后一个参数50将jpeg质量指定为百分比。100表示高质量,0表示低质量。

imagejpeg函数以JPEG格式输出图像,而不考虑原始对象的格式。如果您想保留原始格式,则需要在加载文件时确定这一点,然后在生成输出时使用不同的函数-有imagepng、imagegif等函数。

代码将图像从PNG文件加载到GD资源中,然后对其进行操作,最后以不同的格式(JPEG)输出图像到浏览器


当您调用
imagecreatefrompng
时,您不仅指定GD应该使用该文件作为图像的当前工作副本,还告诉它读取文件,从PNG格式解码,并以未知的内部格式加载到内存中。此时,最初从中读取图像的文件格式不再重要。输出时,必须指定所需的格式,因为它不再具有与之关联的格式。这就是为什么要使用
imagejpeg

的原因
imagecreatefrompng
正在从PNG文件加载图像数据。此时的图像数据只是GD特定的像素数据


imagejpeg
以jpeg格式输出像素数据。因此,在这种情况下,您的标题应该指定jpeg。

哦,好的。。如果我理解正确,因为保存在服务器上的图像是原始格式的,那么它输出的图像实际上是jpg。是否正确?@timmay:否,因为使用了
imagejpeg
,所以图像以jpeg格式输出。如果最后使用了
imagepng
,则输出格式为png。谢谢Andrew。让我再试一次。。因此,如果我们有一个原始图片,这是一个png图像。然后我们使用imagecreatefrompng($image)来转换??还是操纵??信息技术然后图像以原始格式存储在服务器上,然后我们将标题输出为jpg,最后使用imagejpeg()。通过使用imagejpeg,这不就是我们原始图像的jpg吗?也许更好的说法是。。。它创建了一个副本??你说“然后图像以原始格式存储在服务器上”;这意味着它存储在磁盘上。一旦调用了
imagecreatefrompng
,所有事情都会在内存中发生。原始png文件被解压缩并复制到内存中。没有文件写入磁盘,所有图像处理都在内存中进行。最后,脚本通过
imagejpeg
将图像数据输出,然后将数据压缩为jpeg图像并发送到浏览器。同样,没有任何东西被写入磁盘。明白了。谢谢这里我唯一关心的是,即使png或gif图像被复制到内存中,然后输出到浏览器,URI中的文件扩展名仍然是png,我想知道是否应该为每个文件类型创建一个函数,并输出与该扩展名匹配的正确头。如果有关系的话。好的,谢谢。这正是梅格所说的。那么让我问你这个问题。如果正在处理的原始图像是png图像,则当浏览器将图像输出到浏览器时,扩展名仍然是png。这有关系吗?文件的扩展名仍然是“.png”,是的,但您没有输出文件。您正在输出图像的内存副本,它与文件完全分离。浏览器不知道文件的扩展名是什么。好的,这是我唯一关心的问题。因此,我不需要为输出的每种类型的文件创建不同的函数。事实上,这是个好消息。谢谢Zakalwe,谢谢Alxp。所以文件扩展名,即使在浏览器输出图像后仍然是png,也可以吗?我只是想知道是否应该为每种文件类型创建一个函数,并输出与扩展名匹配的标题。