imagecopyresized() 返回黑色缩略图

Posted

技术标签:

【中文标题】imagecopyresized() 返回黑色缩略图【英文标题】:imagecopyresized() returning black thumbnails 【发布时间】:2013-10-21 13:32:52 【问题描述】:

我之前发布了另一个调整大小脚本不起作用的帖子,我对这个脚本做了更深入的了解,它的工作方式略有不同。

我走得更远了,只是现在有一个新问题。代码的前三行成功地将三个相同的文件放置在与文件相同的目标目录中,并且它是两个相应命名的缩略图文件。然后我想加载仍然是全尺寸的缩略图,并调整它们的大小,但脚本在imagecreatefromjpeg() 处停止,我似乎无法弄清楚为什么,因为$src 有一个值。

我认为我可以删除该行并将$source 替换为$src 在我的imagecopyresized() 函数中,这让我更加接近。但它会返回一个目标大小的缩略图,但缩略图是黑色的

move_uploaded_file($tmpFilePath, $newFilePath);
copy($newFilePath, $thumb500);
copy($newFilePath, $thumb200);


function thumbImage($src, $dest, $newheight) 
  list($width, $height) = getimagesize($src);

  $newwidth = $width * ($newheight / $height);

  // Load
  $thumb = imagecreatetruecolor($newwidth, $newheight);
  header('Content-type: image/jpeg');
  $source = imagecreatefromjpeg($src);

  // Resize
  imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

  // Output
  imagejpeg($thumb, $dest);


thumbImage($thumb500, $thumb500, 500);
thumbImage($thumb200, $thumb200, 200);

我觉得这一定是一个普遍的问题。有什么建议吗?

【问题讨论】:

不知道缩略图是干什么用的。但如果只是以较小的格式显示用户提供的图像,则可能使用开源动态缩略图创建器,例如 Timthumb。 @vinsanity38 我已经尝试过其他插件,但它们都不能按照我想要的方式工作,这就是为什么我尽可能少地自己构建它。但我猜这里还有一个更简单的问题。 好的,如果您的缩略图图像返回黑色,那么它可能是您为裁剪位置设置的 x 和 y 坐标。它们超出图像尺寸,因此返回黑色图像 @vinsanity38 好吧,我认为情况并非如此......因为我从图像的最开头开始 0,0,0,0 并且没有裁剪。我将不得不使用负值来裁剪我的imagecopyresized() 中的图像之外,不是吗? 【参考方案1】:

对我来说,如果我使用 JPEG 图像作为源,则提供的代码块有效。

问题可能是您使用了使用透明度的 PNG 图像。由于 JPEG 无法处理透明胶片,透明背景颜色将被填充。也许这就是问题所在。如果没有,请提供有问题行为的示例图片。

【讨论】:

您正在脚本中发送标题('Content-type: image/jpeg')。您是否尝试将脚本 URL 直接输出为图像?这将不起作用 1. 打印新旧尺寸和 2. 您不输出图像数据,请使用 readfile($thumb500) 。如果这没有帮助,请提供示例图像并提供您的 php 版本。对我来说,它适用于 PHP 5.5.1 也许你对这个答案很感兴趣:http://***.com/questions/3026646/phpgd-creating-random-black-thumbnails。图片是否有可能以 .jpg 作为结尾但不包含 JPEG 图片? 标题行被建议作为另一个线程中的修复,但我发现它在这个脚本中没有帮助也没有伤害。打印只是为了检查其他值是否不是问题,我将编辑它们以解决问题。我也很肯定它是.jpg,文件名是“healthy-cheesecake21.jpg”。告诉我更多关于这个readfile 以及我将如何在脚本中实现它的信息。 我需要一个示例图像的完整 URL,以便我可以下载它以验证它是否适合我,并且 PHP/GD 或图像没有一般问题。仅当您尝试直接在 image-tag 中使用上传脚本时,才需要 readfile 方法。 (标题行暗示了什么)。如果您使用缩略图的 URL,则无需使用readfile;【参考方案2】:

5

imagecopyresized 将图像资源作为其第二个参数,而不是文件名。您需要先加载文件。如果您知道文件类型,则可以使用 imagecreatefromFILETYPE 来加载它。例如,如果它是 JPEG,使用 imagecreatefromjpeg 并传递文件名 - 这将返回一个图像资源。

如果您不知道文件类型,一切都不会丢失。您可以将文件作为字符串读取并使用 imagecreatefromstring (自动检测文件类型)按如下方式加载它: $oldImage = imagecreatefromstring(file_get_contents($_FILES['image']['tmp_name'])); 在此输入代码

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于imagecopyresized() 返回黑色缩略图的主要内容,如果未能解决你的问题,请参考以下文章

ALAsset 缩略图有黑色背景

UIImageWriteToSavedPhotosAlbum 在相机胶卷中创建黑色缩略图

去除 youtube 缩略图上的黑色边框 4:3

使用 PHP (GD) 进行图像裁剪

我的第一个代码不起作用,第二个代码不起作用,但它们几乎相同。如何找到黑色缩略图的原因?

突破php 的imagecopyresampled 和imagecopyresized 实现图片马 JPG