PHP 日本大会 2024

image_type_to_extension

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

image_type_to_extension获取图像类型的文件扩展名

描述

image_type_to_extension(int $image_type, bool $include_dot = true): string|false

返回给定IMAGETYPE_* 常量的扩展名。

参数

image_type

一个IMAGETYPE_* 常量。

include_dot

是否在扩展名前添加点。默认为true

返回值

一个包含与给定图像类型对应的扩展名的字符串,或者在失败时返回false

示例

示例 #1 image_type_to_extension() 示例

<?php
// 创建图像实例
$im = imagecreatetruecolor(100, 100);

// 保存图像
imagepng($im, './test' . image_type_to_extension(IMAGETYPE_PNG));
imagedestroy($im);
?>

注释

注意:

此函数不需要 GD 图像库。

添加注释

用户贡献注释 5 个注释

1
twitter.com/jonathansampson
2 年前
如果您想从文件名(字符串)中获取扩展名,以下方法可以帮助您避免将字符串分割成各个部分的麻烦(请务必阅读 pathinfo 的文档警告)

<?php

$filename
= "wallpaper.jpg";
$extension = pathinfo( $filename, PATHINFO_EXTENSION );

echo
$extension; // "jpg"

?>
0
Ian Paul Short chukdocsAtHotmailDotCom
18 年前
致:mail at spybreak dot de

我注意到你的解决方案适用于 mime_type_to_extension,但它有缺陷,因为 MIME 类型到扩展名的映射不是唯一的。请参阅我的示例,了解我观察到的情况。

此函数执行图像类型或 MIME 类型到扩展名的转换。受限于它不会尝试处理重复的 MIME 类型。并非完全准确!
<?php
if(!function_exists('image_type_to_extension')){

$extension;

function
image_type_or_mime_type_to_extension($image_type, $include_dot) {
define ("INVALID_IMAGETYPE", '');

$extension = INVALID_IMAGETYPE; /// 无效输入的默认返回值

$image_type_identifiers = array ( ### 这些值对应IMAGETYPE常量
array (IMAGETYPE_GIF => 'gif', "mime_type" => 'image/gif'), ### 1 = GIF
array (IMAGETYPE_JPEG => 'jpg', "mime_type" => 'image/jpeg'), ### 2 = JPG
array (IMAGETYPE_PNG => 'png', "mime_type" => 'image/png'), ### 3 = PNG
array (IMAGETYPE_SWF => 'swf', "mime_type" => 'application/x-shockwave-flash'), ### 4 = SWF // A. 重复的MIME类型
array (IMAGETYPE_PSD => 'psd', "mime_type" => 'image/psd'), ### 5 = PSD
array (IMAGETYPE_BMP => 'bmp', "mime_type" => 'image/bmp'), ### 6 = BMP
array (IMAGETYPE_TIFF_II => 'tiff', "mime_type" => 'image/tiff'), ### 7 = TIFF (intel 字节序)
array (IMAGETYPE_TIFF_MM => 'tiff', "mime_type" => 'image/tiff'), ### 8 = TIFF (motorola 字节序)
array (IMAGETYPE_JPC => 'jpc', "mime_type" => 'application/octet-stream'), ### 9 = JPC // B. 重复的MIME类型
array (IMAGETYPE_JP2 => 'jp2', "mime_type" => 'image/jp2'), ### 10 = JP2
array (IMAGETYPE_JPX => 'jpf', "mime_type" => 'application/octet-stream'), ### 11 = JPX // B. 重复的MIME类型
array (IMAGETYPE_JB2 => 'jb2', "mime_type" => 'application/octet-stream'), ### 12 = JB2 // B. 重复的MIME类型
array (IMAGETYPE_SWC => 'swc', "mime_type" => 'application/x-shockwave-flash'), ### 13 = SWC // A. 重复的MIME类型
array (IMAGETYPE_IFF => 'aiff', "mime_type" => 'image/iff'), ### 14 = IFF
array (IMAGETYPE_WBMP => 'wbmp', "mime_type" => 'image/vnd.wap.wbmp'), ### 15 = WBMP
array (IMAGETYPE_XBM => 'xbm', "mime_type" => 'image/xbm') ### 16 = XBM
);

if((
is_int($image_type)) AND (IMAGETYPE_GIF <= $image_type) AND (IMAGETYPE_XBM >= $image_type)){
$extension = $image_type_identifiers[$image_type-1]; // -1 因为$image_type_identifiers数组从[0]开始
$extension = $extension[$image_type];
}
elseif(
is_string($image_type) AND (($image_type != 'application/x-shockwave-flash') OR ($image_type != 'application/octet-stream'))){

$extension = match_mime_type_to_extension($image_type, $image_type_identifiers);
}
else
{
$extension = INVALID_IMAGETYPE;
}

if(
is_bool($include_dot)){

if((
false != $include_dot) AND (INVALID_IMAGETYPE != $extension)){
$extension = '.' . $extension;
}
}
else
{
$extension = INVALID_IMAGETYPE;
}

return
$extension;

}
}

function
match_mime_type_to_extension($image_type, $image_type_identifiers){
// 匹配时退出循环
foreach($image_type_identifiers as $_key_outer_loop => $_val_outer_loop){
foreach(
$_val_outer_loop as $_key => $_val){
if(
is_int ($_key)){ // 记录扩展名以进行mime检查
$extension = $_val;
}
if(
$_key == 'mime_type'){
if(
$_val === $image_type){ // 找到匹配项,无需继续循环
return $extension; ### 返回
}
}
}
}
// 比较所有值,没有匹配项
return $extension = INVALID_IMAGETYPE;
}

$extension = image_type_or_mime_type_to_extension($image_type, $include_dot);
return
$extension;
}
?>
-1
ergunadem5508 at gmail dot com
3年前
// 如果你只想从文件路径名中查找格式,而无需创建任何图像

// 图片路径名
$image_name = "image name.png";

// 最后一点之后自然就是格式。
$dots = explode(".",$image_name);

// 我们将$dots的最后数据赋值给变量$type。
$type = $dots[(count($dots)-1)];

// 输出将不带点。
echo "without dot : ".$type;

// 带点的
$type = ".".$type;
echo "dotted : ".$type;
-1
aleksandrs dot bogdanovs at gmail dot com
18 年前
当我为我的照片网站编写脚本时,需要编写这样一个函数,它可以获取上传文件(图像)的扩展名,所以这个函数是

<?php
function get_extension($imagetype)
{
if(empty(
$imagetype)) return false;
switch(
$imagetype)
{
case
'image/bmp': return '.bmp';
case
'image/cis-cod': return '.cod';
case
'image/gif': return '.gif';
case
'image/ief': return '.ief';
case
'image/jpeg': return '.jpg';
case
'image/pipeg': return '.jfif';
case
'image/tiff': return '.tif';
case
'image/x-cmu-raster': return '.ras';
case
'image/x-cmx': return '.cmx';
case
'image/x-icon': return '.ico';
case
'image/x-portable-anymap': return '.pnm';
case
'image/x-portable-bitmap': return '.pbm';
case
'image/x-portable-graymap': return '.pgm';
case
'image/x-portable-pixmap': return '.ppm';
case
'image/x-rgb': return '.rgb';
case
'image/x-xbitmap': return '.xbm';
case
'image/x-xpixmap': return '.xpm';
case
'image/x-xwindowdump': return '.xwd';
case
'image/png': return '.png';
case
'image/x-jps': return '.jps';
case
'image/x-freehand': return '.fh';
default: return
false;
}
}
?>

这对在服务器上上传文件的用户很有用。
-1
Ian Paul Short chukdocsAtHotmailDotCom
18 年前
2006-09-29

关于此页面上的一些贡献,有一些说明。

1.在我看来,所有模拟“image_type_to_extension”函数的方案都或多或少地达不到目标(参见我下面的评论)。这就是为什么我编写了自己的函数并提交到此页面下方的原因。关于我的工作,任何评论、发现的错误或改进都将不胜感激。

2.避免以非常规的方式使用Switch语句来“Break”(我注意到使用了return语句!)。即使在代码的初始阶段它什么也不做——仍然要加上default case(它让其他人意识到不需要default case,或者最坏的情况是忘记了它)。

3.在受你控制的环境中,通过扩展名或MIME类型确定内容的风险似乎是解决问题的有吸引力的方案。但是,在现实世界中,不能保证MIME类型或文件扩展名与其关联的文件正确。

考虑使用函数来获取图像类型
getimagesize 或(无需GD即可使用)
exif_imagetype

4.编码不仅仅是把东西组合在一起完成工作!!!但是无论做什么都是值得的——因此脏话在这个论坛里没有位置!!

5.“oridan at hotmail dot com” 的想法非常巧妙。我将仔细研究这个想法,用于我自己的项目。
To Top