2024 年 PHP 日本大会

getimagesize

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

getimagesize获取图像大小

描述

getimagesize(string $filename, array &$image_info = null): array|false

getimagesize() 函数将确定任何支持的给定图像文件的大小,并返回尺寸以及文件类型和一个 height/width 文本字符串,该字符串可用于普通的 HTML IMG 标签和相应的 HTTP 内容类型。

getimagesize() 还可以返回 image_info 参数中的一些更多信息。

警告

此函数期望 filename 为有效的图像文件。如果提供非图像文件,则可能会将其错误地检测为图像,并且函数将成功返回,但数组可能包含无意义的值。

不要使用 getimagesize() 来检查给定文件是否为有效的图像。请改用专用解决方案,例如 Fileinfo 扩展。

注意 请注意,JPC 和 JP2 能够拥有具有不同位深度的组件。在这种情况下,“bits”的值是遇到的最高位深度。此外,JP2 文件可能包含 多个 JPEG 2000 码流。在这种情况下,getimagesize() 返回在文件根目录中遇到的第一个码流的值。

注意 图标信息是从具有最高比特率的图标中检索的。

注意 GIF 图像由一个或多个帧组成,每个帧可能只占据图像的一部分。 getimagesize() 报告的图像大小是总大小(从逻辑屏幕描述符读取)。

参数

filename

此参数指定您希望检索其信息的的文件。它可以引用本地文件或(允许配置的情况下)使用 支持的流 之一来引用远程文件。

image_info

此可选参数允许您从图像文件中提取一些扩展信息。目前,这将返回不同的 JPG APP 标记作为关联数组。某些程序使用这些 APP 标记将文本信息嵌入图像中。一个非常常见的是将 » IPTC 信息嵌入 APP13 标记中。您可以使用 iptcparse() 函数将二进制 APP13 标记解析为可读的内容。

注意:

image_info 仅支持 JFIF 文件。

返回值

返回一个最多包含 7 个元素的数组。并非所有图像类型都包含 channelsbits 元素。

索引 0 和 1 分别包含图像的宽度和高度。

注意:

某些格式可能不包含图像或可能包含多个图像。在这些情况下,getimagesize() 可能无法正确确定图像大小。getimagesize() 在这些情况下将返回宽度和高度为零。

索引 2 是指示图像类型的IMAGETYPE_* 常量之一。

索引 3 是一个文本字符串,其中包含正确的 height="yyy" width="xxx" 字符串,可以直接在 IMG 标签中使用。

mime 是图像的相应 MIME 类型。此信息可用于使用正确的 HTTP Content-type 标头传送图像

示例 #1 getimagesize() 和 MIME 类型

<?php
$size
= getimagesize($filename);
$fp = fopen($filename, "rb");
if (
$size && $fp) {
header("Content-type: {$size['mime']}");
fpassthru($fp);
exit;
} else {
// 错误
}
?>

channels 对于 RGB 图片为 3,对于 CMYK 图片为 4。

bits 是每种颜色的位数。

对于某些图像类型,channelsbits 值的存在可能会有些混乱。例如,GIF 始终每个像素使用 3 个通道,但对于具有全局调色板的动画 GIF,无法计算每个像素的位数。

失败时,返回 false

错误/异常

如果无法访问 filename 图像,getimagesize() 将生成级别为 E_WARNING 的错误。读取错误时,getimagesize() 将生成级别为 E_NOTICE 的错误。

变更日志

版本 描述
8.2.0 现在返回 AVIF 图像的实际图像尺寸、位数和通道;以前,尺寸报告为 0x0,并且根本没有报告位数和通道。
7.1.0 添加了 WebP 支持。

示例

示例 #2 getimagesize() 示例

<?php
list($width, $height, $type, $attr) = getimagesize("img/flag.jpg");
echo
"<img src=\"img/flag.jpg\" $attr alt=\"getimagesize() example\" />";
?>

示例 #3 getimagesize (URL)

<?php
$size
= getimagesize("http://www.example.com/gifs/logo.gif");

// 如果文件名包含空格,请正确编码它
$size = getimagesize("http://www.example.com/gifs/lo%20go.gif");

?>

示例 #4 getimagesize() 返回 IPTC 数据

<?php
$size
= getimagesize("testimg.jpg", $info);
if (isset(
$info["APP13"])) {
$iptc = iptcparse($info["APP13"]);
var_dump($iptc);
}
?>

备注

注意:

此函数不需要 GD 图像库。

参见

添加备注

用户贡献的备注 24 条备注

james dot relyea at zifiniti dot com
15 年前
如下所述,getimagesize 会在检查所需信息之前下载整个图像。对于远程访问的大型图像,这极其缓慢。由于宽度/高度位于文件的开头几字节,因此无需下载整个文件。我编写了一个函数,通过流式传输字节直到找到适当的数据来报告宽度和高度,从而获取 JPEG 的大小。

<?php
// 获取 JPEG 宽度和高度,无需下载/读取整个图像。
function getjpegsize($img_loc) {
$handle = fopen($img_loc, "rb") or die("无效的文件流。");
$new_block = NULL;
if(!
feof($handle)) {
$new_block = fread($handle, 32);
$i = 0;
if(
$new_block[$i]=="\xFF" && $new_block[$i+1]=="\xD8" && $new_block[$i+2]=="\xFF" && $new_block[$i+3]=="\xE0") {
$i += 4;
if(
$new_block[$i+2]=="\x4A" && $new_block[$i+3]=="\x46" && $new_block[$i+4]=="\x49" && $new_block[$i+5]=="\x46" && $new_block[$i+6]=="\x00") {
// 读取块大小并跳过前面部分,开始循环遍历块以搜索 SOF 标记
$block_size = unpack("H*", $new_block[$i] . $new_block[$i+1]);
$block_size = hexdec($block_size[1]);
while(!
feof($handle)) {
$i += $block_size;
$new_block .= fread($handle, $block_size);
if(
$new_block[$i]=="\xFF") {
// 检测到新块,检查 SOF 标记
$sof_marker = array("\xC0", "\xC1", "\xC2", "\xC3", "\xC5", "\xC6", "\xC7", "\xC8", "\xC9", "\xCA", "\xCB", "\xCD", "\xCE", "\xCF");
if(
in_array($new_block[$i+1], $sof_marker)) {
// 检测到 SOF 标记。宽度和高度信息包含在此字节后的 4-7 个字节中。
$size_data = $new_block[$i+2] . $new_block[$i+3] . $new_block[$i+4] . $new_block[$i+5] . $new_block[$i+6] . $new_block[$i+7] . $new_block[$i+8];
$unpacked = unpack("H*", $size_data);
$unpacked = $unpacked[1];
$height = hexdec($unpacked[6] . $unpacked[7] . $unpacked[8] . $unpacked[9]);
$width = hexdec($unpacked[10] . $unpacked[11] . $unpacked[12] . $unpacked[13]);
return array(
$width, $height);
} else {
// 跳过块标记并读取块大小
$i += 2;
$block_size = unpack("H*", $new_block[$i] . $new_block[$i+1]);
$block_size = hexdec($block_size[1]);
}
} else {
return
FALSE;
}
}
}
}
return
FALSE;
}
?>
nikolam3244 at gmail dot com
6 年前
有一个代码片段可以通过仅获取文件的开头几个字节来获取 JPEG 图片的尺寸,但是它不适用于 PNG 文件,所以我编写了一个。它只会下载前 24 个字节而不是整个图像,因此比 getimagesize() 快得多,同时也会节省带宽。

<?php
// 获取PNG图片的宽和高,无需下载或读取整个图片。
function getpngsize( $img_loc ) {
$handle = fopen( $img_loc, "rb" ) or die( "无效的文件流。" );

if ( !
feof( $handle ) ) {
$new_block = fread( $handle, 24 );
if (
$new_block[0] == "\x89" &&
$new_block[1] == "\x50" &&
$new_block[2] == "\x4E" &&
$new_block[3] == "\x47" &&
$new_block[4] == "\x0D" &&
$new_block[5] == "\x0A" &&
$new_block[6] == "\x1A" &&
$new_block[7] == "\x0A" ) {
if (
$new_block[12] . $new_block[13] . $new_block[14] . $new_block[15] === "\x49\x48\x44\x52" ) {
$width = unpack( 'H*', $new_block[16] . $new_block[17] . $new_block[18] . $new_block[19] );
$width = hexdec( $width[1] );
$height = unpack( 'H*', $new_block[20] . $new_block[21] . $new_block[22] . $new_block[23] );
$height = hexdec( $height[1] );

return array(
$width, $height );
}
}
}

return
false;
}
?>
tomasz at trejderowski dot pl
11年前
如果你想将“getimagesize()”函数返回的索引“2”的值转换为更易于理解的内容,你可以考虑使用这样的函数

$imageTypeArray = array
(
0=>'UNKNOWN',
1=>'GIF',
2=>'JPEG',
3=>'PNG',
4=>'SWF',
5=>'PSD',
6=>'BMP',
7=>'TIFF_II',
8=>'TIFF_MM',
9=>'JPC',
10=>'JP2',
11=>'JPX',
12=>'JB2',
13=>'SWC',
14=>'IFF',
15=>'WBMP',
16=>'XBM',
17=>'ICO',
18=>'COUNT'
);

$size = getimagesize($filename);

$size[2] = $imageTypeArray[$size[2]];

或者类似的方法。
php dot net at dannysauer dot com
19年前
注意,如果你想成为一名优秀的程序员并使用命名常量(IMAGETYPE_JPEG)而不是它们的值(2),你应该使用IMAGETYPE变量——IMAGETYPE_JPEG、IMAGETYPE_GIF、IMAGETYPE_PNG等。出于某种原因,有人做了一个糟糕的决定,在我的PHP版本中,IMG_PNG实际上是4,而IMAGETYPE_PNG是3。我花了一段时间才弄清楚为什么将类型与IMG_PNG进行比较会失败……
simon dot waters at surevine dot com
9年前
注意:getimage size不会尝试验证图像文件格式。

格式错误的GIF图像可能包含PHP代码,但仍然具有有效的尺寸。

程序员需要确保使用其他工具验证此类图像,或者永远不要将其视为PHP或其他可执行类型(强制执行适当的扩展名,避免用户控制重命名,将上传的图像限制在未启用PHP的网站区域)。

http://ha.ckers.org/blog/20070604/passing-malicious-php-through-getimagesize/
redcore at gmail dot com
17年前
在尝试上传到服务器或数据库时,检查图像尺寸始终是一个好习惯……尤其是在将其显示在不适应特定尺寸以外的图像的页面上时。

<?php

$tmpName
= $_FILES['userfile']['tmp_name'];

list(
$width, $height, $type, $attr) = getimagesize($tmpName);

if(
$width>275 || $height>275)
{
die(
"超过了图像尺寸限制。" );
}

?>
utilmind
13年前
这是一个确定PNG图像是否包含alpha通道的函数

<?php
function is_alpha_png($fn){
return (
ord(@file_get_contents($fn, NULL, NULL, 25, 1)) == 6);
}
?>

PNG图像的颜色类型存储在字节偏移量25处。第25个字节的可能值为:
* 0 - 灰度
* 2 - RGB
* 3 - 带调色板的RGB
* 4 - 灰度 + alpha
* 6 - RGB + alpha
info at alex-lawrence dot com
16年前
可能有用(不知道该发在哪里)

function getImageErrors( $filename, $type = "", $minWidth = 0, $minHeight = 0, $maxWidth = 0, $maxHeight = 0, $maxFileSize = 0 )
{
$errors = array();
if ( file_exists( $filename ) )
{
$ending = substr( $filename, strpos( $filename, "." ) );
if ( is_array( $type ) )
{
$isTypeOf = false;
foreach( $type as $eachtype )
{
if ( $ending == $eachtype )
{
$isTypeOf = true;
}
}
if ( ! $isTypeOf )
{
$errors[ 'type' ] = $ending;
}
}
elseif ( $type != "" )
{
if ( $ending != $type )
{
$errors[ 'type' ] = $ending;
}
}
$size = getimagesize( $filename );
if ( $size[ 0 ] < $minWidth )
{
$errors[ 'minWidth' ] = $size[ 0 ];
}
if ( $size[ 1 ] < $minHeight )
{
$errors[ 'minHeight' ] = $size[ 1 ];
}
if ( ( $maxWidth > $minWidth ) && ( $size[ 0 ] > $maxWidth ) )
{
$errors[ 'maxWidth' ] = $size[ 0 ];
}
if ( ( $maxHeight > $minHeight ) && ( $size[ 1 ] > $maxHeight ) )
{
$errors[ 'maxHeight' ] = $size[ 1 ];
}
if ( ( $maxFileSize > 0 ) && ( filesize( $filename ) > $maxFileSize ) )
{
$errors[ 'maxFileSize' ] = filesize( $filename );
}
}
else
{
$errors[ 'filename' ] = "文件不存在";
}
return ( count( $errors ) > 0 ? $errors : null );
}
Steve
13年前
定义的IMAGETYPE常量的列表在exif_imagetype的手册页面上

https://php.net/manual/en/function.exif-imagetype.php
shmohel at gmail dot com
16年前
与其编写一个冗长的函数,该函数基本上运行两次(一次作为宽度,一次作为高度),不如使用一个有用的函数,该函数使用变量变量来设置最大高度/宽度。希望有人觉得这个有用。

function scaleimage($location, $maxw=NULL, $maxh=NULL){
$img = @getimagesize($location);
if($img){
$w = $img[0];
$h = $img[1];

$dim = array('w','h');
foreach($dim AS $val){
$max = "max{$val}";
if(${$val} > ${$max} && ${$max}){
$alt = ($val == 'w') ? 'h' : 'w';
$ratio = ${$alt} / ${$val};
${$val} = ${$max};
${$alt} = ${$val} * $ratio;
}
}

return("<img src='{$location}' alt='image' width='{$w}' height='{$h}' />");
}
}
info at personalmis dot com
16年前
似乎人们尝试按比例缩放图像(向上或向下)的各种方法,如果记住代数,可能会更直接。

公式是y = mx,其中m是直线的斜率。这是y:x的比率,或m = y/x。

所以如果……

// x和y的最大值
$y_max = 600;
$x_max = 800;

// 图片尺寸
$y1 = 2000;
$x1 = 3000;

// 使用宽度进行缩放
if ($x1 > $x_max)
{
// 查找斜率
$m = $y1/$x1;
// 将x边设置为最大值
$x2 = $x_max;
// 将y边设置为比例大小
$y2 = $m * $x1;
}

新的按比例缩放的图像将是x2 = 800,y2 = 533(四舍五入)。

要从y边进行操作,只需反转x和y即可。
geoff at spacevs dot com
15 年前
此函数从字符串中返回 JPEG 图片的宽度和高度,允许在不先将图片写入磁盘或使用速度较慢的“imagecreatefromstring”的情况下检索存储在数据库中的图片尺寸。

<?PHP
function getJPEGImageXY($data) {
$soi = unpack('nmagic/nmarker', $data);
if (
$soi['magic'] != 0xFFD8) return false;
$marker = $soi['marker'];
$data = substr($data, 4);
$done = false;

while(
1) {
if (
strlen($data) === 0) return false;
switch(
$marker) {
case
0xFFC0:
$info = unpack('nlength/Cprecision/nY/nX', $data);
return array(
$info['X'], $info['Y']);
break;

default:
$info = unpack('nlength', $data);
$data = substr($data, $info['length']);
$info = unpack('nmarker', $data);
$marker = $info['marker'];
$data = substr($data, 2);
break;
}
}
}
?>

执行 10,000 次耗时 0.43 秒,而使用 imagecreatefromstring/imagesx/imagesy 执行相同操作则需要大约 1.52 秒。

处理文件时不要用它代替 getimagesize,getimagesize 速度快得多,仅需 0.15 秒。
cloned at clonedmadman dot com
16年前
我在编写一个上传时调整图片大小的脚本,但是,我正在制作一个多文件上传器,因此遇到一个问题:一种有效的方法来获取图片的高度和宽度并将它们存储在一个数组中以便稍后调整大小。这就是我想出的方法

<?php
$links
= array("test1.jpg", "test2.png");
$sizearray = array();
$count = count($links);
for(
$i = 0; $i < $count; $i++) {
$size = getimagesize($links[$i]);
list(
$width, $height) = $size;
$sizearray[$links[$i]] = array("width" => $width, "height" => $height);
}
print_r($sizearray);
// 输出结果:Array ( [test1.jpg] => Array ( [width] => 300 [height] => 400 ) [test2.png] => Array ( [width] => 680 [height] => 100 ) )
?>
diablx at hotmail dot com
20 年前
对于其他脚本,我很抱歉,但我犯了一个关于图像大小调整的错误……这是一个可运行的脚本!
<?
// 一些配置变量!
$maxWidth = 90;
$maxHeight = 90;
$maxCols = 8;
$webDir = "https://127.0.0.1/images/";
$localDir = $_SERVER['DOCUMENT_ROOT']."/images/";

$AutorisedImageType = array ("jpg", "jpeg", "gif", "png");
?>

<center>
<table border='1' cellspacing='5' cellpadding='5' style="border-collapse:collapse; border-style: dotted">
<tr>
<?
// 打开 localDir
$dh = opendir($localDir);
while (false !== ($filename = readdir($dh))) {
$filesArray[] = $filename;
}

// 显示和调整大小
foreach ($filesArray as $images) {

$ext = substr($images, strpos($images, ".")+1, strlen($images));

if( in_array($ext, $AutorisedImageType) ) {

list($width, $height, $type, $attr) = @getimagesize( $localDir.$images );

$xRatio = $maxWidth / $width;
$yRatio = $maxHeight / $height;

if ( ($width <= $maxWidth) && ($height <= $maxHeight) ) {
$newWidth = $width;
$newHeight = $height;
}
else if (($xRatio * $height) < $maxHeight) {
$newHeight = ceil($xRatio * $height);
$newWidth = $maxWidth;
}
else {
$newWidth = ceil($yRatio * $width);
$newHeight = $maxHeight;
}

if($i == $maxCols) {
echo "</tr><tr>";
$i = 0;
}
echo "<td align='center' valign='middle' width='$maxWidth' height='$maxHeight'><img src='".$webDir.$images."' width='$newWidth' height='$newHeight'></td>";
$i++;
}
}
?>
</tr>
</table>
</center>
kazuya
10 年前
我创建了函数 img_resize($path,$tmp_name,$new_name,$new_width)
这可能很有用。

<?php

$new_file
= img_resize("./img/", "test.jpg","copy_test.jpg",300);
echo
"<IMG src = '$new_file'>";

function
img_resize($path,$tmp_name,$new_name,$new_width){
if (!
file_exists($path.$filename)){
echo
"file not found!";
exit;
}
if (!
is_writable($path)){
echo
"error:permission denied!";
exit;
}
list(
$width, $height) = getimagesize($path . $tmp_name);
$new_height = abs($new_width * $height / $width);
$image_p = imagecreatetruecolor($new_width, $new_height);
$image = imagecreatefromjpeg($path . $tmp_name);
imagecopyresampled($image_p, $image, 0, 0, 0, 0,
$new_width, $new_height, $width, $height);
imagejpeg($image_p, $path . $new_name);
return
$path.$new_name;
}

?>
alexyam at live dot com
12 年前
我想对存储在数据库中作为 blob 数据的 .SWF 文件使用 getimagesize(),但找不到简单的解决方案,所以我创建了自己的解决方案。

我正在根据 MIT 许可证发布此代码,以节省大家的时间

<?php
/*
----------------------------------------------------------------------
PHP Blob 数据作为文件流 v1.0 (C) 2012 Alex Yam <[email protected]>
本代码采用 MIT 许可证发布。
----------------------------------------------------------------------
[摘要]

一个简单的 PHP 类,用于使用流包装器将 blob 数据作为文件读取和写入。

特别适用于运行 getimagesize() 以获取存储在数据库中作为 blob 数据的 .SWF Flash 文件的宽度和高度。

已在 PHP 5.3.10 上测试。

----------------------------------------------------------------------
[使用方法示例]

//包含
include('./blob_data_as_file_stream.php');

//注册流包装器
stream_wrapper_register("BlobDataAsFileStream", "blob_data_as_file_stream");

//从 Adobe 网站获取 .SWF 文件并将其存储到变量中。
//用您自己的从数据库获取 swf blob 数据的代码替换此代码。
$swf_url = 'http://www.adobe.com/swf/software/flash/about/flashAbout_info_small.swf';
$swf_blob_data = file_get_contents($swf_url);

//将 $swf_blob_data 存储到数据流
blob_data_as_file_stream::$blob_data_stream = $swf_blob_data;

//在数据流上运行 getimagesize()
$swf_info = getimagesize('BlobDataAsFileStream://');
var_dump($swf_info);

----------------------------------------------------------------------
[使用方法输出]

array(5) {
[0]=>
int(159)
[1]=>
int(91)
[2]=>
int(13)
[3]=>
string(23) "width="159" height="91""
["mime"]=>
string(29) "application/x-shockwave-flash"
}

*/

class blob_data_as_file_stream {

private static
$blob_data_position = 0;
public static
$blob_data_stream = '';

public static function
stream_open($path,$mode,$options,&$opened_path){
static::
$blob_data_position = 0;
return
true;
}

public static function
stream_seek($seek_offset,$seek_whence){
$blob_data_length = strlen(static::$blob_data_stream);
switch (
$seek_whence) {
case
SEEK_SET:
$new_blob_data_position = $seek_offset;
break;
case
SEEK_CUR:
$new_blob_data_position = static::$blob_data_position+$seek_offset;
break;
case
SEEK_END:
$new_blob_data_position = $blob_data_length+$seek_offset;
break;
default:
return
false;
}
if ((
$new_blob_data_position >= 0) AND ($new_blob_data_position <= $blob_data_length)){
static::
$blob_data_position = $new_blob_data_position;
return
true;
}else{
return
false;
}
}

public static function
stream_tell(){
return static::
$blob_data_position;
}

public static function
stream_read($read_buffer_size){
$read_data = substr(static::$blob_data_stream,static::$blob_data_position,$read_buffer_size);
static::
$blob_data_position += strlen($read_data);
return
$read_data;
}

public static function
stream_write($write_data){
$write_data_length=strlen($write_data);
static::
$blob_data_stream = substr(static::$blob_data_stream,0,static::$blob_data_position).
$write_data.substr(static::$blob_data_stream,static::$blob_data_position+=$write_data_length);
return
$write_data_length;
}

public static function
stream_eof(){
return static::
$blob_data_position >= strlen(static::$blob_data_stream);
}

}
?>
classixshop.com 的 ajreading
19年前
我编写的一小段代码,用于将图像按比例调整到最大高度和宽度,然后显示它。

<?php
// 最大高度和宽度
$max_width = 100;
$max_height = 100;

// JPEG 文件路径

$upfile '/path/to/file.jpg';
Header("Content-type: image/jpeg");

$size = GetImageSize($upfile); // 读取大小
$width = $size[0];
$height = $size[1];

// 将图像按比例调整到上面指定的最大大小

$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;
}
// 增加内存限制以支持更大的文件

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

// 创建新图像!
$src = ImageCreateFromJpeg($upfile);
$dst = ImageCreateTrueColor($tn_width, $tn_height);
ImageCopyResized($dst, $src, 0, 0, 0, 0, $tn_width, $tn_height, $width, $height);
ImageJpeg($dst);
// 销毁图像
ImageDestroy($src);
ImageDestroy($dst);
?>
gmail.com 的 freecorvette
7 年前
对于某些图像,如果不使用第二个参数使用 getimagesize() 将返回正确的信息,但是当添加第二个参数时,它将返回 false。这很可能是一个错误(并且已经如此报告),但与此同时,如果您遇到此问题,一个解决方法是使用 exif_read_data()。
Jesus Zamora
13年前
返回一个包含 4 个元素的数组。
索引 0 是图像的宽度(以像素为单位)。
索引 1 是图像的高度(以像素为单位)。
索引 2 是图像类型的标志

1 = GIF,2 = JPG,3 = PNG,4 = SWF,5 = PSD,6 = BMP,7 = TIFF(Intel 字节序),8 = TIFF(Motorola 字节序),9 = JPC,10 = JP2,11 = JPX,12 = JB2,13 = SWC,14 = IFF,15 = WBMP,16 = XBM。

索引 3 包含 ' height="yyy" width="xxx" '
匿名用户
16年前
请注意,如果您指定远程文件(通过 URL)来检查其大小,PHP 将首先将远程文件下载到您的服务器。

如果您使用此函数来检查用户提供的图像链接的大小,这可能会构成安全风险。恶意用户可能链接到非常大的图像文件并导致 PHP 下载它。我不知道是否已设置任何文件大小限制。但是假设用户提供了一个指向大小为几 GB 的图像的链接呢?

如果有一种方法可以限制此函数执行的下载大小就好了。希望已经有一个带有某些合理限制的默认设置。
soylentgreens.com 的 mail
19年前
关于裁剪图像,试试这个……

<?php

$imgfile
= "img.jpg";
$cropStartX = 300;
$cropStartY = 250;
$cropW = 200;
$cropH = 200;

// 创建两个图像
$origimg = imagecreatefromjpeg($imgfile);
$cropimg = imagecreatetruecolor($cropW,$cropH);

// 获取原始尺寸
list($width, $height) = getimagesize($imgfile);

// 裁剪
imagecopyresized($cropimg, $origimg, 0, 0, $cropStartX, $cropStartY, $width, $height, $width, $height);

// TODO: 编写代码以保存新图像
// 或者,像这样显示它:
header("Content-type: image/jpeg");
imagejpeg($cropimg);

// 销毁图像
imagedestroy($cropimg);
imagedestroy($origimg);

?>
user at example dot net
16年前
验证图像时,务必同时检查图像类型*和*文件扩展名!

因为大多数图像类型允许包含注释或其他无关数据的区域。这些区域可用于将PHP代码注入服务器。如果这些文件按客户端发送的方式存储,则具有“.php”扩展名的文件可以被执行并造成巨大损害。
pfarthing at hotmail dot com
16年前
更正:要查找$y2,应该是……

// 将y边设置为比例大小
$y2 = $m * $x_max; // 不是 $x1

谢谢Norbert =)
Coodiss at w3bbix dot net
19年前
这是一个将图像缩放至其所在<td>的简单方法
*此代码已分解,以便任何人都能理解它 :)

<?
$imageinfo = getimagesize("images/picture.jpg");

$ix=$imageinfo[0];
$iy=$imageinfo[1];

$widthscale = $ix/175; //<TD> 宽度
$heightscale = $iy/175; //<TD> 高度

if($widthscale < 1)
$nwidth = $ix*$widthscale;
else
$nwidth = $ix/$widthscale;

if($heightscale < 1)
$nheight = $iy*$heightscale;
else
$nheight = $iy/$heightscale;

?>
To Top