PHP Conference Japan 2024

imagejpeg

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

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

描述

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

imagejpeg() 從給定的 image 建立一個 JPEG 檔案。

參數

image

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

file

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

quality

quality 是可選的,範圍從 0 (最差品質,檔案較小) 到 100 (最佳品質,檔案較大)。預設值 (-1) 使用預設的 IJG 品質值 (約為 75)。

回傳值

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

注意

然而,如果 libgd 無法輸出影像,此函式仍會回傳 true

錯誤/例外

如果 quality 無效,則擲回 ValueError

變更日誌

版本 描述
8.4.0 如果 quality 無效,現在會擲回 ValueError
8.0.0 image 現在需要 GdImage 實例;先前,需要有效的 gd resource

範例

範例 #1 將 JPEG 影像輸出到瀏覽器

<?php
// 建立一個空白影像並新增一些文字
$im = imagecreatetruecolor(120, 20);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5, 'A Simple Text String', $text_color);

// 設定內容類型標頭 - 在此例中為 image/jpeg
header('Content-Type: image/jpeg');

// 輸出影像
imagejpeg($im);

// 釋放記憶體
imagedestroy($im);
?>

上面的範例會輸出類似以下的內容

Output of example : Outputting a JPEG image

範例 #2 將 JPEG 影像儲存到檔案

<?php
// 建立一個空白影像並新增一些文字
$im = imagecreatetruecolor(120, 20);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5, 'A Simple Text String', $text_color);

// 將影像儲存為 'simpletext.jpg'
imagejpeg($im, 'simpletext.jpg');

// 釋放記憶體
imagedestroy($im);
?>

範例 #3 以 75% 品質將影像輸出到瀏覽器

<?php
// 建立一個空白影像並新增一些文字
$im = imagecreatetruecolor(120, 20);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5, 'A Simple Text String', $text_color);

// 設定內容類型標頭 - 在此例中為 image/jpeg
header('Content-Type: image/jpeg');

// 使用 NULL 跳過 file 參數,然後將品質設定為 75%
imagejpeg($im, NULL, 75);

// 釋放記憶體
imagedestroy($im);
?>

註解

注意:

如果您想要輸出漸進式 JPEG,您需要使用 imageinterlace() 開啟交錯功能。

參見

新增註解

使用者貢獻的註解 34 個註解

44
Ray.Paseur 有時使用 Gmail
14 年前
如果給定了字串 $filename 並且它存在,它將被覆蓋。
36
francesco@essensys
15 年前
我在網路上找不到任何類似的範例,所以我把各部分組合在一起...希望這能為其他人節省時間!

這是一個完整的解決方案,可以從檔案系統讀取任何影像(gif、jpg、png),將其縮放到最大寬度/高度,並將縮放後的影像以 BLOB 欄位儲存,並保留原始影像類型。相當棘手..

<?php

function scaleImageFileToBlob($file) {

$source_pic = $file;
$max_width = 200;
$max_height = 200;

list(
$width, $height, $image_type) = getimagesize($file);

switch (
$image_type)
{
case
1: $src = imagecreatefromgif($file); break;
case
2: $src = imagecreatefromjpeg($file); break;
case
3: $src = imagecreatefrompng($file); break;
default: return
''; break;
}

$x_ratio = $max_width / $width;
$y_ratio = $max_height / $height;

if( (
$width <= $max_width) && ($height <= $max_height) ){
$tn_width = $width;
$tn_height = $height;
}elseif ((
$x_ratio * $height) < $max_height){
$tn_height = ceil($x_ratio * $height);
$tn_width = $max_width;
}else{
$tn_width = ceil($y_ratio * $width);
$tn_height = $max_height;
}

$tmp = imagecreatetruecolor($tn_width,$tn_height);

/* 檢查此影像是否為 PNG 或 GIF,然後設定是否透明 */
if(($image_type == 1) OR ($image_type==3))
{
imagealphablending($tmp, false);
imagesavealpha($tmp,true);
$transparent = imagecolorallocatealpha($tmp, 255, 255, 255, 127);
imagefilledrectangle($tmp, 0, 0, $tn_width, $tn_height, $transparent);
}
imagecopyresampled($tmp,$src,0,0,0,0,$tn_width, $tn_height,$width,$height);

/*
* imageXXX() 只有兩種選項,儲存為檔案,或傳送到瀏覽器。
* 它沒有提供您操作最終 GIF/JPG/PNG 檔案串流的機會
* 所以我開始輸出緩衝,使用 imageXXX() 將資料串流輸出到瀏覽器,
* 取得串流的內容,並使用 clean 來靜默丟棄緩衝的內容。
*/
ob_start();

switch (
$image_type)
{
case
1: imagegif($tmp); break;
case
2: imagejpeg($tmp, NULL, 100); break; // 最佳品質
case 3: imagepng($tmp, NULL, 0); break; // 無壓縮
default: echo ''; break;
}

$final_image = ob_get_contents();

ob_end_clean();

return
$final_image;
}

?>

因此,假設您有一個表單,使用者可以在其中上傳影像,而您必須將其縮放並儲存到資料庫中。

<?php

[..] // 使用者已點擊「提交」按鈕..

// 檢查使用者是否輸入了影像
if ($_FILES['imagefile']['name'] != '') {
$image = scaleImageFileToBlob($_FILES['imagefile']['tmp_name']);

if (
$image == '') {
echo
'不支援的影像類型';
} else {
$image_type = $_FILES['imagefile']['type'];
$image = addslashes($image);

$query = "UPDATE yourtable SET image_type='$image_type', image='$image' WHERE ...";
$result = mysql_query($query);
if (
$result) {
echo
'影像已縮放並上傳';
} else {
echo
'執行查詢時發生錯誤';
}
}
}

?>
31
Bruno de Lima - bruno at tthedreamstone dot net
11 年前
[[編輯註解:已移除 header() 呼叫,因為在輸出內嵌影像資料時不需要它]]
一行程式碼,在盲目搜尋 3 小時後解決了我!

在這裡

... ob_start();
imagejpeg( $img, NULL, 100 );
imagedestroy( $img );
$i = ob_get_clean();

echo "<img src='data:image/jpeg;base64," . base64_encode( $i )."'>"; //救星程式碼!
5
Uplink
1 年前
如果您使用官方 Docker 映像並透過 `docker-php-ext-install gd` 啟用 gd,預設情況下您不會獲得 JPEG 支援。

如果您是這樣,並且收到「呼叫未定義函數 imagejpeg()」的訊息,則需要在 docker-php-ext-install 之前執行此操作

docker-php-ext-configure gd --with-jpeg

您還需要安裝 libjpeg-dev 才能使其正常運作。
7
your [dot] sheepy [at] gmail [dot] com
18 年前
關於 Carl Gieringer 的評論,可以讓 PHP 檔案使用 utf-8。只需確保編輯器不要輸出 BOM,這在 utf-8 中是不必要的。

除了來自 Microsoft 的任何編輯器之外,大多數支援 utf 的程式設計師編輯器都允許您關閉 BOM。
3
stefan at colulus dot com
16 年前
我寫了一個腳本,允許將字母數字資料傳輸到影像上。HTML 功能是 img src,php 功能是 imagettftext。這段簡單的程式碼會在影像上從 1 遞增到 3。

程式碼

<?php
//ImageCall.php -- 此腳本將呼叫一個腳本來產生影像。
for($next = 1;$next < 4; $next++){
print
"影像 $next:<br>";
print
"<img src = 'Image.php?\$text=$next'>";
print
"<br><br>";
}
?>

<?php
//Image.php -- 這個腳本會建立一個正方形圖片,並在上面放置文字。

// 圖片大小和顏色
$im = ImageCreate(77,77);
$color1 = ImageColorAllocate($im,0x66,0xCC,0x00);
$color2 = ImageColorAllocate($im,0x33,0x66,0x00);
$color3 = ImageColorAllocate($im,0x00,0x99,0x00);
$color4 = ImageColorAllocate($im,0x3D,0x3D,0x3D);

// 圖片建立
ImageFilledRectangle($im,1,1,76,76,$color1);
ImageFilledpolygon($im, array (76,1,1,76,76,76),3,$color2);
ImageFilledRectangle($im,5,5,72,72,$color3);

// 判斷圖片的數值中心點
$size = ImageTTFBBox(45,0,'impact',$_GET['$text']);
$X = (77 - (abs($size[2]- $size[0])))/2;
$Y = ((77 - (abs($size[5] - $size[3])))/2 + (abs($size[5] - $size[3])));

//在圖片上放置數值資訊
ImageTTFText($im,45,0,($X-1),$Y,$color4,'impact',$_GET['$text']);

//將完成的圖片回傳給呼叫的腳本
Header('Content-Type: image/png');
Imagejpeg($im);

?>
1
Bram Van Dam
19 年前
如果你想將 jpg 資料擷取到變數中,而不是輸出或儲存到檔案中(也許是為了將其放入資料庫),你可能需要考慮使用輸出緩衝。 類似這樣的方式應該可行:

<?php
ob_start
(); // 開始新的輸出緩衝區
imagejpeg( $newimage, NULL, 100 );
$ImageData = ob_get_contents();
ob_end_clean; // 停止此輸出緩衝區
?>
1
viciousVelo
15 年前
對於那些收到「權限不足」或「無法存取」訊息的人:這看起來像是你對這個資料夾的寫入權限有問題。無論你使用 Windows 或 Linux 伺服器,請確保正確的使用者有權限寫入正確的資料夾。
1
Darren Kulp ( kulp at thekulp dot com )
18 年前
關於 chris.calo 的程式碼

// 以下程式碼區塊會擷取來源檔案。它假設檔案名稱的副檔名與檔案的格式相符。
if ( strpos($source_file,".gif") ) { $img_source = imagecreatefromgif($source_file); }
if ( (strpos($source_file,".jpg")) || (strpos($source_file,".jpeg")) )
... 等等。

它假設的不只這些,更確切地說,它假設檔案名稱的字串中「任何位置」都沒有包含 '.gif'、'.jpg'、'.jpeg'、'.bmp' 或 '.png'。一些具有特殊檔案名稱的有效檔案可能會破壞這一點;例如,一個名為 "used.to.be.a.png.file.gif" 的檔案會導致這個腳本嘗試將該檔案載入為 PNG。顯然這是一個罕見的案例,但這個問題可以透過使用 "else if"(使用較少的 CPU 時間)或檢查副檔名是否緊靠字串結尾或兩者兼具來輕鬆避免。

也就是說,如果 PHP 沒有用不同的函數來處理不同圖片格式的相同事情,那麼整個業務就可以避免了。真是糟糕。
1
Elliott Brueggeman
17 年前
我針對建立 jpeg 時 imagejpeg() 函式的圖片品質參數做了一個實驗。我發現考慮到檔案大小的最佳圖片品質是 80 - 非常接近預設值 75。

任何高於 80 的值都會導致檔案大小不必要地增加,而圖片品質並不會大幅提升。

結果和範例圖片:http://www.ebrueggeman.com/article_php_image_optimization.php
1
dklein at gmx dot de
22 年前
看起來使用腳本中的 imageJPEG() 函式時,JPEG 檔案中任何指定的解析度設定都會遺失。
我有一個高解析度的 JPEG,我使用 imagestringup() 在其中新增了文字,這樣我的客戶就可以將電子郵件中的 JPEG 列印成填寫好的表單,但從 Photoshop 列印這兩個圖形顯示,任何建立的 JPEG 都會被降取樣到 72 dpi,同時會保留寬度和高度。
(72 dpi 是標準的網頁解析度)
沒什麼好奇怪的,但如果你讀到這個,也許就不需要再抓頭了 :)
0
flying man
5 年前
零位元組檔案結果 - 原因如下!

請牢記此函式的注意事項。如果 gdlib 輸出失敗,它仍然會回傳 true!我個人認為這是一個錯誤。

如果你的圖片超過其未公開的最大尺寸 65500 像素,GD 會輸出失敗。

你會得到一個零位元組的檔案。
0
tomas at dundacek dot cz
15 年前
當我嘗試上傳並調整圖片大小時,啟用了 safe_mode,我遇到了權限被拒絕的問題。這導致我無法建立我想要重新取樣圖片的新檔案,無論是使用 imagejpeg() 還是先使用 touch() 再使用 imagejpeg() 都不行。

這是我的解決方案,我沒有測試,但這是有可能的,它會佔用一些記憶體

<?php
function resize($image, $target_file) {
// $image 是上傳的圖片
list($width, $height) = getimagesize($image['tmp_name']);

//設定圖片的新尺寸
$ratio = $width/$height;
$new_height = 500;
$new_width = $new_height * $ratio;

//將檔案移動到新的位置
move_uploaded_file($image['tmp_name'], $target_file);

// 重新取樣圖片
$new_image = imagecreatetruecolor($new_width, $new_height);
$old_image = imagecreatefromjpeg($target_file);
imagecopyresampled($new_image,$old_image,0,0,0,0,$new_width, $new_height, $width, $height);

//輸出
imagejpeg($new_image, $target_file, 100);
}

?>

如你所見,此函式會將上傳的檔案移動到你想要儲存重新取樣圖片的位置(move_uploaded_file 不受 safe_mode 限制),然後你就可以重新取樣圖片,因為它已經透過移動建立好了。

注意:你想要儲存檔案的目錄必須將權限設定為 0777。
0
soapergem at gmail dot com
16 年前
我來到這裡尋找類似 getJPEGresolution 函式的東西,但注意到上一篇文章中指出的缺點。因此,在參考網路上其他程式碼範例之後,我組裝了以下函式,這個函式應該總是能正確回傳正確的值。(但請記住,你仍然需要在你的 PHP 實例中安裝 EXIF 擴充功能才能使其運作!)

<?php

function jpeg_dpi($filename)
{
if (
exif_imagetype($filename) != IMAGETYPE_JPEG ) {
return
false;
} else {
$exif = exif_read_data($filename, 'IFD0');
}

$x = $y = 0;
if ( isset(
$exif['XResolution']) && isset($exif['YResolution']) ) {
$x = intval(preg_replace('@^(\\d+)/(\\d+)$@e', '$1/$2', $exif['XResolution']));
$y = intval(preg_replace('@^(\\d+)/(\\d+)$@e', '$1/$2', $exif['YResolution']));
}

if ( !
$x && !$y && $fp = fopen($filename, 'r') ) {
$string = fread($fp, 20);
fclose($fp);

$data = bin2hex(substr($string, 14, 4));
$x = hexdec(substr($data, 0, 4));
$y = hexdec(substr($data, 4, 4));
}

if (
$x || $y ) {
return array(
$x, $y);
}

return
false;
}

?>

此函式會回傳一個包含 x 解析度與 y 解析度的陣列,如果無法判斷則回傳 FALSE。
0
ahows at noggin dot com dot au
16 年前
關於下方的程式碼,它只會抓取 JFIF 模式中 DPI 資訊的最後一個位元組。我一直在想為什麼我的 300-DPI 檔案會被回報為 44。當然,300 - 256 = 44。
0
lorezyra (at) lorezyra (dot) com
16 年前
對於那些想要在不使用 GD 或 ImageMagic 的情況下抓取 JPEG 影像解析度的人... 我寫了這個簡單的函式。

可惜 GD 沒有這麼簡單的函式供我們使用...

<?php
function getJPEGresolution($filename){
$outRez=array();
// 讀取檔案
ob_start(); // 開啟新的輸出緩衝區
$image = file_get_contents($filename);

// 從 JPG 標頭抓取 DPI 資訊
$outRez["xDPI"] = ord($image[15]);
$outRez["yDPI"] = ord($image[17]);
ob_end_clean(); // 停止此輸出緩衝區

//xDPI 和 yDPI 的值應該相等... 但我們還是輸出兩者...
return($outRez);
}
// 結束函式 getJPEGresolution
?>
0
Anonymous
16 年前
這裡有一個函式可以調整影像大小並維持長寬比。它會調整 jpeg、gif 或 png 的大小,並且可以輕鬆修改以加入 bmp。name 欄位是檔案的目的地,但不包含副檔名

<?php
//name= 檔案名稱但不含類型
function createImage($uploadedfile,$newWidth,$name)
{
// 擷取上傳影像的原始大小
if(!$info=getimagesize($uploadedfile))
return
false;

switch (
$info['mime'])
{
case
'image/jpeg':
$src = imagecreatefromjpeg($uploadedfile);
break;
case
'image/gif':
$src = imagecreatefromgif($uploadedfile);
break;
case
'image/png':
$src = imagecreatefrompng($uploadedfile);
break;
default:
return
false;
}

// 變更檔案名稱以加入檔案類型
$mime=split("image/",$info['mime']);
$filename=$name.".".$mime[1];

$size = getimagesize($uploadedfile);
$newHeight=aspect_ratio($size[0],$newWidth,$size[1]);

$tmp=imagecreatetruecolor($newWidth,$newHeight);

// 這行實際上執行影像大小調整,從原始影像複製到 $tmp 影像
imagecopyresampled($tmp,$src,0,0,0,0,$newWidth,$newHeight,$info[0], $info[1]);

switch (
$info['mime'])
{
case
'image/jpeg':
imagejpeg($tmp,$filename,100); // 100 是品質設定,值範圍為 0-100。
break;
case
'image/gif':
imagegif($tmp,$filename,100); // 100 是品質設定,值範圍為 0-100。
break;
case
'image/png':
imagepng($tmp,$filename); // 100 是品質設定,值範圍為 0-100。
break;
}

imagedestroy($src);
imagedestroy($tmp); // 注意:當請求完成時,PHP 會清除它建立的暫存檔。
return true;
}

if(!
createImage($uploadedfile,100, "uploaded_images/imgname"))
{
echo
"error";
}
?>
0
webmaster at jongliertreff dot de
18 年前
這是另一個即時縮圖建立腳本。
當我在我的頁面上編寫圖片檢視器的腳本時,我所有的圖片都只有完整大小和品質,因為我希望訪客可以下載這些圖片。
但是由於超過 4 MP 的影像大小對於網站來說太大了,所以我即時建立縮圖和較小的圖片。但我發現,這個腳本需要太多 RAM,尤其是在縮圖概覽中,當我同時要即時建立超過 50 個縮圖時。

所以我修改了我的影像建立器和檢視器,讓它們儲存建立的影像。因此,只有第一個訪客需要等待(通常是我在控制上傳和更新),所有其他訪客都會取得儲存的影像,這樣會快得多。

建立不同的資料夾。我有一個名為 'imagesdb' 的主要資料夾,以及三個子資料夾 full(完整品質影像)、show(用於圖片檢視器的影像)和 thumb(用於概覽中的縮圖)。

例如將腳本儲存為 image.php,並像這樣連結它

<?PHP
$image_name
= "foo.jpg";
$style = "show";
// 我已取得資料夾名稱。這樣比較容易。對於縮圖,請將 "show" 替換為 "thumb"。
$image_name = "imagesdb/$style/$image_name";
if(!
file_exists($image_name))
$image_name = "image.php?image_name=$image_name&style=$style";
// 僅在檔案不存在時,呼叫即時建立檔案
?>

現在是主要腳本,儲存在 image.php 檔案中

<?PHP

$image_name
= $_GET['image_name'];
$style = $_GET['style'];

// 現在設定不同樣式的最大尺寸。
// 你可以設定額外的樣式,但請記得
// 建立對應的子資料夾。

switch($style) {
case
"show":
$max_size = 800;
break;
case
"thumb":
$max_size = 125;
}

$dest_file = "imagesdb/$style/$image_name";
// 設定輸出檔案
$image_file = "imagesdb/full/$image_name";
// 設定來源檔案
$size = getimagesize($image_file);
// 取得原始尺寸

if($size[0] > $size[1]) {
$divisor = $size[0] / $max_size;
}
else {
$divisor = $size[1] / $max_size;
}
// 為了取得相同尺寸的圖片,這在圖片檢視器中
// 通常是需要的,請檢查哪個比較大:
// 寬度或高度

$new_width = $size[0] / $divisor;
$new_height = $size[1] / $divisor;
// 設定新尺寸

settype($new_width, 'integer');
settype($new_height, 'integer');
// 尺寸應為整數

$image_big = imagecreatefromjpeg($image_file);
// 載入原始圖片
$image_small = imagecreatetruecolor($new_width, $new_height);
// 建立新圖片
imagecopyresampled($image_small, $image_big, 0,0, 0,0, $new_width,$new_height, $size[0],$size[1]);
// imageresampled 將產生比 imageresized 高得多的品質
imagedestroy($image_big);
// 原始資料不再使用

header("Content-type: image/jpeg");

if(
$style=="show" || $style=="thumb") {
if(!
file_exists($dest_file))
imagejpeg($image_small, $dest_file, 100);
}
// 如果你設定了額外的尺寸,也請將它們放入
// if 參數中。
// 如果有人直接在瀏覽器中呼叫 image.php
// 使用已經存在的圖片名稱,它們將不會被覆寫

imagejpeg($image_small, '', 100);
imagedestroy($image_small);
// 最後將圖片傳送到瀏覽器並銷毀不再需要
// 的資料。

?>

由於這個網站過去多次幫助了我,並協助我建立了這個腳本,我希望我可以用這個腳本幫助其他人,節省時間來開發比即時建立腳本更高效的解決方案。
0
stuart at purpletoucan dot com
18 年前
感謝 Chris dot Calo 提供的縮圖程式碼片段。檔案類型問題可以輕鬆透過 getimagesize 從檔案取得類型來解決,你也可以在那階段處理不支援的類型。因此

list($img_width,$img_height, $type) = getimagesize($source_file); // 取得原始尺寸
if ($type != 1 && $type != 2 && $type != 3 && $type != 15) { die("您的檔案是不支援的格式"); }

...然後稍後再次檢查類型以正確開啟圖片

if ( $type == 1 ) { $img_source = imagecreatefromgif($source_file); }
else if ( $type == 2 ) { $img_source = imagecreatefromjpeg($source_file); }
else if ( $type == 3 ) { $img_source = imagecreatefrompng($source_file); }
else if ( $type == 15 ) { $img_source = imagecreatefromwbmp($source_file); }
0
Anonymous
18 年前


我也有類似的安全模式問題。我的解決方案是

在 imagejpeg()、touch() 等之前。
寫入
ini_set(safe_mode,Off);
然後在所有事情之後
ini_set(safe_mode,On);

很奇怪,但它有效
Chears2All
0
moron at industrial dot org
19 年前
請注意,此函數目前損壞的安全模式行為有一個錯誤回報正在開啟

http://bugs.php.net/?id=35060

根據回應的 PHP 工作人員表示,文件是錯誤的(我不同意,但我也不是他們的員工)。

解決方法是在使用 imagejpeg() 之前,先使用 touch()(或任何其他可以執行此操作的檔案系統函數)來建立檔案。
0
mbailey [at] aethon [dt] co [dt] uk
19 年前
>>Bram Van Dam 的

以下註解中 ob_end_clean 呼叫缺少 "()"

ob_end_clean; // 停止此輸出緩衝區

應該讀作

ob_end_clean(); // 停止此輸出緩衝區

然後你可以使用它來新增 content-length 標頭(例如,flash 需要預先提供內容長度才能建立載入器)

例如

...

ob_start(); // 啟動新的輸出緩衝區
imagejpeg( $newimage, "", 90 );
$ImageData = ob_get_contents();
$ImageDataLength = ob_get_length();
ob_end_clean(); // 停止此輸出緩衝區

header("Content-type: image/jpeg") ;
header("Content-Length: ".$ImageDataLength);
echo $ImageData;

...
0
Anonymous
20 年前
將圖片輸出到瀏覽器時請注意...

請確保你正在編輯的檔案中,以及任何包含的檔案中,<?php ?> 標籤周圍沒有多餘的空格。

我開始認為 GD 或其他地方有錯誤,我檢查了我正在處理的檔案,但忘記了包含的檔案...

時間都浪費了..
-2
ghokanso at cs dot ndsu dot edu
19 年前
當使用 imagepng 或 imagejpeg 顯示圖片時,你可能想要/需要在使用 imagepng 和 imagejpeg 函數之前呼叫 "header("Content-type: image/jpeg")"。
似乎有些伺服器/瀏覽器正在移除預設標頭,因此圖片不會呈現,而是顯示為原始資料。
(例如,Firefox 1.02+ 和 OSX Safari)
-1
irishcybernerd at email dot com
21 年前
你可以緩衝輸出流,而不是使用上面描述的臨時檔案。其他人告訴我這個方法,它似乎運作得非常好。

// 開始緩衝輸出流
ob_start();

// 將圖片作為檔案輸出到輸出流
Imagejpeg($im);

// 讀取輸出緩衝區
$buffer = ob_get_contents();

// 清除緩衝區
ob_end_clean();

// 根據你的意願使用 $buffer...
-1
Michaelsoft
17 年前
[編者註:根據 roberto at ilpiola.it 的註解修復]

我找不到任何關於使用 GD lib 變更 JPG 檔案的 DPI 資訊的資訊。由於變更此設定不會調整實際圖片的大小或縮放,因此它只是一個標頭設定。
以下程式碼片段會將你的 $image 儲存到 $file 並將 DPI 設定為 150。

<?php

imagejpeg
($image, $file, 75);

// 變更 DPI
$dpi_x = 150;
$dpi_y = 150;

// 讀取檔案
$size = filesize($file);
$image = file_get_contents($file);

// 更新 JPG 標頭中的 DPI 資訊
$image[13] = chr(1);
$image[14] = chr(floor($dpi_x/256));
$image[15] = chr( $dpi_x%256);
$image[16] = chr(floor($dpi_y/256));
$image[17] = chr( $dpi_y%256);

// 寫入新的 JPG
$f = fopen($file, 'w');
fwrite($f, $msg, $size);
fclose($f);

?>

附註:尚未完全測試(仍在測試中),但它對我的圖片有效...
-1
Kokesh
20 年前
這是一個簡單但功能強大的腳本,用於即時建立縮圖。
您可以將腳本
直接包含到網頁中 - 只需將其放入 <img src= 標籤中即可。
寬度為 150 像素。
此調整大小工具會保留長寬比。
這是腳本
<?php
// 使用方式:resize.php?pic=圖片網址&width=寬度(像素)
// kokesh@kokeshnet.com 2004
header("Content-type: image/jpeg");
$im = imagecreatefromjpeg($pic);
$orange = imagecolorallocate($im, 220, 210, 60);
$px = (imagesx($im) - 7.5 * strlen($string)) / 2;

$old_x=imageSX($im);
$old_y=imageSY($im);

$new_w=(int)($width);
if ((
$new_w<=0) or ($new_w>$old_x)) {
$new_w=$old_x;
}

$new_h=($old_x*($new_w/$old_x));

if (
$old_x > $old_y) {
$thumb_w=$new_w;
$thumb_h=$old_y*($new_h/$old_x);

}
if (
$old_x < $old_y) {
$thumb_w=$old_x*($new_w/$old_y);
$thumb_h=$new_h;
}
if (
$old_x == $old_y) {
$thumb_w=$new_w;
$thumb_h=$new_h;
}
$thumb=ImageCreateTrueColor($thumb_w,$thumb_h);
imagecopyresized($thumb,$im,0,0,0,0,$thumb_w,$thumb_h,$old_x,$old_y);

imagejpeg($thumb,"",90);
imagedestroy($thumb);
?>
-1
gzink at zinkconsulting dot com
20 年前
別忘了 JPEG 壓縮會產生失真!而且它們並非都非常明顯。PHP JPEG 壓縮相當不錯,但似乎通常

-整體來說,會稍微地讓圖像變亮(以前從未見過這種情況,但它會讓平面設計師感到困擾,您可能需要在壓縮圖像之前將其變暗)
-降低飽和度,特別是對於在幾個像素內有許多不同顏色點的圖像(這是 JPEG 的一個已記錄的功能)
-嚴重干擾藍色,這是所有 JPEG 的通病,但在某些包含藍色和黑色或其他細緻藍色部分的狀況下,會非常惱人

如果上述任何情況影響到您,或者您的圖像不太像照片,您可能會想考慮使用 imagepng() 並輸出 PNG 圖像而不是 JPEG。有時我會讓演算法比較 JPEG 和 PNG 的圖像,並將較小的版本傳送給使用者。

此外,在使用 imagepng() 時,您應該在 95% 的情況下先使用 imageinterlace()。交錯式 JPEG 會逐步載入,在圖像載入時品質會逐漸提高,因此連線速度較慢的使用者可以看到低品質的完整圖像。所有這些都不會影響檔案大小(實際上,有時檔案大小會更小!)或最終品質。

希望這對一些人有所幫助。如果沒有進行大量的嘗試,這一切並不是很明顯。

-Galen
http://zinkconsulting.com/
-2
bernytech at gmail dot com
13 年前
別像我一樣,為了找出為什麼我的 xxx.php 檔案會將 https://127.0.0.1/xxx.php 作為單行回應輸出而苦惱好幾個小時。

為什麼?

最有可能的原因是您有下列情況之一

1. php 標籤前後有空格
2. 需要設定 header('Content-type: image/jpeg');
3. 如果您有需要的檔案...請確保沒有輸出任何東西...沒有測試列印語句,因為頁面需要圖片資訊
4. 您的程式碼有錯誤

在我的例子中,是第 4 點。函數呼叫 base64decode 無法運作是有原因的...

實際上是:base64_decode()

順便一提,驗證 base64 編碼圖片的其他方法是使用以下標籤

echo '<img src="data:image/jpeg;base64,'.$row['IMAGE'].'" alt="photo">';

我正在從 mysql 資料庫中提取以 base 64 編碼的 blob 資料,並嘗試將其呈現在頁面上

希望這對某人有所幫助。
-1
chris dot calo at gmail dot com
18 年前
感謝 Stuart 和 Darren 對 create_thumbnail 函數的更正。關於該函數的另一個注意事項:imagecreatefromwbmp 的使用不正確。WBMP 是無線點陣圖,而不是 Windows 點陣圖(感謝 clambert at whitecrown),因此目前的縮圖例程將無法處理 Windows 點陣圖。請參閱 http://us2.php.net/manual/en/function.imagecreatefromwbmp.php 上的說明,了解如何處理 Windows 點陣圖的提示。
-1
Kenneth Keiter
18 年前
所以...在花了幾個小時處理這個複雜的函數之後,我發現它不會保留它用於建立圖像的資源,imagepng() 或 imagegif() 也不會。我的意思是說您不能對同一個資源執行兩個 imagejpeg()、imagepng() 或 imagegif() 呼叫。另一個可能未記載的怪癖...:-(
-1
wojteksw at go2 dot pl
19 年前
我修改了 Kokesh 腳本中的一行
2004年6月25日 06:42 上述,現在它會產生品質更好的縮圖。
您必須將函數 imagecopyresized() 變更為 imagecopyresampled()
-2
John Luetke <johnl1479 gmail com>
19 年前
將手冊範例改寫成此函數,用於建立縮圖影像

function thumbnail_jpeg ($original, $thumbnail, $width, $height, $quality) {
list($width_orig, $height_orig) = getimagesize($original);
if ($width && ($width_orig < $height_orig)) {
$width = ($height / $height_orig) * $width_orig;
}
else {
$height = ($width / $width_orig) * $height_orig;
}
$image_p = imagecreatetruecolor($width, $height);
$image = imagecreatefromjpeg($originial);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
imagejpeg($image_p, $thumbnail, $quality);
return;
}
-2
Pedja (pedja at supurovic dot net)
17 年前
這是範例函數,可建立來源 JPEG 檔案的縮圖。縮圖將為正方形(寬度和高度相同),且原始影像會被裁剪以符合。

參數

$p_thumb_file - 檔案名稱(包含路徑),縮圖將儲存至該處

$p_photo_file - 來源 JPEG 檔案名稱(包含路徑),將由此建立縮圖

$p_max_size - 縮圖影像的寬度和高度(將會相同),以像素為單位

$p_quality - jpeg 縮圖的品質

<?php

function photoCreateCropThumb ($p_thumb_file, $p_photo_file, $p_max_size, $p_quality = 75) {

$pic = @imagecreatefromjpeg($p_photo_file);

if (
$pic) {
$thumb = @imagecreatetruecolor ($p_max_size, $p_max_size) or die ("無法建立影像!");
$width = imagesx($pic);
$height = imagesy($pic);
if (
$width < $height) {
$twidth = $p_max_size;
$theight = $twidth * $height / $width;
imagecopyresized($thumb, $pic, 0, 0, 0, ($height/2)-($width/2), $twidth, $theight, $width, $height);
} else {
$theight = $p_max_size;
$twidth = $theight * $width / $height;
imagecopyresized($thumb, $pic, 0, 0, ($width/2)-($height/2), 0, $twidth, $theight, $width, $height);
}

ImageJPEG ($thumb, $p_thumb_file, $p_quality);
}

}

?>
To Top