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, '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 个注释

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;
}
?>
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;
}
?>
[email protected]
18年前
如果imagecreatefromjpeg()失败并显示“PHP Fatal error: Call to undefined function: imagecreatefromjpeg()”,这并不一定意味着你没有安装GD。

如果phpinfo()显示GD,但没有JPEG支持,那么这就是问题所在。你可能会认为--with-gd会做正确的事情,因为它确实检查了libjpeg的存在(并找到了它)并将该功能添加到GD中,但在v4.4.4中,至少在RHEL v2.1、RHEL v3、CentOS v2.1或CentOS v4.3上并非如此。

在这些平台上,*重要的是* --with-jpeg-dir要在--with-gd*之前*。如果不是,GD将不会构建JPEG支持,就像从未指定过--with-jpeg-dir一样……
[email protected]
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也有一些其他有用的选项……
Karolis Tamutis [email protected]
18年前
除了[email protected]的评论。

似乎即使是小的图像也可能很快耗尽你的默认内存限制。配置值'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');

}

?>
[email protected]
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");

?>
[email protected]
7年前
警告:imagecreatefromjpeg() [function.imagecreatefromjpeg]:'image.jpg' 不是有效的 JPEG 文件

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

要修复,请尝试以下代码片段 -

<?php
...
$image = @ImageCreateFromJpeg($image_name);
if (!
$image)
{
$image= imagecreatefromstring(file_get_contents($image_name));
}
...
?>
[email protected]
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;
}
}
[email protected]
17年前
我在 CentOS 4.x 中发现了一个错误,虽然之前已经解决了,但就错误的本质而言,这里似乎没有直接解决。

如果您在 CentOS 4.4 上遇到此函数无法正常工作的问题(可能在更早的版本中出现),并且收到此错误

Call to undefined function 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 分钟试图解决这个问题,仅仅因为我之前忘记清理自己。
[email protected]
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;
}
}
?>

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,
};
}
?>
info at daleconsulting dot com dot au
18年前
在Angel Leon的一篇帖子中,给出了一个使用imagecreatefromjpeg生成缩略图库的示例脚本。我对php脚本比较陌生,但我发现如果行没有“填满”图像,该脚本不会显示缩略图的表格。例如,如果文件夹中有5个图像,并且脚本在表格中指定了3行,则页面只会显示第一行的缩略图,并且只会显示三个图像。我发现,如果使用此等式指定变量行,则表格将正确显示

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

(这是createThumbTable函数的第一行。)
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);
}

?>
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)

干杯!
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);
dmhouse at gmail dot com
17年前
对于一个允许你计算Karolis和Yaroukh下面讨论的“fudge factor”(修正因子)的脚本,请尝试以下操作。获取一些图像,最好是一些大图像(脚本应该能够处理最多1000万像素左右的图像),一些小图像,以及一些介于两者之间的图像。将它们的文件名添加到$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()加载图像所需的内存是图像尺寸和图像位深度的函数,乘以一个开销。
它可以通过以下公式计算:
字节数 = 宽度 * 高度 * 每像素字节数 * 开销修正因子
其中每像素字节数 = 位深度/8,或每通道位数 * 通道数 / 8。
此脚本通过加载各种尺寸的图像来计算开销修正因子。
INTRO;

echo
"\n\n";

echo
'Limit: ' . ini_get('memory_limit') . "\n";
echo
'Usage before: ' . 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('Loading image %s, size %s * %s, bpp %s... ',
$image, $info[0], $info[1], $info['bits']);
$im = imagecreatefromjpeg($image);
$mem = memory_get_usage();
echo
'done' . "\n";
echo
'Memory usage: ' . format_size($mem) . "\n";
echo
'Difference: ' . format_size($mem - $start_mem) . "\n";
$ff = (($mem - $start_mem) /
(
$info[0] * $info[1] * ($info['bits'] / 8) * $info['channels']));
$ffs[] = $ff;
echo
'Difference / (Width * Height * Bytes per pixel): ' . $ff . "\n";
imagedestroy($im);
$start_mem = memory_get_usage();
echo
'Destroyed. Memory usage: ' . format_size($start_mem) . "\n";

echo
"\n";
}

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

?>
匿名用户
18年前
关于e dot a dot schultz at gmail dot com的帖子

我尝试了这个脚本(以及后来发布的错误修复),但仍然遇到了内存问题。大多数情况下,即使它似乎计算正确,内存仍然不足以上传大图像。所以这对我的帮助很大

$newLimit = $newLimit+3000000;(在传递给ini_set()函数之前)。

非常简单,可能不是最好的解决方案,但现在可以用了(你当然可以给它少于额外3MB,只需尝试一下对你来说有效的)。
yaroukh at gmail dot com
19年前
估计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'),你可以避免上述结局。(然而,不会有太多图像被阻止处理,而这些图像仍然适合内存,因为结果非常准确。)
ben dot lancaster at design-ontap dot co dot uk
18年前
值得注意的是,所有imagecreate*函数都故意不在include_path中查找。
Jrn Berkefeld
13年前
我遇到了一个非常奇怪的行为
背景
每次用户上传图像时,原始文件都与缩略图和用于小型幻灯片的中等尺寸版本一起存储。
这意味着在上传时,所有这些原始图像都被php识别为有效的jpg

更改
我创建了一个新的幻灯片脚本,该脚本具有全屏显示功能。我旧的“中等尺寸”版本只有大约600像素宽,这导致它们在拉伸到现代屏幕尺寸后看起来都很丑。
-->我创建了一个小脚本,打开所有原始图像并保存比我以前更大的“中等尺寸”版本。

问题
由于某种原因,大约1/3的图像(不是最后三分之一,而是始终是相同的图像)现在被php标记为“...不是有效的JPEG文件...”

原因
仍然未知

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

每次本地方法失败时,脚本都会回退到通过下面提到的“LoadJPEG”脚本“从外部”加载相同的文件——非常感谢作者!
这有效,即使我谈论的是同一服务器上的完全相同的文件。唯一的区别是,一次是本地访问,另一次是通过80端口访问。

在使用此方法时,请注意相对于脚本的正确路径以及相对于域名的可能不同的路径。
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);
// 失败 警告:imagecreatefromjpeg() [function.imagecreatefromjpeg]:gd-jpeg:JPEG 库报告不可恢复的错误
?>
Christoph Ziegenberg
18年前
Matt 报告说 PHP 使用 imagecreatefromjpeg() 崩溃——这是真的,我花了很长时间才找到错误——但不仅是佳能 PowerShot S70,佳能 PowerShot A400 也让 PHP(5.1.2)崩溃,没有任何机会捕获它!

所以,我使用以下检查排除所有佳能 PowerShot 图像

function check_canonpowershot($filename)
{
如果 (strpos(file_get_contents($filename), 'Canon PowerShot') !== false)
{
return true;
}
return false;
}
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' );
}
?>
linus at flowingcreativity dot net
19年前
我正在使用 PHP 4.3.8 和兼容 GD 2.0.23,并且此函数在失败时不会返回空字符串,如所述。此行

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

输出

bool(false)

当然,除非您使用严格比较运算符来评估结果,否则这无关紧要,但我认为我应该指出这一点。
dmsales at design-monster dot com
23 年前
我只是想在这里记录一下我在其他地方发现的一些对我使用 jpeg 图像非常有帮助的东西。在使用 imagecreatefromjpeg() 时,分配新颜色可能很困难。

我找到的解决方法发布在 imagecolorallocate() 下,并规定您首先使用 imagecreate()、分配颜色,然后将 jpeg 复制到此图像中。
rodders_plonker at yahoo dot com
24 年前
对于所有遇到以下错误消息的人
CreateImageFromJpeg() not supported in this PHP build
首先在您的 ./configure 选项中添加 --with-jpeg-dir,因为我省略了它(不知道我需要它),并且我花了将近 6 个小时尝试编译以获取此选项。(RH 6.2、PHP 4.0.1pl2、Apache 1.3.12、GD 1.8.3)
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;
yaroukh at gmail dot com
18年前
你好,Karolis

我的解决方案旨在解决您的网络托管服务提供商限制内存使用的情况;在这种情况下,ini_set 当然不起作用(即使对于在典型 PHP 安装中具有“PHP_INI_ALL”标志的变量)。

祝您愉快
Yaroukh
nico at anvilstudios dot co dot za
14年前
我在 Windows 系统上遇到此函数的问题。如果文件不是 JPG,则该函数不会返回 false,而是导致错误
"imagecreatefromjpeg() : gd-jpeg : JPEG library reports unrecoverable error"。

要解决此问题,首先使用其 MIME 类型检查文件是否为 JPEG 文件,如果不是,则返回 false。
JohnBrook at pobox dot com
18年前
关于分配内存的补充说明:yaroukh 和 Karolis 在下面提供的公式中的 1.65 显然是通过实验得出的“修正因子”。我发现我必须稍微调整它才能准确预测所需的内存,否则分配仍然会失败。在我的情况下,我直接使用 1.8,到目前为止它一直有效。您的里程可能会有所不同,因此根据需要进行实验。
ceefour -at!- gauldong.net
19年前
我必须说,从源代码重新编译 PHP 并在 gd 中启用 JPEG 支持花了我一段时间才弄清楚。

在某个地方,尤其是 configure --help 应该说明,如果您想拥有 JPEG 支持,则 --with-jpeg-dir 是强制性的。即使您这样做了,也不表示您会得到它。如果配置错误,将不会输出任何错误,您只会得到“no JPEG support”。更令人困惑的是,当 JPEG 支持被禁用时,phpinfo 不会显示“JPEG Support: disabled”,而是只省略该条目,因此您甚至不会意识到有什么问题。

如果您重新编译 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 的幸运家伙……您不必经历我遇到的所有麻烦)
cs at kainaw dot com
20 年前
ImageCreateFromJPEG() 函数能够抛出 emalloc() 错误。如果发生这种情况,脚本将终止,但错误将在您的错误日志中。您应该确保在从 jpeg 文件创建大型图像之前有可用的内存。
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" );
?>
reorganisation at evo-german dot com
8 年前
不得不与这条错误消息作斗争

imagecreatefromjpeg(): gd-jpeg: JPEG library reports unrecoverable error

并发现,某些图片工具(如 GIMP)会添加有关更改的 EXIF 信息。
这些图片会导致上述问题。

使用简单的图片工具(如 Windows 画图)保存新图像,imagecreatefromjpeg 对我有效。
To Top