imagecreatefrompng

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

imagecreatefrompng从文件或 URL 创建新图像

描述

imagecreatefrompng(string $filename): GdImage|false

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

提示

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

参数

filename

PNG 图像的路径。

返回值

成功时返回图像对象,false 表示错误。

变更日志

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

示例

示例 #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
添加注释

用户贡献的注释 7 个注释

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;
}

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

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

/* 输出图像到浏览器 */
header("Content-type: image/png");
imagePng($imgPng);
?>
marcos at assl-site dot net
17 年前
我遇到了与 jboyd1189 at yahoo dot com 相同的问题,但我通过动态分配更多内存解决了它。

通常,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");
admin at wdfa dot co dot uk
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 混合。
Cyrille37
8 年前
图像大小(宽度 x 高度)不应超过 INT_MAX ... 这在 64 位计算机上仍然适用。
katalin at knittedforyou dot com
6 年前
我有以下代码

if (exif_imagetype($this->img_name) == IMAGETYPE_PNG) {
try {

$this->image = imagecreatefrompng($this->img_name);
Error::log('It is a png: '.$this->img_name);
} catch (Exception $e) {
echo "The image file has some strange charachters. Probably not a png image?";
$this->image = '';
$this->img_name = '';
}
}

我在 error.log 中得到以下错误
PHP Unknown error: imagecreatefrompng(): gd-png: fatal libpng error: Extra compressed data\n in Unknown on line 0

我尝试打开的文件是一个生成的 .png 图像,我可以从 gimp 和 Geeqie 中打开它。

问题出在哪里?你能帮帮我吗?
jboyd1189 at yahoo dot com
18 年前
我在使用 imagecreatefrompng 函数时遇到了很多麻烦,因为对于一张图像它工作得很好,但对于另一张图像却完全无法工作。经过几个小时的沮丧之后,我发现问题出在图像大小(像素数)。看来这个函数能处理的像素数最大为 1,040,000。因此,请确保图像的像素分辨率(例如 1040 x 1000)不超过这个值。
To Top