PHP Conference Japan 2024

imagecreatefrompng

(PHP 4, PHP 5, PHP 7, PHP 8)

imagecreatefrompng从文件或 URL 创建新图像

描述

imagecreatefrompng(字符串 $filename): GdImage|false

imagecreatefrompng() 返回一个图像标识符,表示从给定文件名获得的图像。

提示

如果启用了fopen 封装器,则可以使用 URL 作为此函数的文件名。有关如何指定文件名的更多详细信息,请参阅 fopen()。请参阅支持的协议和封装器,以获取有关各种封装器功能、使用说明以及它们可能提供的任何预定义变量的信息的链接。

参数

filename

PNG 图像的路径。

返回值

成功时返回一个图像对象,错误时返回false

变更日志

版本 描述
8.0.0 成功时,此函数现在返回一个GDImage 实例;以前,返回一个资源

示例

示例 #1 处理加载 PNG 期间发生的错误的示例

<?php
function LoadPNG($imgname)
{
/* 尝试打开 */
$im = @imagecreatefrompng($imgname);

/* 检查是否失败 */
if(!$im)
{
/* 创建一个空白图像 */
$im = imagecreatetruecolor(150, 30);
$bgc = imagecolorallocate($im, 255, 255, 255);
$tc = imagecolorallocate($im, 0, 0, 0);

imagefilledrectangle($im, 0, 0, 150, 30, $bgc);

/* 输出错误消息 */
imagestring($im, 1, 5, 5, 'Error loading ' . $imgname, $tc);
}

return
$im;
}

header('Content-Type: image/png');

$img = LoadPNG('bogus.image');

imagepng($img);
imagedestroy($img);
?>

以上示例将输出类似以下内容

imagecreatefrompng() example
添加注释

用户贡献的注释 4 条注释

匿名
20 年前
如果您尝试加载半透明的 png-24 图像,但发现没有透明度(例如它是黑色的),则需要启用 alpha 通道并保存设置。我刚接触 GD,花了将近两个小时才弄清楚这一点。

<?php
$imgPng
= imageCreateFromPng($strImagePath);
imageAlphaBlending($imgPng, true);
imageSaveAlpha($imgPng, true);

/* 将图像输出到浏览器 */
header("Content-type: image/png");
imagePng($imgPng);
?>
sageptr at gmail dot com
3 年前
因为 gd 和 imagick(目前)不支持动画 PNG,所以我编写了一个简单的函数来确定给定的 PNG 是否为 APNG。它不验证 PNG,只检查“acTL”块是否像规范中所说的那样出现在“IDAT”之前:https://wiki.mozilla.org/APNG_Specification

<?php

function is_apng(string $filename): bool
{
$f = new \SplFileObject($filename, 'rb');
$header = $f->fread(8);
if (
$header !== "\x89PNG\r\n\x1A\n") {
return
false;
}
while (!
$f->eof()) {
$bytes = $f->fread(4);
if (
strlen($bytes) < 4) {
return
false;
}
$length = unpack('N', $bytes)[1];
$chunkname = $f->fread(4);
switch (
$chunkname) {
case
'acTL':
return
true;
case
'IDAT':
return
false;
}
$f->fseek($length + 4, SEEK_CUR);
}
return
false;
}

?>
[email protected]
17 年前
我遇到了和 [email protected] 一样的问题,但我通过动态分配更多内存解决了它。

通常,php.ini 中的 memory_limit 变量设置为 8M。不幸的是,管理大约 1000x1000 的 PNG 图像所需的内存量可能更大!

我用来解决问题的办法是

1-计算图像所需的内存
2-设置新的 memory_limit 值
3-创建 PNG 图像和缩略图
4-恢复原始值

1-以下值对我有用
$required_memory = round($width * $height * $size['bits']);

请注意,对于 JPEG,要求并不相同
http://es2.php.net/manual/en/function.imagecreatefromjpeg.php#60241

2-使用类似以下内容
$new_limit=memory_get_usage() + $required_memory;
ini_set("memory_limit", $new_limit);

4-ini_restore ("memory_limit");
[email protected]
15 年前
当使用 imagecreatepng 和 alpha 混合时,您将丢失混合效果。

要克服这个问题,请使用类似以下内容
<?php
$dstimage
=imagecreatetruecolor($width,$height);
$srcimage=imagecreatefrompng($src);
imagecopyresampled($dstimage,$srcimage,0,0,0,0, $width,$height,$width,$height);
?>
其中 $width 和 $height 是 $src 图像的宽度和高度。

这将创建一个真彩色图像,然后将 png 图像复制到此真彩色图像并保留 alpha 混合。
To Top