2024 日本 PHP 研討會

imagecreate

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

imagecreate建立新的調色盤 based 影像

說明

imagecreate(int $width, int $height): GdImage|false

imagecreate() 會回傳一個圖像識別碼,代表一個指定大小的空白圖像。

一般來說,我們建議使用 imagecreatetruecolor() 來取代 imagecreate(),以便以最高的圖像品質進行圖像處理。如果您想要輸出調色板圖像,則應在使用 imagepng()imagegif() 儲存圖像之前立即呼叫 imagetruecolortopalette()

參數

width

圖像寬度。

height

圖像高度。

回傳值

成功時回傳一個圖像物件,錯誤時回傳 false

更新日誌

版本 說明
8.0.0 成功時,此函式現在會回傳一個 GDImage 實例;先前會回傳一個 resource

範例

範例 #1 建立新的 GD 圖像串流並輸出圖像。

<?php
header
("Content-Type: image/png");
$im = @imagecreate(110, 20)
or die(
"無法初始化新的 GD 圖像串流");
$background_color = imagecolorallocate($im, 0, 0, 0);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5, "一個簡單的文字字串", $text_color);
imagepng($im);
imagedestroy($im);
?>

上述範例將輸出類似以下的內容

Output of example : Creating a new GD image stream and outputting an image.

參見

新增筆記

使用者貢獻的筆記 17 則筆記

DHKold
19 年前
為了從 BMP 檔案建立影像,我製作了這個函式,它會像其他 ImageCreateFrom 函式一樣返回資源。

<?php
/*********************************************/
/* Fonction: ImageCreateFromBMP */
/* Author: DHKold */
/* Contact: admin@dhkold.com */
/* Date: The 15th of June 2005 */
/* Version: 2.0B */
/*********************************************/

function ImageCreateFromBMP($filename)
{
//Ouverture du fichier en mode binaire
if (! $f1 = fopen($filename,"rb")) return FALSE;

//1 : Chargement des ent?tes FICHIER
$FILE = unpack("vfile_type/Vfile_size/Vreserved/Vbitmap_offset", fread($f1,14));
if (
$FILE['file_type'] != 19778) return FALSE;

//2 : Chargement des ent?tes BMP
$BMP = unpack('Vheader_size/Vwidth/Vheight/vplanes/vbits_per_pixel'.
'/Vcompression/Vsize_bitmap/Vhoriz_resolution'.
'/Vvert_resolution/Vcolors_used/Vcolors_important', fread($f1,40));
$BMP['colors'] = pow(2,$BMP['bits_per_pixel']);
if (
$BMP['size_bitmap'] == 0) $BMP['size_bitmap'] = $FILE['file_size'] - $FILE['bitmap_offset'];
$BMP['bytes_per_pixel'] = $BMP['bits_per_pixel']/8;
$BMP['bytes_per_pixel2'] = ceil($BMP['bytes_per_pixel']);
$BMP['decal'] = ($BMP['width']*$BMP['bytes_per_pixel']/4);
$BMP['decal'] -= floor($BMP['width']*$BMP['bytes_per_pixel']/4);
$BMP['decal'] = 4-(4*$BMP['decal']);
if (
$BMP['decal'] == 4) $BMP['decal'] = 0;

//3 : Chargement des couleurs de la palette
$PALETTE = array();
if (
$BMP['colors'] < 16777216)
{
$PALETTE = unpack('V'.$BMP['colors'], fread($f1,$BMP['colors']*4));
}

//4 : Cr?ation de l'image
$IMG = fread($f1,$BMP['size_bitmap']);
$VIDE = chr(0);

$res = imagecreatetruecolor($BMP['width'],$BMP['height']);
$P = 0;
$Y = $BMP['height']-1;
while (
$Y >= 0)
{
$X=0;
while (
$X < $BMP['width'])
{
if (
$BMP['bits_per_pixel'] == 24)
$COLOR = unpack("V",substr($IMG,$P,3).$VIDE);
elseif (
$BMP['bits_per_pixel'] == 16)
{
$COLOR = unpack("n",substr($IMG,$P,2));
$COLOR[1] = $PALETTE[$COLOR[1]+1];
}
elseif (
$BMP['bits_per_pixel'] == 8)
{
$COLOR = unpack("n",$VIDE.substr($IMG,$P,1));
$COLOR[1] = $PALETTE[$COLOR[1]+1];
}
elseif (
$BMP['bits_per_pixel'] == 4)
{
$COLOR = unpack("n",$VIDE.substr($IMG,floor($P),1));
if ((
$P*2)%2 == 0) $COLOR[1] = ($COLOR[1] >> 4) ; else $COLOR[1] = ($COLOR[1] & 0x0F);
$COLOR[1] = $PALETTE[$COLOR[1]+1];
}
elseif (
$BMP['bits_per_pixel'] == 1)
{
$COLOR = unpack("n",$VIDE.substr($IMG,floor($P),1));
if ((
$P*8)%8 == 0) $COLOR[1] = $COLOR[1] >>7;
elseif ((
$P*8)%8 == 1) $COLOR[1] = ($COLOR[1] & 0x40)>>6;
elseif ((
$P*8)%8 == 2) $COLOR[1] = ($COLOR[1] & 0x20)>>5;
elseif ((
$P*8)%8 == 3) $COLOR[1] = ($COLOR[1] & 0x10)>>4;
elseif ((
$P*8)%8 == 4) $COLOR[1] = ($COLOR[1] & 0x8)>>3;
elseif ((
$P*8)%8 == 5) $COLOR[1] = ($COLOR[1] & 0x4)>>2;
elseif ((
$P*8)%8 == 6) $COLOR[1] = ($COLOR[1] & 0x2)>>1;
elseif ((
$P*8)%8 == 7) $COLOR[1] = ($COLOR[1] & 0x1);
$COLOR[1] = $PALETTE[$COLOR[1]+1];
}
else
return
FALSE;
imagesetpixel($res,$X,$Y,$COLOR[1]);
$X++;
$P += $BMP['bytes_per_pixel'];
}
$Y--;
$P+=$BMP['decal'];
}

//Fermeture du fichier
fclose($f1);

return
$res;
}
?>
wouter at rusman dot net
23 年前
要在某些 Linux 發行版上編譯 GD 支援,您必須在 ./configure 命令中包含以下內容
--with=gd=/usr --with-jpeg=/usr --with-png=/usr --with-zlib=/usr

(我在 Redhat 6.1 上必須包含這個)
這是因為函式庫位於 /usr/lib 而不是 /lib
Sohel Taslim
17 年前
這是一個簡單的範例,用於使用選定的字體將文字轉換為影像。
當使用者沒有安裝孟加拉文字體時,它可以幫助我將孟加拉文顯示為影像。

我希望它也能幫助你!

<?php
//將字體檔案放在一起或寫入正確的路徑。
makeImageF("PHP 之旅","CENTURY.TTF");

function
makeImageF($text, $font="CENTURY.TTF", $W=200, $H=20, $X=0, $Y=0, $fsize=18, $color=array(0x0,0x0,0x0), $bgcolor=array(0xFF,0xFF,0xFF)){

$im = @imagecreate($W, $H)
or die(
"無法初始化新的 GD 影像串流");

$background_color = imagecolorallocate($im, $bgcolor[0], $bgcolor[1], $bgcolor[2]); //RGB 背景顏色。
$text_color = imagecolorallocate($im, $color[0], $color[1], $color[2]); //RGB 文字顏色。

imagettftext($im, $fsize, $X, $Y, $fsize, $text_color, $font, $text);

header("Content-type: image/gif");
return
imagegif($im);
}

?>
robert at scpallas dot de
22 年前
ImageCreate() 函式會建立一個調色盤影像 (PALETTE image)。
ImageCreateFromJPEG() 函式會建立一個真彩色影像 (TRUE COLOR image)。

當您使用 GD 2.0 時,如果您嘗試將 ImageCopy()
用於一個真彩色影像和一個調色盤影像,就會發生錯誤。

在使用 ImageCopy() 之前,請務必轉換其中一個影像,或者使用 ImageCreateTrueColor() 取代 ImageCreate()。
altype at bellsouth dot net
23 年前
ImagePNG($pic,"./dir/pic.png");

要將影像儲存為檔案,我必須建立一個目錄「dir」並將其 CHMOD 設為 777,以便授予所有人讀取、寫入和執行權限,否則它將無法儲存...
JamesM
14 年前
不會破壞影像,但會在輸出中加入顯示內容。
這會產生一個具有隨機顏色的影像。如果您喜歡它,您可以使用它,因為您也擁有 RGB 結果。
<?php
header
("content-type:image/png");
$im = imagecreate(100, 100);
$a = sprintf('%04x',mt_rand(0, 65535));
$b = sprintf('%04x',mt_rand(0, 65535));
$c = sprintf('%04x',mt_rand(0, 65535));
$white = imagecolorallocate($im,$a,$b,$c);
imagepng($im);
imagedestroy($im);
echo
"\n\n\n$a-$b-$c";
?>
php at silisoftware dot com
22 年前
不要嘗試建立寬度和/或高度非常大的影像。首先,`$width` 乘以 `$height` (至少)是需要分配的記憶體位元組數。其次,如果任一參數超過 int 的範圍,Apache 會在分配任何記憶體之前崩潰。
別問我是怎麼知道的 ;)
scottlindh pwnd at hushmail dot com
17 年前
要在 UBUNTU 上安裝,請執行以下操作..

sudo apt-get install php5-gd

安裝套件後,我重新啟動了 Apache

sudo /etc/init.d/apache reload

開始愛上 Ubuntu 了...
tassader at xmail dot cz
21 年前
看來 imagecreate 使用 gd2 建立灰階影像
tore at kyberheimen dot com
22 年前
GD 升級問題
我以前使用 gd 1.6 的 imagecreate 來製作大照片的縮圖。然後,在 gd 2.0 上使用相同的腳本時,顏色全錯了。
使用 imagecreatetruecolor() 解決了這個問題!
kim at kimmccall dot org
23 年前
我是如何解決我的「未定義函式 imagecreate()」問題
我和許多人回報的相同問題一樣,大部分的 PHP 功能都正常,但 gd 函式卻無法使用。我安裝了 RedHat rpm php-4.0.1pl2。它 (phpinfo.php) 顯示已使用 '--with-gd=shared' 選項進行配置。在我的 /usr/lib 目錄中,我有 libgd.so.1.8.3 和 libgd.a。我決定改用靜態函式庫編譯,所以我下載了原始碼並使用所有相同的配置標誌進行建置,除了我使用 --with-gd=/usr。現在我的 gd 函式庫可以正常運作了!!!
cstevens at gencom dot us
20 年前
以下是我在 Gentoo 中解決「致命錯誤:呼叫未定義函式:imagecreate()」錯誤的方法

1) 在 /etc/make.conf 中新增 gdb 的 USE 旗標

USE="3dnow avi [您已有的其他旗標] gdb"

注意:以下是所有 USE 旗標的列表
http://www.gentoo.org/dyn/use-index.xml

2) 移除 mod_php

*注意*「重新安裝」可能需要一段時間,因為它可能需要編譯多個依賴項...請在非生產時間執行此操作,並備份資料,以避免停機

emerge -C mod_php

3) 安裝 mod_php

emerge -p mod_php
# 了解是否需要一段時間

4) 編輯 /etc/php/apach2-php4/php.ini
取消註解「extension=php_gd2.dll」這一行

5) 重新啟動 apache2

/etc/init.d/apache2 restart

希望這個方法有幫助!

--
Cooper Stevenson
GenCom
http://www.gencom.us
marc at gutt dot it
9 年前
基於 DHKold 的貢獻,我實現了 imagecreatefrombmp() 以支援所有 1、4、8、16、24 和 32 位元的點陣圖。最後,Fabien Ménager 將其完善地應用於 DOMPDF 專案。歡迎自由使用
https://code.google.com/p/dompdf/source/browse/trunk/dompdf/include/functions.inc.php?spec=svn504&r=504#551
foxlovr1 at cox dot net
20 年前
您可以設定它,以便撰寫可透過 URL 控制的文字。

像這樣...

<?php
header
("Content-type: image/png");
$im = @imagecreate(128, 16) or die("無法初始化新的 GD 影像串流");
$bc = imagecolorallocate($im, 0, 255, 255);
$tc = imagecolorallocate($im, 0, 0, 0);
imagestring($im, 1, 4, 4, $t, $tc);
imagepng($im);
imagedestroy($im);
?>

然後,當您使用影像時,請使用以下程式碼...

<img src="http://www.yourdomain.com/stuff/cool_image.php?t=Text">

這會建立一個背景為青色的圖片,並以黑色文字顯示「Text」。

如有任何意見或問題,請發送電子郵件至 foxlovr1@cox.net 或 aquafox90@yahoo.com。
removethisbeforebayet at removethistooenseirb dot fr
23 年前
請注意我遇到的問題。
使用 PHP 函式建立的 PNG 圖片似乎很難被舊版瀏覽器辨識,尤其是 - 嗯,主要是 - IE 4.0(瀏覽器會當機)。
我認為這可能是因為在 IE 4.0 發佈時,PNG 格式還很新,或者因為 JPEG 和 GIF 格式的廣泛使用而不常被使用……
因此,如果您打算為 IE 4.0 使用者瀏覽的網站動態建立圖片,請考慮這一點……
或許 JPEG 格式會更適合。
andrus at vnet dot ee
23 年前
顯示圖片後別忘了使用 ImageDestroy。我忘記了,我的網頁上有大約 15 張由 GD 產生的圖片,然後網路伺服器很快就掛了(伺服器是雙 Xeon 900MHz 和 4G RAM :[[ )。它掛掉是因為記憶體不足 :\
sjnorrie at hotmail dot com
21 年前
在 Windows 上。

當您遇到未定義的函式 image* 時,表示未啟用 GD 函式庫。請檢查 php.ini 檔案。確保 php_gd.dll 沒有被註解掉。重新啟動 Apache 應該就能讓 image 函式正常運作。
To Top