imagecreatefromjpeg

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

imagecreatefromjpeg从文件或 URL 创建新图像

说明

imagecreatefromjpeg(string $filename): GdImage|false

imagecreatefromjpeg() 返回一个图像标识符,表示从给定文件名获取的图像。

提示

如果已启用 fopen 包装器,则可以使用 URL 作为此函数的文件名。有关如何指定文件名的更多详细信息,请参阅 fopen()。有关各种包装器的功能、使用说明以及它们可能提供的任何预定义变量的信息,请参阅 支持的协议和包装器

参数

filename

JPEG 图像的路径。

返回值

成功时返回图像对象,错误时返回 false

变更日志

版本 说明
8.0.0 成功时,此函数现在返回一个 GDImage 实例;以前返回的是 resource

示例

示例 #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, 'Error loading ' . $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() 处理后将显示为原始方向。以下是创建尊重 EXIF 方向数据的 JPEG 图像的函数。

<?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
11 年前
这个小函数允许你根据流行的图像类型创建图像,而不用担心它是哪种类型

<?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
17 年前
如果 imagecreatefromjpeg() 失败并显示 "PHP 致命错误: 调用未定义函数: 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 文件

这只会发生在某些图片上,这些图片在任何程序中打开都是正常的,它甚至可以上传到我在本地主机上的网站版本,没有任何问题。

要解决这个问题,请尝试以下代码片段。

<?php
...
$image = @ImageCreateFromJpeg($image_name);
if (!
$image)
{
$image= imagecreatefromstring(file_get_contents($image_name));
}
...
?>
6
willertan1980 at yahoo dot com
20 年前
你有没有发现有时 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; // 1M 中的字节数
$K64 = 65536; // 64K 中的字节数
$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),
// not defined
default => null,
};
}
?>
1
info at daleconsulting dot com dot au
17 年前
在 Angel Leon 的一篇文章中,给出了一个使用 imagecreatefromjpeg 生成缩略图库的示例脚本。我刚开始接触 php 脚本,但我发现如果行没有“填充”图片,该脚本不会显示缩略图表格,即如果文件夹中有 5 张图片,脚本在表格中指定了 3 行,那么页面只会显示第一行的缩略图,并且只显示了 3 张图片。我发现,如果使用以下公式指定变量行,那么表格将正确显示

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

(这是 createThumbTable 函数的第一行。)
2
juozaspo at gmail dot com
13 年前
这是我实际的脚本,用于在不失真地调整图片大小以生成缩略图和/或在浏览器中显示更小的图片。

<?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 ('Unable to open image'); }

$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);

错误信息为:未定义函数 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 提到的“修正因子”。选择一些图片,最好是大图 (代码应该能够处理大约 1000 万像素的图片),也选择一些小图,以及一些中等大小的图片。将他们的文件名添加到 $images 数组中,然后在浏览器中加载脚本。

<?php

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

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

function
format_size($size) {
if (
$size < 1024) {
return
$size . ' 字节';
}
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() 函数加载图片所需的内存取决于图片的尺寸和位深,并乘以一个开销。
它可以从以下公式计算:
字节数 = 宽度 * 高度 * 每像素字节数 * 开销修正因子
其中,每像素字节数 = 位深/8,或每通道位数 * 通道数 / 8。
该脚本通过加载不同尺寸的图片来计算开销修正因子。
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
'平均修正因子: ' . (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
18 年前
估计 ImageCreateFromJPEG 所需的内存

我最初以为 width*height*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 文件。

变化
我创建了一个新的幻灯片脚本,支持全屏显示。我以前的中等尺寸版本只有大约 600 像素宽,这会导致他们在拉伸到现代屏幕尺寸后看起来很糟糕。
--> 我创建了一个小脚本,打开所有原始图片,并保存比以前更大的中等尺寸版本。

问题
由于某种原因,大约 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
13 年前
如果你在文件名中包含空格,并且使用本地 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() 时崩溃了 - 这是真的,我花了很长时间才找到错误 - 但不仅仅是佳能 PowerShot S70,佳能 PowerShot A400 也让 PHP (5.1.2) 崩溃,没有任何机会捕获它!

所以,我使用以下检查来排除所有佳能 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 年前
对于所有遇到以下错误消息的用户:
CreateImageFromJpeg() 在此 PHP 版本中不受支持
首先,在你的 ./configure 选项中添加 --with-jpeg-dir,因为我忽略了它(不知道需要它),然后我花了 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

我的解决方案旨在解决你的 Web 主机限制内存使用的情况;在这种情况下,ini_set 当然不起作用(即使对于在典型 PHP 安装中具有 'PHP_INI_ALL' 标志的变量)。

祝你愉快
Yaroukh
-1
nico at anvilstudios dot co dot za
13 年前
我在 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
19 年前
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