【问题标题】:PHP gd library clarificationPHP gd 库说明
【发布时间】:2011-01-12 04:52:54
【问题描述】:

我正在查看这段代码,并且已经阅读了文档,但仍然不明白它应该如何工作。代码可以正常工作,但我想知道是否应该将标题输出为 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);

【问题讨论】:

    标签: php gd


    【解决方案1】:

    您的代码所做的或多或少如下:

    // Load the PNG file from disk into memory
    $im2 = imagecreatefrompng($image) 
    

    $im2 现在是 resource,引用图像。一旦进入内存,它就不是 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(即http://host.com/image.jpg),则服务器会为您编写此标头。如果您通过 PHP 即时制作 JPG,则必须手动输出标题。否则,PHP 会假定您正在编写 HTML,并在通过 echo 或仅通过在 <?php ?> 标记之外添加文本/空白将任何内容写入标准输出时为您输出适当的标头。

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

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

    【讨论】:

    • 哦,好吧..如果我理解正确,因为保存在服务器上的图像是原始格式,那么它输出的图像实际上是jpg。对吗?
    • @timmay:不,因为使用了imagejpeg,所以图片输出为jpeg格式。如果最后使用imagepng,则输出格式为png。
    • 谢谢安德鲁。让我再试一次。所以如果我们有一张原始图片是 png 图像。然后我们使用 imagecreatefrompng($image) 来转换??还是操纵??它。然后图像以原始格式存储在服务器上,然后我们将标题输出为 jpg,最后使用 imagejpeg()。通过使用 imagejpeg,这实际上不是将我们的原始图像制作成 jpg 吗?也许更好的说法......它会创建一个副本?? jpg 格式的 png。
    • 您说“然后图像以原始格式存储在服务器上”;这意味着它存储在磁盘上。一旦调用了imagecreatefrompng,一切都发生在内存中。原始 png 文件被解压缩并复制到内存中。没有文件写入磁盘,所有图像处理都在内存中进行。最后,脚本将图像数据通过imagejpeg 传递出来,将数据压缩为jpeg 图像并发送到浏览器。同样,没有任何内容写入磁盘。
    • 知道了。谢谢。我唯一关心的是即使在将 png 或 gif 图像复制到内存然后输出到浏览器之后,URI 中的文件扩展名仍然是 png,我想知道是否应该为每个文件类型创建一个函数并输出正确的标题与该扩展名匹配。如果它甚至重要。
    【解决方案2】:

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

    【讨论】:

    • 感谢 Alxp。那么文件扩展名,即使浏览器输出图片后仍然是png,可以吗?
    • 我只是想知道是否应该为每种文件类型创建一个函数并输出与扩展名匹配的标题。
    【解决方案3】:

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

    当您调用imagecreatefrompng 时,您不只是指定 GD 应该使用该文件作为图像的当前工作副本,而是告诉它读取文件,将其从 PNG 格式解码,然后加载它以某种未知的内部格式存入内存。此时,最初读取图像的文件格式不再重要。当你输出它时,你必须指定你想要的格式,因为它不再有与之关联的格式。这就是您使用imagejpeg 的原因。

    【讨论】:

    • 好的,谢谢。这正是Megar所说的。那我问你这个。如果被操作的原始图片是png图片,当浏览器将图片输出到浏览器时,扩展名仍然是png。这有关系吗?
    • 文件的扩展名仍然是'.png',是的,但你没有输出文件。您正在输出图像的内存副本,该副本与文件完全分开。浏览器不知道文件的扩展名是什么。
    • 好的,这确实是我唯一关心的问题。所以我不需要为我输出的每种类型的文件创建不同的函数。这实际上是个好消息。谢谢 Zakalwe。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-21
      • 2010-12-14
      • 2012-08-24
      • 2011-08-20
      • 1970-01-01
      • 2012-03-06
      • 2011-08-31
      相关资源
      最近更新 更多