PHP Conference Japan 2024

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 執行個體;先前會傳回 資源

範例

範例 #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 個註解

83
匿名
20 年前
如果您嘗試載入半透明的 png-24 影像,但發現沒有透明度(就像是黑色),您需要啟用 alpha 通道並儲存設定。我剛接觸 GD,花了將近兩個小時才弄清楚這一點。

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

/* 將影像輸出到瀏覽器 */
header("Content-type: image/png");
imagePng($imgPng);
?>
5
sageptr at gmail dot com
3 年前
由於 gd 和 imagick(目前)不支援動畫 PNG,我寫了一個簡單的函式來判斷給定的 PNG 是否為 APNG。它不會驗證 PNG,只會檢查是否在「IDAT」之前出現「acTL」區塊,如規格所述: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;
}

?>
12
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");
0
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 混合效果。
To Top