PHP Conference Japan 2024

imagepng

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

imagepng將 PNG 影像輸出到瀏覽器或檔案

描述

imagepng(
    GdImage $image,
    resource|string|null $file = null,
    int $quality = -1,
    int $filters = -1
): bool

從給定的 image 輸出或儲存 PNG 影像。

參數

image

一個 GdImage 物件,由其中一個影像建立函式傳回,例如 imagecreatetruecolor()

file

要將檔案儲存到的路徑或開啟的串流資源 (在此函式傳回後會自動關閉)。如果未設定或為 null,則會直接輸出原始影像串流。

注意:

如果未使用 qualityfilters 引數,則 null 無效。

quality

壓縮等級:從 0 (無壓縮) 到 9。預設值 (-1) 使用 zlib 壓縮預設值。如需更多資訊,請參閱 » zlib 手冊

filters

允許縮減 PNG 檔案大小。這是一個位元遮罩欄位,可以設定為 PNG_FILTER_* 常數的任何組合。PNG_NO_FILTERPNG_ALL_FILTERS 也可以分別用於停用或啟用所有篩選器。預設值 (-1) 會停用篩選。

注意

系統 libgd 會忽略 filters 參數。

傳回值

成功時傳回 true,失敗時傳回 false

注意

但是,如果 libgd 無法輸出影像,此函式會傳回 true

錯誤/例外

如果 quality 無效,則擲回 ValueError

變更記錄

版本 描述
8.4.0 如果 quality 無效,現在會擲回 ValueError
8.0.0 image 現在預期是 GdImage 執行個體;先前,預期是有效的 gd resource

範例

<?php
$im
= imagecreatefrompng("test.png");

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

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

參見

新增註解

使用者貢獻的註解 33 則註解

49
matteosistisette at gmail dot com
13 年前
壓縮參數的名稱「品質」相當具有誤導性,因為 png 壓縮始終是無損的。權衡取捨的是速度和檔案大小,它無法影響品質。

以下是我在 stackoverflow 上找到的內容;我還沒有檢查過,但如果它是正確的,則絕對應該包含在文件中

---
來自 php 原始碼 (gd.h)

/* 2.0.12:壓縮等級:0-9 或 -1,其中 0 是完全沒有壓縮,
* 1 是最快的,但會產生較大的檔案,9 提供最佳
* 壓縮 (最小的檔案),但需要很長時間來壓縮,以及
* -1 選擇編譯到 zlib 函式庫中的預設值。
*/
結論:根據 Zlib 手冊 (http://www.zlib.net/manual.html),預設壓縮等級設定為 6。
---

關於將 jpeg 的 0-99 品質範圍重新縮放為 png 的 0-9 範圍的建議,請注意,對於 jpeg,99 是最小壓縮 (最大品質),而對於 png,9 是最大壓縮 (品質不變)。
41
匿名
21 年前
「提示:如同任何將結果直接輸出到瀏覽器的內容一樣,您可以使用輸出控制函式 (https://php.dev.org.tw/manual/en/ref.outcontrol.php) 來擷取此函式的輸出,並將其儲存在字串中 (例如)。」

ob_start();
imagepng($image);
$image_data = ob_get_contents();
ob_end_clean();

現在您可以將 $image_data 儲存到資料庫,例如,而不是先將其寫入檔案,然後從中讀取資料。只是不要忘記使用 mysql_escape_string...
4
mail at stefanbechtold dot de
21 年前
對於所有喜歡讓使用者用圖片填寫其個人資料而不破壞固定設計的人來說,以下應該是處理這個問題的好方法。

此檔案從 $imagepath 開啟圖片,並將其傳回為有效的圖片,以嵌入:<img src="file.php?image=123.jpg[?maxX=200&maxY=150]"> (在 [] 中 = 可選)

但是此檔案的功能不僅如此。它還會將黑色邊框新增到小於最大尺寸的檔案,因此會在影像過高的位置新增左側和右側的邊框 :-)

如果需要版權聲明,此腳本也會對您有所幫助。您可以輸入各種文字到 $copyright。文字長度應與 $maxX 和 $maxY 成比例。

好吧,該腳本還有其他功能,請嘗試一下並玩得開心 :-)

再見

<?php

# 若未給定,則使用標準高度與寬度
if(!isset($maxX)) $maxX = 100;
if(!isset(
$maxY)) $maxY = 75;

# 顏色和文字值
$picBG = "0,0,0"; # RGB 值 !
$picFG = "104,104,104"; # RGB 值 !
$copyright = "stefan bechtold";
$font = 1;

# 最小與最大縮放
$minZoom = 1; # 相對於原始大小的百分比 (!=0)
$maxZoom = 200; # 相對於原始大小的百分比 (!=0)

# 路徑
$imgpath = "userimages/"; # 以 "/" 結尾 !
$nopicurl = "../images/nopic.jpg"; # 在 $imagepath 中開始 !!!
$nofileurl = "../images/nofile.jpg"; # 在 $imagepath 中開始 !!!

if(!isset($image) || empty($image))
$imageurl = $imgpath . $nopicurl;
elseif(!
file_exists($imgpath . trim($image)))
$imageurl = $imgpath . $nofileurl;
else
$imageurl = $imgpath . trim($image);

# 讀取圖片
$image = getImageSize($imageurl, $info); # $info,僅用於處理較早版本 php 的問題...
switch($image[2]) {
case
1:
# GIF 圖片
$timg = imageCreateFromGIF($imageurl);
break;
case
2:
# JPEG 圖片
$timg = imageCreateFromJPEG($imageurl);
break;
case
3:
# PNG 圖片
$timg = imageCreateFromPNG($imageurl);
break;
}

# 讀取圖片尺寸
$imgX = $image[0];
$imgY = $image[1];

# 計算縮放比例
$_X = $imgX/$maxX * 100;
$_Y = $imgY/$maxY * 100;

# 選擇正確的縮放比例,使圖片始終保持在給定的格式內
# 無論它是高於寬或反之
if((100-$_X) < (100-$_Y)) $_K = $_X;
else
$_K = $_Y;

# 縮放檢查原始大小
if($_K > 10000/$minZoom) $_K = 10000/$minZoom;
if(
$_K < 10000/$maxZoom) $_K = 10000/$maxZoom;

# 計算新的圖片尺寸
$newX = $imgX/$_K * 100;
$newY = $imgY/$_K * 100;

# 設定圖片的起始位置
# 始終置中
$posX = ($maxX-$newX) / 2;
$posY = ($maxY-$newY) / 2;

# 建立具有給定尺寸的新圖片
$imgh = imageCreateTrueColor($maxX, $maxY);

# 設定顏色
$cols = explode(",", $picBG);
$bgcol = imageColorallocate($imgh, trim($cols[0]), trim($cols[1]), trim($cols[2]));
$cols = explode(",", $picFG);
$fgcol = imageColorallocate($imgh, trim($cols[0]), trim($cols[1]), trim($cols[2]));

# 填充背景
imageFill($imgh, 0, 0, $bgcol);

# 建立圖片的小複本
imageCopyResampled($imgh, $timg, $posX, $posY, 0, 0, $newX, $newY, $image[0], $image[1]);

# 寫入版權聲明
imageStringUp($imgh, $font, $maxX-9, $maxY-3, $copyright, $fgcol);

# 輸出
switch($image[2]) {
case
1:
# GIF 圖片
header("Content-type: image/gif");
imageGIF($imgh);
case
2:
# JPEG 圖片
header("Content-type: image/jpeg");
imageJPEG($imgh);
case
3:
# PNG 圖片
header("Content-type: image/png");
imagePNG($imgh);
}

# 清理快取
imageDestroy($timg);
imageDestroy($imgh);

?>
13
luxian.m [at] gmail [dot] com
16 年前
如果您想開啟具有 alpha 混合的 png 圖片,您需要執行類似以下的操作

<?php
$file
= 'semitransparent.png'; // png 圖片的路徑
$img = imagecreatefrompng($file); // 開啟圖片
imagealphablending($img, true); // 開啟 alpha 混合
imagesavealpha($img, true); // 儲存 alpha 混合設定 (重要)
?>

我花了一整天的時間才找出 alpha 混合無法運作的原因。希望這對其他人也有幫助 :)
15
r.lomas at infonie.fr
14 年前
我剛剛在一個非常愚蠢的問題上浪費了約 4 個小時。我本地伺服器上的圖片不知何故損壞了,因此無法在瀏覽器中顯示。在四處尋找和測試許多次(包括在我的電腦上重新安裝 Apache 幾次)之後,我將問題追溯到一個包含的檔案。
問題不是空白字元,而是我其中一個包含檔案開頭的 UTF BOM 編碼字元...
所以要注意你的包含檔案!
請確保它們不是以 UTF 或其他方式以不帶 BOM 的 UTF 編碼。
希望這能節省某人的時間。
10
geompse at gmail dot com
12 年前
當使用變數作為檔案名稱時要小心。
當切換到 PHP5.4 時,$filename 的 PHP 行為會有所不同:PHP5.3 會將 $filename='' 的使用方式視為與 $filename=NULL 相同(例如,沒有警告)。
<?php
$im
= imagecreatetruecolor(10,10);
imagepng($im,'',9); # 警告:imagepng(): 檔案名稱不能為空
imagepng($im,NULL,9); # 如預期般運作
imagedestroy($im);
?>
2
johnbeech at mkv25.net
21 年前
PNG 檔案已經被壓縮過了。它們使用無損壓縮演算法。如果你使用高色彩圖像,壓縮的效果就只有這樣。對於低色彩圖像(16 或 256 色),壓縮效果會好得多。

在傳送到瀏覽器之前嘗試進一步壓縮圖像沒有意義。
10
mhorne69 at gmail dot com
14 年前
如果你根據 post 資料動態生成圖像,並且不想將其儲存到伺服器,那麼直接發送以顯示可能會導致問題,因為當使用者嘗試儲存它時,瀏覽器將會再次從伺服器請求它(導致任何 post 資料遺失,並可能導致 PNG 損毀)。

解決此問題最簡單的方法是強制使用內容處置標頭下載,例如

<?php
header
('Content-Disposition: Attachment;filename=image.png');
header('Content-type: image/png');
?>
5
Chris F
9 年前
我對品質、處理時間和產生的圖像大小之間的關係感到好奇,所以我建立了一個小型的基準測試來測試它(使用的圖像最初是 RGB_24bits_palette_R85.png,在維基百科上找到)。結果在底部。
<?php
$sizes
= ['32', '64', '128', '256', '512', '1024', '2048'];

foreach (
$sizes as $size) {
echo
"\n大小: {$size}x{$size}px:\n";

$image = imagecreatefrompng("images/test{$size}.png");
for (
$quality = 0; $quality < 10; $quality++) {
ob_start();

$start = microtime(true);
imagepng($image, null, $quality);
$elapsed = microtime(true) - $start;

$blob = ob_get_contents();
ob_end_clean();

$blobSize = strlen($blob);
echo
"品質:$quality,大小:$blobSize,經過時間:$elapsed\n";
}

imagedestroy($image);
}

// 結果(為了簡潔,省略了一些):

// 大小:32x32px:
// 品質:0,大小:3172,經過時間:0.00013399124145508
// 品質:1,大小:266,經過時間:9.4890594482422E-5
// 品質:2,大小:264,經過時間:7.7009201049805E-5
// 品質:3,大小:223,經過時間:7.4863433837891E-5
// 品質:4,大小:225,經過時間:8.5830688476562E-5
// 品質:5,大小:209,經過時間:8.5115432739258E-5
// 品質:6,大小:208,經過時間:9.608268737793E-5
// 品質:7,大小:205,經過時間:0.0001060962677002
// 品質:8,大小:186,經過時間:0.00015091896057129
// 品質:9,大小:181,經過時間:0.00022006034851074

// 大小:128x128px:
// 品質:0,大小:49425,經過時間:0.0010969638824463
// 品質:1,大小:976,經過時間:0.00091886520385742
// 品質:2,大小:938,經過時間:0.00088310241699219
// 品質:3,大小:925,經過時間:0.00087594985961914
// 品質:4,大小:608,經過時間:0.0009760856628418
// 品質:5,大小:607,經過時間:0.00098395347595215
// 品質:6,大小:601,經過時間:0.0010099411010742
// 品質:7,大小:602,經過時間:0.001086950302124
// 品質:8,大小:521,經過時間:0.001910924911499
// 品質:9,大小:491,經過時間:0.0029060840606689

// 大小:512x512px:
// 品質:0,大小:788279,經過時間:0.012928009033203
// 品質:1,大小:12467,經過時間:0.013065099716187
// 品質:2,大小:11885,經過時間:0.013008117675781
// 品質:3,大小:11190,經過時間:0.013030052185059
// 品質:4,大小:7311,經過時間:0.016619920730591
// 品質:5,大小:6994,經過時間:0.016351222991943
// 品質:6,大小:6475,經過時間:0.016234159469604
// 品質:7,大小:6432,經過時間:0.016525983810425
// 品質:8,大小:6094,經過時間:0.022937774658203
// 品質:9,大小:5649,經過時間:0.065664052963257

// 大小:2048x2048px:
// 品質:0,大小:12605375,經過時間:0.20983290672302
// 品質:1,大小:451735,經過時間:0.19678711891174
// 品質:2,大小:409375,經過時間:0.19415307044983
// 品質:3,大小:366404,經過時間:0.20460414886475
// 品質:4,大小:312538,經過時間:0.22785305976868
// 品質:5,大小:281671,經過時間:0.23320484161377
// 品質:6,大小:244248,經過時間:0.28935289382935
// 品質:7,大小:238310,經過時間:0.33481192588806
// 品質:8,大小:217038,經過時間:0.71698379516602
// 品質:9,大小:208881,經過時間:1.858146905899
?>
1
bgd1977 at hotmail dot com
22 年前
我在以下配置中遇到了區段錯誤和匯流排錯誤:FreeBSD4.4、Apache 1.3.26、PHP 4.2.2、GD-1.8.4、PDFlib 4.0.1。當呼叫 imagepng 函式時,Apache 程序崩潰了,但是當呼叫 imagejpg 函式或 imagecreatefrompng 時,它不會崩潰...

在浪費了一些時間(很多)之後,我嘗試重新編譯 gd、libpng、php、libjpeg 等,我找到了以下建議
http://bugs.php.net/bug.php?id=16841

所以問題不在於 png 函式庫,而是在於 PDFlib。即使所有執行緒都指向 png 問題...所以我只是升級到 PDFlib 4.0.3(沒有任何特殊的配置引數;--with-libpng 無法運作),重新編譯 PHP,現在一切都正常運作了(imagepng、pdf 建立等)。

希望這有幫助,
bogdan
2
php dot net at phor dot net
11 年前
如果你要直接輸出 PNG 以回應用戶端請求,請務必檢查你的 Web 伺服器配置。

某些用戶端可能會使用 image/* 的 <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html">accept 標頭</a>來請求你的圖像。Apache 和可能其他伺服器的預設配置,預設不會允許你的腳本在回應此請求時執行。

Apache 在 http://stackoverflow.com/q/19169337 中有特別討論,但其他伺服器也被記錄到有問題。

換句話說,當測試你的應用程式時,不要只使用 Web 瀏覽器,請考慮可能傳送不同標頭的手機瀏覽器和網路函式庫。
3
adrenalin at NOSPAM dot myrealbox dot com
18 年前
嘗試調整 PNG 256 色圖像的大小,並以正確的色盤將其儲存為 256 色?(如果你將 256 色圖像儲存在真彩色色盤中,則產生的圖像會很大)。
我花費了一些時間嘗試各種函式以獲得良好的 256 色 PNG 圖像,但是由於色盤的關係,產生的圖像品質很差。
但是,感謝 imagetruecolortopalette 函式頁面中來自 zmorris at zsculpt dot com 的評論,我弄清楚了如何獲得正確的圖像!

<?php
function resize_png($src,$dst,$dstw,$dsth) {
list(
$width, $height, $type, $attr) = getimagesize($src);
$im = imagecreatefrompng($src);
$tim = imagecreatetruecolor($dstw,$dsth);
imagecopyresampled($tim,$im,0,0,0,0,$dstw,$dsth,$width,$height);
$tim = ImageTrueColorToPalette2($tim,false,255);
imagepng($tim,$dst);
}
//zmorris at zsculpt dot com function, a bit completed
function ImageTrueColorToPalette2($image, $dither, $ncolors) {
$width = imagesx( $image );
$height = imagesy( $image );
$colors_handle = ImageCreateTrueColor( $width, $height );
ImageCopyMerge( $colors_handle, $image, 0, 0, 0, 0, $width, $height, 100 );
ImageTrueColorToPalette( $image, $dither, $ncolors );
ImageColorMatch( $colors_handle, $image );
ImageDestroy($colors_handle);
return
$image;
}
?>

祝你好運,
Namolovan Nicolae,摩爾多瓦
5
alex at gateway-productions dot com
17 年前
barts 下面的程式碼至少在 gd 2 中無法運作

只會回傳一個帶有 alpha 的空白影像,而不是調整大小後的來源影像

$im = ImageCreateFromPNG($sourcefile);
$im_dest = imagecreatetruecolor ($forcedwidth, $forcedheight);
imagealphablending($im_dest, false);
imagecopyresampled($im_dest, $im, 0, 0, 0, 0, $wm_width, $wm_height, $forcedwidth, $forcedheight);
imagesavealpha($im_dest, true);
imagepng($im_dest, $destfile);
imagedestroy($img_dest);

另外,你忘了 image destroy,而且你的文章中 imagepng 中有一個隨機變數未定義
2
wietse89 at gmail dot com
14 年前
當您允許多種輸出格式(jpg/png)但想要使用 1-100 的品質刻度(如 jpg)時,您必須格式化數字

<?php
$pngQuality
= ($quality - 100) / 11.111111;
$pngQuality = round(abs($pngQuality));
imagepng($resource, $path, $pngQuality);
?>
1
neburk0rk at gmail dot com
19 年前
這是我將 PNG 影像儲存在 MySQL 資料庫中的方式...您不能直接將 PNG 影像儲存在變數中,然後在資料庫中解析它,因為如果您嘗試將其定義為變數,它仍然只會輸出它...
在我的方法中,我使用三個函式
來「擷取」輸出並將其儲存在變數中:ob_start(啟動輸出緩衝)、ob_get_contents(擷取輸出)和 ob_end_clean(清除快取並結束輸出緩衝)

<?php
$imagefile
= "changethistogourimage.gif";

$image = imagecreatefromgif($imagefile);
ob_start();
imagepng($image);
$imagevariable = ob_get_contents();
ob_end_clean();

/*
HERE YOU CAN MESS WITH THE $imagevariable AS YOU LIKE
*/
?>
0
Messerli at messerli dot net
1 年前
// 將影像作為 Base64 資料直接傳送到瀏覽器。
// 伺服器上沒有檔案!沒有駭客問題。

ob_start();
imagepng($img);
$ImageData=ob_get_contents();
ob_end_clean();
echo '<img src="data:image/jpg;base64,'.base64_encode($ImageData).'">';
0
klaus at hax dot at
7 年前
顯然 php 從 5.5 到 5.6 有所變更。

我過去常呼叫 ImagePng($image, '');
顯然這在 5.6 中不再有效,它會回傳:imagepng():檔名不能為空

ImagePng($image, NULL);

似乎可以正常運作。
0
Zane, MegaLab.it
13 年前
我的指令碼無法完成:致命錯誤:允許的記憶體大小 XX 位元組已耗盡(嘗試配置 XX+n 位元組)。

我發現 PHP 以未壓縮格式處理影像:我的輸入影像為 8768x4282@32 位元 => 每次單一記憶體複本約 150 MB。

作為一種解決方案,您可以檢查尺寸並拒絕任何過大的影像,或者,如我所做,在頁面開始時使用 ini_set('memory_limit','1024M');(如果您的伺服器有足夠的內建記憶體)。
0
codam
13 年前
僅建立填滿透明色彩的透明影像

我花了一些時間才弄清楚這個

<?php
// 設定影像
$img = imagecreatetruecolor(100,100);
imagesavealpha($img, true);

// 用透明色彩填滿影像
$color = imagecolorallocatealpha($img,0x00,0x00,0x00,127);
imagefill($img, 0, 0, $color);

// 將影像儲存到 file.png
imagepng($img, "file.png");

// 銷毀影像
imagedestroy($img);
?>
0
thalis kalfigopoulos
15 年前
我發現以下關於 WRT 工作階段和影像建立的內容。

在 main.php 中
<?php
(...工作階段進行中...)
$_SESSION['text']='一些文字...';
$imgSrc='http://foo.com/createImage.php?sid='.session_id();
echo(
'<img src="'.$imgSrc.'"/>');
unset(
$_SESSION['text']);
...
?>

在 createImage.php 中
<?php
header
('image/png');
session_id($_REQUEST['sid']);
session_start();
$img=imagecreatetruecolor(200, 30);
$text_color=imagecolorallocate($img, 200, 200, 200);
imagestring($img, 5, 5, 5, $_SESSION['text'], $text_color);
imagepng($img);
imagedestroy($img);
?>

問題:main.php 的執行在 createImage.php 將文字寫入圖片之前結束,因此 unset($_SESSION['text']) 會銷毀文字,最終得到空白圖片。
解決方案:將 unset() 的呼叫移至 createImage.php 的最後一個語句。
0
eetu11 at suomi24 dot fi
16 年前
<?php

// 突出顯示的聯盟的 aid
$marked_aid = 2403;

// 偏好設定
$mysqlhost = 'localhost';
$mysqluser = 'user';
$mysqlpass = 'password';
$mysqldb = 'database';

// 建立資料庫連線並選擇資料庫
$db = @mysql_connect($mysqlhost, $mysqluser, $mysqlpass) OR die('無法連線到資料庫伺服器!');
$db_select = @mysql_select_db($mysqldb) OR die('無法選擇資料庫!');

// 建立圖片:地圖範圍從 -400 到 400
// -> 總和為 2*400+1 (+1 是因為中心有 0)
$image = imagecreate(801, 801);

// 選擇背景、普通村莊和突出顯示的聯盟的顏色
$color_background = imagecolorallocate($image, 255, 255, 255);
$color_normal = imagecolorallocate($image, 200, 200, 200);
$color_marked = imagecolorallocate($image, 255, 0, 0);

// 使用選擇的顏色填充圖片背景
imagefill($image, 0, 0, $color_background);

// 從資料庫中選擇所有村莊,並依 ID 升冪排序
// (欄位由左上到右下編號)
$query = 'SELECT x, y, aid FROM x_world ORDER BY id ASC';
$result = @mysql_query($query) OR die('無法從 x_world 表格中選擇村莊!');

// 檢查是否有任何村莊
if (mysql_num_rows($result)) {

// 選擇第一個村莊
$row = @mysql_fetch_assoc($result);

// 這些變數儲存我們目前正在繪製的位置
$x_pointer = 0;
$y_pointer = 0;

// Y 座標的外層迴圈
for($y=400; $y >= -400; $y--) {

// X 座標的內層迴圈
for ($x=-400; $x <= 400; $x++) {

// 一旦我們到達與從資料庫選取的目前記錄相符的座標:
if ($row['x'] == $x AND $row['y'] == $y) {

// 根據 aid 選擇村莊顏色
if ($row['aid'] == $marked_aid) {
$color = $color_marked;
} else {
$color = $color_normal;
}

// 使用選擇的顏色繪製村莊
imagefilledrectangle($image, $x_pointer, $y_pointer, ($x_pointer + 1), ($y_pointer + 1), $color);

// 選擇下一筆記錄
$row = @mysql_fetch_assoc($result);
}

// 增加 X 座標的指標
$x_pointer++;
}

// 增加 Y 座標的指標
$y_pointer++;

// 我們到達了一行的末端,必須將 X 指標再次設定為 0
$x_pointer = 0;
}
}

// 選擇所選檔案類型的 HTTP 標頭
header("Content-Type: image/png");

// 產生圖片並列印
imagepng($image);

?>
0
Jeff Sauro
17 年前
我的網頁伺服器執行 5.14 版本時不喜歡使用 imagepng() 產生的標頭。它在我的本機測試伺服器和另一個主機的 4.x 版本上運作良好。

產生的圖片會顯示在瀏覽器(IE、Firefox)中,但儲存到檔案或插入 RTF 檔案時,圖片會損毀。經過測試,當嘗試按右鍵另存新檔時,無法辨識圖片格式。

唯一可行的解決方案似乎是新增額外的參數。

所以不要只寫
imagepng($image); // 不起作用 -- 損毀的圖片

這樣就能運作
imagepng($image,NULL,0,NULL);

儲存到磁碟時,這樣就能運作
imagepng($image,$file_location,0,NULL);

Jeff
0
pm at dontspamme dot pietmarcus dot com
20 年前
回覆:cbrasho at yahoo dot com

如果您使用 Apache 作為網頁伺服器,您可以執行以下操作

您可以在您的網頁空間中設定一個 'img' 目錄。
在這個目錄中,會有兩個檔案:一個 .htaccess 檔案和一個 img.php 檔案
.htaccess 檔案包含以下程式碼
ErrorDocument 404 /img/img.php

img.php 檔案如下所示

<?php
$file
= $_SERVER['REDIRECT_URL'];

$result = mysql_query('select img_blob from images where filename=\\'' . $file . '\\');
list($blob) = mysql_fetch_row($result);

header('
HTTP/1.0 200 Ok');
header("Content-type: image/jpeg");

print $blob; # 或任何可行的,我不是用這個
?>

如果您使用類似 http://test.com/img/image1.jpeg 的網址來顯示圖片,而該圖片不存在,通常您會收到 404 頁面。在這種情況下,404 頁面是由 img.php 處理,它會顯示所需的圖片...
0
ruelle at xtof dot com
22 年前
與其對任何 '/dir/pic.png' 使用 chmod 777,您應該
- 測試目錄是否可寫入(is_writable 函數)
- 使用 chmod 700(更安全,因為只允許網頁伺服器 ID 存取)

在任何情況下,您都應該編寫一個 (crontab) 腳本來變更所建立之任何圖片的擁有者 ID。
-1
boukeversteegh at gmail dot com
13 年前
如果您關心速度,您可能已經將產生的圖片快取到檔案中。在這種情況下,請勿使用 "createimagefrompng" 和 "imagepng" 來輸出圖片。請改用 fpassthru。它快數百倍。

<?php
header
("Content-Type: image/png");

# 如果圖片快取檔案不存在,則產生快取檔案
if( !file_exists($cachefile) ) {
$im = generateimage(); # 某些程式碼會產生圖片資源
imagepng($im, $cachefile); # 將圖片儲存到快取檔案

# 不要像這樣輸出:
/* imagepng($im);*/

imagedestroy($im);
}

$fp = fopen($cachefile, 'rb'); # 直接從快取檔案串流輸出圖片
fpassthru($fp);
exit;
?>

我用 5120x5120 (1.2Mb) 的圖片測試過,該圖片已快取至硬碟。使用 imagepng,傳輸時間為 12 秒。使用 fpassthru,僅需 32 毫秒!
-1
vicrry at yahoo dot com
16 年前
@ phpman at texmedia dot de

PNG 的壓縮範圍為 0-9,我認為如果您指定的壓縮級別高於 9,它將被完全「壓縮」,或者換句話說是被抑制。

壓縮級別最初用於 JPEG,範圍為 0 - 100,我認為如果您在傳遞給 imagepng() 之前將其除以十,它將可以正常工作。 ;)
-1
anonymous
14 年前
如果您需要多次呼叫 imagepng() (例如,當您想要將其發送到瀏覽器,同時也發送到磁碟快取時),請先將您的圖片寫入檔案,然後再對其呼叫 readfile()。

當將圖片發送到瀏覽器時,PHP 內部會使用暫存檔,因此您呼叫 imagepng() 兩次不會獲得任何好處。
-2
vladson at pc-labs dot info
19 年前
為了發送 'Content-Length' 標頭 (就像靜態圖片的情況一樣),我使用像這樣的「輸出處理器」...
<?php
// 輸出處理器
function output_handler($img) {
header('Content-type: image/png');
header('Content-Length: ' . strlen($img));
return
$img;
}

// 圖片輸出
ob_start("output_handler");
imagepng($im);
ob_end_flush();
?>
-2
php at no dot spam dot prosa dot net
19 年前
您可以使用函數 imagecreatefrompng

(我假設您已經知道如何從 URL 取得文字。)

剩下的唯一事情就是使用正確的顏色將該文字放置在圖片上。

<?php

$im
= @imagecreatefrompng($imgname);

$text_color = imagecolorallocate ($im, $Red,$Green,$Blue);

imagestring ($im, 3, 5, 15, $SomeTextFromURL, $text_color);

?>

此致,
Peter Berkhout.
-2
matt at mattbostock dot com
15 年前
為了在 IE6 中優雅地降級 24 位元 PNG 的背景,PNG 檔案需要一個 bKGD 區塊

<?php
// 將 BKGD 區塊插入 PNG 檔案中,以便在 IE6 中優雅地降級圖片
$bgColor = array(250, 250, 250);
$pngData = bin2hex(file_get_contents($filename));

$idatMarker = '200049444154';
$bkgdMarker = '624b4744';

$bkgdChunk = '0006' . $bkgdMarker;
foreach (
$bgColor as $bit)
{
$bkgdChunkData .= '00' . dechex($bit);
}
$bkgdChunk .= $bkgdChunkData;
$bkgdChunk .= dechex(crc32(pack('H*', $bkgdMarker . $bkgdChunkData))) . '0000';

$parsed = explode($idatMarker, $pngData, 2); // 按第一個 'IDAT' 區塊分割檔案
$pngData = pack('H*', $parsed[0] . $bkgdChunk . $idatMarker . $parsed[1]);
file_put_contents($cachedFilename, $pngData);
?>
-2
cbrasho at yahoo dot com
20 年前
將您的圖片儲存在資料庫中聽起來很棒,但會帶來很多麻煩。
將圖片儲存在資料庫中,您將有一個 show.php 腳本,它會出現在 <img> 標籤中:<img src='show.php?img_id=$some_id'>
但是如果您想要關閉 REGISTER GLOBALS,您就會遇到麻煩,並且沒有辦法 (至少據我所知) 解決此問題,只能將資料庫中的圖片放入檔案中,並將對應的檔案名稱放入 <img> 標籤中。但這會帶來另一個問題:同時存取頁面。因此,您必須找到一種方法,為每個同時存取頁面的圖片檔案提供唯一的名稱。解決方案可能是使用會話。這就是為什麼您最終會為一個非常簡單的問題編寫一個非常複雜的 PHP 腳本的原因。因此,基本概念是「除非您確切知道自己在做什麼,否則不要將您的圖片儲存在 blob 中」。
-5
phpman at texmedia dot de
17 年前
當將 PHP 版本從 4 變更為 5 時,我發現 PHP5 處理 imagepng() 比 PHP4 更嚴格。我曾使用

imagepng($image,'',90);

來降低圖片品質,而無需將圖片儲存為檔案。品質參數完全不受支援,我之前使用 imagejpg,並簡單地將函數變更為 imagepng 而沒有考慮現有的參數。這在 PHP4 中並不重要,也沒有錯誤。但在 PHP5 中,圖片將不再顯示。因此您必須移除它才能擁有標準

imagepng($image);
-5
dws at mrao dot cam dot ac dot uk
19 年前
大概是成功時返回 true,失敗時返回 false,儘管文件實際上並沒有這樣說。
To Top