PHP Conference Japan 2024

imagecreatefromjpeg

(PHP 4、PHP 5、PHP 7、PHP 8)

imagecreatefromjpeg從檔案或 URL 建立新的影像

描述

imagecreatefromjpeg(字串 $filename): GdImage|false

imagecreatefromjpeg() 傳回一個影像識別符,代表從給定的檔案名稱取得的影像。

提示

如果已啟用fopen 封裝器,則 URL 可以作為此函式的檔案名稱使用。如需如何指定檔案名稱的詳細資訊,請參閱fopen()。請參閱支援的協定與封裝器,以取得各種封裝器功能的相關資訊連結、其使用注意事項,以及它們可能提供的任何預定義變數的相關資訊。

參數

filename

JPEG 影像的路徑。

傳回值

成功時傳回影像物件,錯誤時傳回 false

更新日誌

版本 描述
8.0.0 成功時,此函式現在會傳回 GDImage 實例;先前會傳回 資源

範例

範例 #1 載入 JPEG 時處理錯誤的範例

<?php
function LoadJpeg($imgname)
{
/* 嘗試開啟 */
$im = @imagecreatefromjpeg($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, '載入時發生錯誤 ' . $imgname, $tc);
}

return
$im;
}

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

$img = LoadJpeg('bogus.image');

imagejpeg($img);
imagedestroy($img);
?>

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

Output of example : Example to handle an error during loading of a JPEG
新增註解

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

31
jan at recreatie-zorg dot nl
11 年前
此函式不會遵守 EXIF 方向資料。使用 EXIF 旋轉的圖片,在由 imagecreatefromjpeg() 處理後,將會以原始方向顯示。以下是一個從 JPEG 建立影像的函式,同時會遵守 EXIF 方向資料。

<?php
function imagecreatefromjpegexif($filename)
{
$img = imagecreatefromjpeg($filename);
$exif = exif_read_data($filename);
if (
$img && $exif && isset($exif['Orientation']))
{
$ort = $exif['Orientation'];

if (
$ort == 6 || $ort == 5)
$img = imagerotate($img, 270, null);
if (
$ort == 3 || $ort == 4)
$img = imagerotate($img, 180, null);
if (
$ort == 8 || $ort == 7)
$img = imagerotate($img, 90, null);

if (
$ort == 5 || $ort == 4 || $ort == 7)
imageflip($img, IMG_FLIP_HORIZONTAL);
}
return
$img;
}
?>
26
matt dot squirrell dot php at hsmx dot com
12 年前
這個小函式可讓您根據熱門的影像類型建立影像,而不必擔心它到底是什麼類型

<?php
function imageCreateFromAny($filepath) {
$type = exif_imagetype($filepath); // [] 如果你沒有 exif,你可以使用 getImageSize()
$allowedTypes = array(
1, // [] gif
2, // [] jpg
3, // [] png
6 // [] bmp
);
if (!
in_array($type, $allowedTypes)) {
return
false;
}
switch (
$type) {
case
1 :
$im = imageCreateFromGif($filepath);
break;
case
2 :
$im = imageCreateFromJpeg($filepath);
break;
case
3 :
$im = imageCreateFromPng($filepath);
break;
case
6 :
$im = imageCreateFromBmp($filepath);
break;
}
return
$im;
}
?>
13
hvozda at ack dot org
18 年前
如果 imagecreatefromjpeg() 失敗並出現「PHP Fatal error: Call to undefined function: imagecreatefromjpeg()」的錯誤,並不一定表示您沒有安裝 GD 庫。

如果 phpinfo() 顯示 GD,但沒有 JPEG 支援,那麼這就是問題所在。您可能會認為 --with-gd 會處理好這一切,因為它會檢查 libjpeg 是否存在(並找到它),並將該功能添加到 GD 中,但至少在 RHEL v2.1、RHEL v3、CentOS v2.1 或 CentOS v4.3 上,v4.4.4 並非如此。

在這些平台上,*重要*的是 --with-jpeg-dir 必須在 --with-gd *之前*。如果不是,GD 將不會建置 JPEG 支援,就好像從未指定 --with-jpeg-dir 一樣...
5
anatol at nugob dot org
18 年前
當處理上傳的 JPEG 檔案時,執行一個名為 jhead 的小而非常有用的程式通常是一個好主意
http://www.sentex.net/~mwandel/jhead/ )。

這將清除不必要的 JPEG 標頭資訊,這些資訊可能會導致問題。某些相機或應用程式會將二進位資料寫入標頭中,這可能會導致難看的結果,例如在稍後重新取樣影像時出現奇怪的顏色。

用法
<?php
exec
("/path/to/jhead -purejpg /path/to/image");
// 例如,當您透過表單上傳檔案時,請在繼續之前執行此操作:
exec("/path/to/jhead -purejpg ".$file['tmp_name']);
?>

我沒有機會測試這個,但我猜這甚至可能解決佳能 PowerShot 相機拍攝的影像導致 PHP 當機的問題。

這是來自 jhead 文件:「-purejpg:刪除所有對於渲染影像而言不必要的 JPEG 區段。去除各種應用程式可能留在影像中的任何元資料。」

jhead 還有其他一些有用的選項...
5
Karolis Tamutis karolis.t_AT_gmail.com
18 年前
除了 yaroukh at gmail dot com 的評論之外。

似乎即使是小型影像也可能會很快耗盡您的預設記憶體限制。設定值 'memory_limit' 被標記為 PHP_INI_ALL,因此您可以使用 ini_set 動態變更它。因此,我們可以「動態分配記憶體」,以防止那些記憶體限制超出錯誤。

<?php

$imageInfo
= getimagesize('PATH/TO/YOUR/IMAGE');
$memoryNeeded = round(($imageInfo[0] * $imageInfo[1] * $imageInfo['bits'] * $imageInfo['channels'] / 8 + Pow(2, 16)) * 1.65);

if (
function_exists('memory_get_usage') && memory_get_usage() + $memoryNeeded > (integer) ini_get('memory_limit') * pow(1024, 2)) {

ini_set('memory_limit', (integer) ini_get('memory_limit') + ceil(((memory_get_usage() + $memoryNeeded) - (integer) ini_get('memory_limit') * pow(1024, 2)) / pow(1024, 2)) . 'M');

}

?>
2
brentwientjes at NOSPAM dot comcast dot net
14 年前
昨晚我在 move_upload_file 下發布了以下筆記,今晚查看它是否已進入系統。我碰巧也拉出了 imagecreatefromjpeg,並被提醒了本節中的許多調整大小腳本。不幸的是,我的經驗沒有涵蓋在下面的大多數範例中,因為它們都假設伺服器和瀏覽器的要求不太明顯。因此,我在本節中再次發布這篇文章,以幫助其他人揭開檔案上傳和調整任意大小影像的神秘面紗。我已經用數百張不同大小的影像測試了幾天,它似乎運作良好。可以添加許多其他功能,例如透明度、Alpha 混合、相機特定知識、更多錯誤檢查。祝你好運。

--- 來自 move_upload_file 貼文 ---

幾年來,我一直難以理解如何有效地載入影像(超過 2MB),然後建立縮圖。我下面關於一般檔案上傳的筆記是系統預設限制的早期提示,我最近發現了最終限制,我以此作為成功載入超過 2MB 的影像然後建立縮圖的各種缺失資訊的範例。此特定範例假設正在上傳使用者的圖片,並且由於瀏覽器快取,需要在末尾加上一個唯一的數字,以使瀏覽器在上傳時載入新圖片進行審閱。我使用的整體呼叫程式是一個基於 Flex 的應用程式,它呼叫此 PHP 檔案來上傳使用者縮圖。

秘訣是

1. 調整伺服器記憶體大小、檔案上傳大小和發佈大小
2. 將影像轉換為標準格式(在此範例中為 jpg)並縮放

可以使用 .htaccess 檔案或內嵌程式碼調整伺服器。此範例具有一個 .htaccess 檔案,其中包含檔案上傳大小和發佈大小,然後是動態系統記憶體的內嵌程式碼。

htaccess 檔案
php_value post_max_size 16M
php_value upload_max_filesize 6M

<?php
// $img_base = 縮圖影像的基礎目錄結構
// $w_dst = 縮圖的最大寬度
// $h_dst = 縮圖的最大高度
// $n_img = 新的縮圖名稱
// $o_img = 舊的縮圖名稱
function convertPic($img_base, $w_dst, $h_dst, $n_img, $o_img)
{
ini_set('memory_limit', '100M'); // 處理大型影像
unlink($img_base.$n_img); // 如果存在,移除舊影像
unlink($img_base.$o_img);
$new_img = $img_base.$n_img;

$file_src = $img_base."img.jpg"; // 暫時安全儲存影像
unlink($file_src);
move_uploaded_file($_FILES['Filedata']['tmp_name'], $file_src);

list(
$w_src, $h_src, $type) = getimagesize($file_src); // 建立新的尺寸,保持長寬比
$ratio = $w_src/$h_src;
if (
$w_dst/$h_dst > $ratio) {$w_dst = floor($h_dst*$ratio);} else {$h_dst = floor($w_dst/$ratio);}

switch (
$type)
{case
1: // gif -> jpg
$img_src = imagecreatefromgif($file_src);
break;
case
2: // jpeg -> jpg
$img_src = imagecreatefromjpeg($file_src);
break;
case
3: // png -> jpg
$img_src = imagecreatefrompng($file_src);
break;
}
$img_dst = imagecreatetruecolor($w_dst, $h_dst); // 重新取樣

imagecopyresampled($img_dst, $img_src, 0, 0, 0, 0, $w_dst, $h_dst, $w_src, $h_src);
imagejpeg($img_dst, $new_img); // 儲存新影像

unlink($file_src); // 清理影像儲存
imagedestroy($img_src);
imagedestroy($img_dst);
}

$p_id = (Integer) $_POST[uid];
$ver = (Integer) $_POST[ver];
$delver = (Integer) $_POST[delver];
convertPic("your/file/structure/", 150, 150, "u".$p_id."v".$ver.".jpg", "u".$p_id."v".$delver.".jpg");

?>
6
sagarsdeshmukh91 at gmail dot com
7 年前
警告:imagecreatefromjpeg() [function.imagecreatefromjpeg]:'image.jpg' 不是有效的 JPEG 檔案

這只會在某些圖片發生,這些圖片在任何程式中開啟都沒問題,甚至上傳到我在 localhost 上架設的網站版本也沒有問題。

要修正此問題,請嘗試以下程式碼片段:

<?php
...
$image = @ImageCreateFromJpeg($image_name);
if (!
$image)
{
$image= imagecreatefromstring(file_get_contents($image_name));
}
...
?>
6
willertan1980 at yahoo dot com
21 年前
您是否發現有時當 imagecreatefromjpeg() 處理損壞的 JPEG 時,PHP 會停滯?我發現這是因為您使用的 JPEG 檔案沒有 EOI(影像結束符)。
在您的 JPEG 檔案結尾會有 FF D9。

JPEG 影像應以 0xFFD8 開始,並以 0xFFD9 結束。

// 這可能有助於修正錯誤
function check_jpeg($f, $fix=false ){
# [070203]
# 檢查 JPEG 檔案的標頭和結尾 - 也嘗試修正它
if ( false !== (@$fd = fopen($f, 'r+b' )) ){
if ( fread($fd,2)==chr(255).chr(216) ){
fseek ( $fd, -2, SEEK_END );
if ( fread($fd,2)==chr(255).chr(217) ){
fclose($fd);
return true;
}else{
if ( $fix && fwrite($fd,chr(255).chr(217)) ){return true;}
fclose($fd);
return false;
}
}else{fclose($fd); return false;}
}else{
return false;
}
}
3
sales at wholehogsoftware dot com
17 年前
我發現在 CentOS 4.x 中有一個錯誤,雖然之前已處理過,但似乎這裡沒有直接說明此錯誤的性質。

如果您在 CentOS 4.4(可能更早版本)上使用此函數時遇到問題,並收到此錯誤

呼叫未定義的函數 imagecreatefromjpeg()

這是因為如果您安裝了 libjpeg,預設情況下安裝*確實*支援 JPG。但是,設定檔腳本會在 /usr/lib 中找到 libjpeg,但它從未成功添加到 PHP 建置中。

要修正此問題,您應重新編譯 PHP,並務必在設定命令中加入 '--with-jpeg-dir'。此選項應在 --with-gd 選項之前出現。範例

'--with-jpeg-dir' '--with-gd'

如果您沒有將其放在 --with-gd 之前,則該選項會被完全忽略。

一如往常,請務必在 'make install' 之前執行 'make clean'。我犯了忘記檢查的錯誤,浪費了 30 分鐘試圖解決這個問題,只是因為我忘記事先清理。
3
e dot a dot schultz at gmail dot com
18 年前
在 John 的 Karolis 程式碼的人類可讀版本中,動態分配所需記憶體時有一些錯誤。如果您在編譯時沒有使用 "--enable-memory-limit" 選項,此腳本會產生 E_ERROR 等級的錯誤。以下是一個修正版本,已包裝成函數。若要檢視 memory_get_usage() 的替代函數,請查看 http://us2.php.net/manual/en/function.memory-get-usage.php

<?php
function setMemoryForImage( $filename ){
$imageInfo = getimagesize($filename);
$MB = 1048576; // 1 MB 的位元組數
$K64 = 65536; // 64 KB 的位元組數
$TWEAKFACTOR = 1.5; // 您可以根據需要調整此值
$memoryNeeded = round( ( $imageInfo[0] * $imageInfo[1]
*
$imageInfo['bits']
*
$imageInfo['channels'] / 8
+ $K64
) * $TWEAKFACTOR
);
// ini_get('memory_limit') 只有在編譯時加入 "--enable-memory-limit" 才會生效
// 預設的記憶體限制是 8MB,所以我們就用這個值。
// 若要找出您的記憶體限制,請查看您的 php.ini 檔案。
$memoryLimit = 8 * $MB;
if (
function_exists('memory_get_usage') &&
memory_get_usage() + $memoryNeeded > $memoryLimit)
{
$newLimit = $memoryLimitMB + ceil( ( memory_get_usage()
+
$memoryNeeded
- $memoryLimit
) / $MB
);
ini_set( 'memory_limit', $newLimit . 'M' );
return
true;
}else
return
false;
}
}
?>
2
matthieu dot poignant+php at gmail dot com
3 年前
在 PHP 8 中,您可以根據流行的圖片類型建立圖片,而無需擔心它是哪種圖片

<?php
function imageCreateFromAny($filepath): ?\GdImage {
return match (
exif_imagetype($filepath)) {
// gif
1 => imageCreateFromGif($filepath),
// jpg
2 => imageCreateFromJpeg($filepath),
// png
3 => imageCreateFromPng($filepath),
// bmp
6 => imageCreateFromBmp($filepath),
// 未定義
default => null,
};
}
?>
1
info at daleconsulting dot com dot au
18 年前
在 Angel Leon 的一篇文章中,提供了一個範例腳本,使用 imagecreatefromjpeg 建立縮圖庫。 我對 php 腳本相當陌生,但我發現如果表格的行沒有「填滿」圖片,該腳本就無法顯示縮圖圖片表格。例如,如果資料夾中有 5 張圖片,並且腳本指定表格中有 3 行,則該頁面僅會顯示第一行的縮圖,並且只會顯示三張圖片。 我發現如果您使用以下方程式指定變數 row,則表格將會正確顯示

$row = intval(count($files)+($row_size-1));

(這是 createThumbTable 函數中的第一行。)
2
juozaspo at gmail dot com
14 年前
這是我實際的腳本,用於在不失真的情況下調整圖片大小,以產生縮圖和/或在瀏覽器中顯示較小的圖片。

<?php
// 我所有頁面都會使用的常用頁首
ob_start("ob_gzhandler");
$PHP_SELF=$_SERVER['PHP_SELF'];
include
"include/errors.php"; // 錯誤日誌腳本

// 實際腳本從這裡開始
$type=false;
function
open_image ($file) {
// 偵測類型並據此進行處理
global $type;
$size=getimagesize($file);
switch(
$size["mime"]){
case
"image/jpeg":
$im = imagecreatefromjpeg($file); // jpeg 檔案
break;
case
"image/gif":
$im = imagecreatefromgif($file); // gif 檔案
break;
case
"image/png":
$im = imagecreatefrompng($file); // png 檔案
break;
default:
$im=false;
break;
}
return
$im;
}

$url = $_GET['url'];
if (isset(
$_SERVER['HTTP_IF_MODIFIED_SINCE']) && (strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == filemtime($url))) {
// 發送檔案的最後修改時間回去
header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($url)).' GMT', true, 304); // 是否已快取?
} else {

$image = open_image($url);

if (
$image === false) { die ('無法開啟圖片'); }

$w = imagesx($image);
$h = imagesy($image);

// 計算新的圖片尺寸 (保持長寬比)
if(isset($_GET['w']) && !isset($_GET['h'])){
$new_w=$_GET['w'];
$new_h=$new_w * ($h/$w);
} elseif (isset(
$_GET['h']) && !isset($_GET['w'])) {
$new_h=$_GET['h'];
$new_w=$new_h * ($w/$h);
} else {
$new_w=isset($_GET['w'])?$_GET['w']:560;
$new_h=isset($_GET['h'])?$_GET['h']:560;
if((
$w/$h) > ($new_w/$new_h)){
$new_h=$new_w*($h/$w);
} else {
$new_w=$new_h*($w/$h);
}
}

$im2 = ImageCreateTrueColor($new_w, $new_h);
imagecopyResampled ($im2, $image, 0, 0, 0, 0, $new_w, $new_h, $w, $h);
//效果
if(isset($_GET['blur'])){
$lv=$_GET['blur'];
for(
$i=0; $i<$lv;$i++){
$matrix=array(array(1,1,1),array(1,1,1),array(1,1,1));
$divisor = 9;
$offset = 0;
imageconvolution($im2, $matrix, $divisor, $offset);
}
}
if(isset(
$_GET['sharpen'])){
$lv=$_GET['sharpen'];
for(
$i=0; $i<$lv;$i++){
$matrix = array(array(-1,-1,-1),array(-1,16,-1),array(-1,-1,-1));
$divisor = 8;
$offset = 0;
imageconvolution($im2, $matrix, $divisor, $offset);
}
}

header('Content-type: image/jpeg');
$name=explode(".", basename($_GET['url']));
header("Content-Disposition: inline; filename=".$name[0]."_t.jpg");
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', filemtime($url)) . ' GMT');
header("Cache-Control: public");
header("Pragma: public");
imagejpeg($im2);
//imagedestroy($im2);
//imagedestroy($image);
}

?>
1
huguowen at cn dot ibm dot com
17 年前
給 Windows 使用者設定 PHP 的 GD(動態圖形函式庫)的提示。

我遇到的問題

當我執行以下函數時,它會在

$img = @imagecreatefromjpeg($image_path);

處終止,錯誤訊息是:undefined function imagecreatefromjpeg();

腳本的其他程式碼都沒有執行。

解決方案

簡而言之,你需要啟用 gd 函式庫。
它包含了 imagecreatefromjpeg() 函式的實作。

請依照以下步驟操作:

我的 PHP 安裝目錄是:c:/php/
首先,你必須嘗試找到
c:/php/php.ini
c:/php/ext/php_gd2.dll (PHP 5)
c:/php/extension/php_gd2.dll (PHP 4)

php_gd2.dll 包含在 Windows 的標準 PHP 安裝中,
但預設情況下並未啟用。
你必須將其啟用。
你只需在 php.ini 中取消註解 "extension=php_gd2.dll" 這行,並重新啟動 PHP 擴充功能。


,extension=php_gd2.dll

改為
extension=php_gd2.dll

你可能還需要修正擴充功能目錄設定。

extension_dir = "./"
extension_dir = "./extensions"
改為 (適用於 WINDOWS)
extension_dir = "c:/php/extensions" (PHP 4)
extension_dir = "c:/php/ext" (PHP 5)

祝您順利!
1
bpiere21 at hotmail dot com
22 年前
###--- imagecreatefromjpeg 只會從你的磁碟開啟 JPEG 檔案。
###--- 若要從 URL 載入 JPEG 圖片,請使用以下函式。

function LoadJPEG ($imgURL) {

##-- 從 80 連接埠取得圖片檔案 --##
$fp = fopen($imgURL, "r");
$imageFile = fread ($fp, 3000000);
fclose($fp);

##-- 在磁碟上建立一個暫存檔 --##
$tmpfname = tempnam ("/temp", "IMG");

##-- 將圖片資料放入暫存檔中 --##
$fp = fopen($tmpfname, "w");
fwrite($fp, $imageFile);
fclose($fp);

##-- 使用 GD 函式庫從磁碟載入圖片 --##
$im = imagecreatefromjpeg ($tmpfname);

##-- 刪除暫存檔 --##
unlink($tmpfname);

##-- 檢查錯誤 --##
if (!$im) {
print "無法建立 JPEG 圖片 $imgURL";
}

return $im;
}

$imageData = LoadJPEG("http://www.example.com/example.jpg");

Header( "Content-Type: image/jpeg");

imagejpeg($imageData, '', 100);
2
dmhouse at gmail dot com
17 年前
若要使用腳本來計算 Karolis 和 Yaroukh 在下方討論的「fudge factor」,請嘗試以下操作。抓取一些圖片,最好是一些大圖片 (腳本應可處理高達 10 百萬像素左右的圖片)、一些小圖片,以及一些介於兩者之間的圖片。將它們的檔名加入 $images 陣列,然後在你的瀏覽器中載入腳本。

<?php

header
('Content-Type: text/plain');

ini_set('memory_limit', '50M');

function
format_size($size) {
if (
$size < 1024) {
return
$size . ' bytes';
}
else {
$size = round($size / 1024, 2);
$suffix = 'KB';
if (
$size >= 1024) {
$size = round($size / 1024, 2);
$suffix = 'MB';
}
return
$size . ' ' . $suffix;
}
}

$start_mem = memory_get_usage();

echo <<<INTRO
使用 imagecreatefromjpeg() 載入圖片所需的記憶體是圖片尺寸和圖片位元深度,乘以額外開銷的函數。
它可以從這個公式計算:
位元組數 = 寬度 * 高度 * 每像素位元組數 * 額外開銷的 fudge factor
其中每像素位元組數 = 位元深度/8,或每通道位元數 * 通道數 / 8。
此腳本會透過載入各種尺寸的圖片來計算額外開銷的 fudge factor。
INTRO;

echo
"\n\n";

echo
'限制:' . ini_get('memory_limit') . "\n";
echo
'使用前:' . format_size($start_mem) . "\n";

// 將要載入的圖片放置在以下陣列中:
$images = array('image1.jpg', 'image2.jpg', 'image3.jpg');
$ffs = array();

echo
"\n";

foreach (
$images as $image) {
$info = getimagesize($image);
printf('正在載入圖片 %s,尺寸 %s * %s,bpp %s... ',
$image, $info[0], $info[1], $info['bits']);
$im = imagecreatefromjpeg($image);
$mem = memory_get_usage();
echo
'完成' . "\n";
echo
'記憶體使用量:' . format_size($mem) . "\n";
echo
'差異:' . format_size($mem - $start_mem) . "\n";
$ff = (($mem - $start_mem) /
(
$info[0] * $info[1] * ($info['bits'] / 8) * $info['channels']));
$ffs[] = $ff;
echo
'差異 / (寬度 * 高度 * 每像素位元組數):' . $ff . "\n";
imagedestroy($im);
$start_mem = memory_get_usage();
echo
'已銷毀。記憶體使用量:' . format_size($start_mem) . "\n";

echo
"\n";
}

echo
'平均 fudge factor:' . (array_sum($ffs) / count($ffs));

?>
2
Anonymous
18 年前
關於 e dot a dot schultz at gmail dot com 的貼文

我嘗試了該腳本 (以及稍後貼出的錯誤修正),但仍然遇到記憶體問題。即使它看起來計算正確,但大多數時候仍然沒有足夠的記憶體來上傳大圖片。所以這對我很有幫助

$newLimit = $newLimit+3000000; (在將其傳遞給 ini_set() 函式之前)。

非常簡單,可能不是最好的解決方案,但它目前可行 (你當然可以給它少於額外的 3MB,只要嘗試對你有效的即可)。
2
yaroukh at gmail dot com
19 年前
ImageCreateFromJPEG 所需的估計記憶體

首先我假設簡單的寬度*高度*bpp 就足夠了,但事實並非如此;還有一些相當大的額外開銷。

$imageInfo = GetImageSize($imageFilename);
$memoryNeeded = Round(($imageInfo[0] * $imageInfo[1] * $imageInfo['bits'] * $imageInfo['channels'] / 8 + Pow(2, 16)) * 1.65);

在啟用 memory_limit 的情況下,記憶體不足會導致腳本崩潰;上面寫的會告訴你從圖片檔案建立圖片資源需要多少記憶體。因此,結合 Memory_Get_Usage() 和 Get_CFG_Var('memory_limit'),你可以避免上述結束。(然而,仍然會有太多圖片因記憶體不足而無法處理,因為此結果非常準確。)
1
ben dot lancaster at design-ontap dot co dot uk
18 年前
值得注意的是,所有 imagecreate* 函式都有意地不會在 include_path 中搜尋。
0
Jrn Berkefeld
13 年前
我遇到一個非常奇怪的行為
背景
每次使用者上傳圖片時,原始檔案都會與縮圖和用於小型幻燈片的的中等尺寸版本一起儲存。
這表示在上傳時,所有這些原始圖片都被 PHP 識別為有效的 jpg。

變更
我建立了一個新的幻燈片腳本,具有全螢幕顯示功能。我舊的「中等尺寸」版本只有約 600px 寬,這導致它們在延伸到現代螢幕尺寸後看起來很醜。
--> 我建立了一個小型腳本,可開啟所有原始圖片並儲存比我擁有的更大的「中等尺寸」版本。

問題
由於某些原因,大約 1/3 的圖片 (不是最後 1/3,而總是相同的圖片) 現在被 PHP 標記為「...不是有效的 JPEG 檔案...」。

原因
仍然未知

解決方案
<?php
...
$src_img = @imagecreatefromjpeg($myJPGfile_relative);
if (!
$src_img) {
$src_img = LoadJPEG("http://example.com/".$myJPGfile);
}
?>

每次本地方法失敗時,腳本會退回使用下方提到的「LoadJPEG」腳本從外部載入相同檔案 - 非常感謝作者!
即使我講的是完全相同伺服器上的完全相同檔案,這樣做仍然有效。唯一的區別在於,一次是從本機存取,另一次是透過 80 連接埠存取。

當使用此方法時,請注意相對於你的腳本的正確路徑,以及相對於你的網域可能不同的路徑。
0
Ray.Paseur 有時使用 Gmail
14 年前
如果檔名中有空格,並且你使用本機 URL,此函式會正常運作。但使用完整限定 URL 則不然。

<?php
$url
= 'RAY_rgb 300x100.jpg';
$img = ImageCreateFromJPEG($url);
// 運作正常

$url = 'http://www.example.com/RAY_rgb 300x100.jpg';
$img = ImageCreateFromJPEG($url);
// 失敗 Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]: gd-jpeg: JPEG 函式庫回報無法復原的錯誤
?>
0
Christoph Ziegenberg
18 年前
Matt 回報說 PHP 使用 imagecreatefromjpeg() 時會崩潰 - 這是真的,而且我花了很多時間才找到錯誤 - 但不僅是 Canon PowerShot S70,Canon PowerShot A400 也會讓 PHP (5.1.2) 崩潰,而且沒有任何機會可以捕獲它!

所以我使用以下檢查來排除所有 Canon PowerShot 的圖片

function check_canonpowershot($filename)
{
if (strpos(file_get_contents($filename), 'Canon PowerShot') !== false)
{
return true;
}
return false;
}
0
JohnBrook at pobox dot com
18 年前
另外,如果你願意,這裡有以更易於人閱讀的方式呈現的相同公式

<?php
$MB
= Pow(1024,2); // 1M 的位元組數
$K64 = Pow(2,16); // 64K 的位元組數
$TWEAKFACTOR = 1.8; // 或任何對你有效的數字
$memoryNeeded = round( ( $imageInfo[0] * $imageInfo[1]
*
$imageInfo['bits']
*
$imageInfo['channels'] / 8
+ $K64
) * $TWEAKFACTOR
);
$memoryHave = memory_get_usage();
$memoryLimitMB = (integer) ini_get('memory_limit');
$memoryLimit = $memoryLimit * $MB;

if (
function_exists('memory_get_usage')
&&
$memoryHave + $memoryNeeded > $memoryLimit
) {
$newLimit = $memoryLimitMB + ceil( ( $memoryHave
+ $memoryNeeded
- $memoryLimit
) / $MB
);
ini_set( 'memory_limit', $newLimit . 'M' );
}
?>
0
linus at flowingcreativity dot net
19 年前
我正在使用 PHP 4.3.8 和 GD 2.0.23 相容版本,而且此函式在失敗時不會如所述回傳空字串。這一行

<?php
var_dump
(imagecreatefromjpeg('bogus filename'));
?>

輸出

bool(false)

當然,除非你使用嚴格的比較運算子來評估結果,否則這並不重要,但我認為應該指出這一點。
0
dmsales at design-monster dot com
23 年前
我只是想在這裡記錄一下我在其他地方發現的一些在使用 jpeg 圖片時對我非常有幫助的事情。當使用 imagecreatefromjpeg() 時,可能很難配置新顏色。

我找到的解決方法是在 imagecolorallocate() 下發布的,該方法建議您先使用 imagecreate()、配置顏色,然後將 jpeg 複製到此影像中。
0
rodders_plonker at yahoo dot com
24 年前
對於所有在訊息中遇到下列問題的人
此 PHP 版本中不支援 CreateImageFromJpeg()
首先將 --with-jpeg-dir 新增到你的 ./configure 選項中,因為我遺漏了這個選項 (不知道我需要它),而且我花了將近 6 個小時嘗試編譯來取得此選項。(RH 6.2、PHP 4.0.1pl2、Apache 1.3.12、GD 1.8.3)
-1
webmaster at killer dot com dot ar
18 年前
先前由「e dot a dot schultz at gmail dot com」提供的腳本有一個錯誤

$memoryLimitMB 沒有值

新增
$memoryLimitMB = 8;
在之前
$memoryLimit = 8 * $MB;
並將該行變更為
$memoryLimit = $memoryLimitMB * $MB;

--------------

「JohnBrook at pobox dot com」提供的腳本也發生類似情況

$memoryLimit 沒有值



$memoryLimit = $memoryLimit * $MB;

改為
$memoryLimit = $memoryLimitMB * $MB;
-1
yaroukh at gmail dot com
18 年前
您好 Karolis

我的解決方案旨在解決您的網路主機對記憶體使用量設定限制的情況;在這種情況下,ini_set 當然無法運作 (即使對於在典型 PHP 安裝中具有 'PHP_INI_ALL' 旗標的變數也是如此)。

祝您有美好的一天
Yaroukh
-1
nico at anvilstudios dot co dot za
14 年前
我在 Windows 系統上使用此函式時遇到問題。當檔案不是 JPG 時,此函式並未傳回 false,而是導致錯誤
「imagecreatefromjpeg() : gd-jpeg : JPEG 函式庫回報無法復原的錯誤」。

為了避開這個問題,請先使用其 MIME 類型檢查檔案是否為 JPEG 檔案,如果不是,則傳回 false。
-1
JohnBrook at pobox dot com
18 年前
關於配置記憶體的其他說明:yaroukh 和 Karolis 在下方提供的公式中的 1.65 顯然是透過實驗得出的「調整係數」。我發現我必須稍微向上調整它,才能準確預測所需的記憶體,否則配置仍然會失敗。在我的情況下,我直接使用 1.8,到目前為止都有效。您的結果可能有所不同,因此請根據需要進行實驗。
-1
ceefour -at!- gauldong.net
19 年前
我必須說,從原始碼重新編譯 PHP 並在 gd 中啟用 JPEG 支援花了我一段時間才弄清楚。

尤其是 configure --help 的某個地方應該說明,如果你想要擁有 JPEG 支援,則 --with-jpeg-dir 是強制性的。即使你這樣做了,也不代表你一定會取得支援。如果配置錯誤,則不會輸出任何錯誤,你只會得到「沒有 JPEG 支援」。更令人困惑的是,當 JPEG 支援被停用時,phpinfo 不會說「JPEG 支援:已停用」,而只是省略該項目,因此你甚至不會意識到有問題。

如果你重新編譯 PHP 或 gd,請確保
- 先執行 rm -f config.cache
- 執行 make clean (這很有幫助),實際上你可以直接刪除 modules/gd.*,以及 ext/gd 中的每個 *.o。這部分實際上讓我最頭痛
- ./configure --with-jpeg-dir=/usr/lib 或任何其他包含 libjpeg 二進位函式庫的目錄
- make, make install

phpinfo 現在應該會顯示 jpeg 支援...祝你好運。
(你們這些伺服器上已經安裝 PHP 5 的幸運傢伙...你們不必經歷我所經歷的所有混亂)
-1
cs at kainaw dot com
20 年前
ImageCreateFromJPEG() 函式可能會擲回 emalloc() 錯誤。如果發生這種情況,腳本將會停止執行,但錯誤會出現在你的錯誤日誌中。你應該確保在從 jpeg 檔案建立大型影像之前有足夠的可用記憶體。
-2
pavel.lint at vk.com
12 年前
我遇到 imagecreatefromjpeg() 的問題,即使在前面使用 @ 呼叫時也會輸出錯誤。ini_set("gd.jpeg_ignore_warning", 1) 對我不起作用,所以我提出了另一個簡單的解決方案。

問題是由 gd 錯誤輸出引起的,因此將 STDERR 重新導向到 /dev/null 可以抑制其中的所有錯誤訊息,你仍然可以使用常規的 STDOUT 來輸出錯誤。

因此,只需使用
<?
fclose( STDERR );
$STDERR = fopen( "/dev/null", "wb" );
?>
-4
reorganisation at evo-german dot com
8 年前
必須處理此錯誤訊息

imagecreatefromjpeg(): gd-jpeg: JPEG 函式庫回報無法復原的錯誤

並發現,某些圖片工具 (例如 GIMP) 會新增有關變更的 EXIF 資訊。
這些圖片會出現上述問題。

使用像 Windows 小畫家這樣的簡單圖片工具 - 重新儲存影像 - 且 imagecreatefromjpeg 對我有效。
To Top