• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • image_type_to_extension()

    (PHP 5 >= 5.2.0, PHP 7)

    取得图像类型的文件后缀

    说明

    image_type_to_extension(int $imagetype[,bool $include_dot= TRUE]): string

    根据给定的常量IMAGETYPE_XXX返回后缀名。

    参数

    $imagetype

    IMAGETYPE_XXX系列常量之一。

    $include_dot

    是否在后缀名前加一个点。默认是TRUE

    返回值

    根据指定的图像类型返回对应的后缀名。

    范例

    image_type_to_extension()例子

    <?php
    // 创建图像实例
    $im = imagecreatetruecolor(100, 100);
    // 保存图像
    imagepng($im, './test' . image_type_to_extension(IMAGETYPE_PNG));
    imagedestroy($im);
    ?>
    

    注释

    Note:

    此函数不需要 GD 图象库。

    2006-09-29
    A few notes about some contributions on this page.
    1. It seemed to me that on the face it of all of the offerings to emulate "image_type_to_extension" function fell short of the mark in one way or another (See my comments below). That's why I wrote my own and submitted to this page below. In respect of my work any comments, bugs noted or improvements would be gratefully received.
    2. Avoid using the Switch statement in an unconventional method to "Break" (I note the use of the return statement!). Also even if it does nothing at the inception of our code - Still put in the default case (It lets others realise that a default is not required or at worst forgotton.
    3. In an environment that is under your control the risk of an error by determining the content by its extension or MIME type may seem an attractive solution to a problem. However, in the real world there's no guarantee that a MIME type or file extension is correct for it's associated file.
    Consider using functions to get the image type:
       getimagesize or (This is available without GD)
       exif_imagetype
    4. There's more to coding than just putting something together to do a job!!! But whatever is done is worthwhile - Hence expletives have no place in this forum!! 
    5. The idea from "oridan at hotmail dot com" is a very slick idea. I will be taking a closer look at this for my own project.
    To: mail at spybreak dot de
    I noted your solution was for mime_type_to_extension which is flawed because the MIME types to extensions are not unique. See my example to consider what I have observed.
    This function performs image type or mime type to extension. With limitation it will not attempt to handle duplicated MIME types. NOT DEFINITIVE!
    <?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;      /// Default return value for invalid input
          $image_type_identifiers = array (                                ### These values correspond to the IMAGETYPE constants
              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. Duplicated MIME type
              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 byte order)
              array (IMAGETYPE_TIFF_MM  => 'tiff',   "mime_type" => 'image/tiff'),            ### 8 = TIFF (motorola byte order)
              array (IMAGETYPE_JPC    => 'jpc',   "mime_type" => 'application/octet-stream'),      ### 9 = JPC // B. Duplicated MIME type
              array (IMAGETYPE_JP2    => 'jp2',   "mime_type" => 'image/jp2'),            ### 10 = JP2
              array (IMAGETYPE_JPX    => 'jpf',   "mime_type" => 'application/octet-stream'),      ### 11 = JPX // B. Duplicated MIME type
              array (IMAGETYPE_JB2    => 'jb2',   "mime_type" => 'application/octet-stream'),      ### 12 = JB2 // B. Duplicated MIME type      
              array (IMAGETYPE_SWC    => 'swc',   "mime_type" => 'application/x-shockwave-flash'),  ### 13 = SWC // A. Duplicated MIME type
              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 because $image_type_identifiers array starts at [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){
        // Return from loop on a match
        foreach($image_type_identifiers as $_key_outer_loop => $_val_outer_loop){      
          foreach($_val_outer_loop as $_key => $_val){
            if(is_int ($_key)){       // Keep record of extension for mime check
              $extension = $_val;
            } 
            if($_key == 'mime_type'){  
              if($_val === $image_type){  // Found match no need to continue looping
                return $extension;    ### Return
              }           
            }
          }
        }
        // Compared all values without match
        return $extension = INVALID_IMAGETYPE;  
      } 
      
      $extension = image_type_or_mime_type_to_extension($image_type, $include_dot);
       return $extension;
    }
    ?>
    
    When I was writing a script for my photo website, it was necessary to write such function, which can get the extension of uploaded file (image), so the function is:
    <?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;
        }
      }
    ?>
    It's useful for those, who upload files on server.
    <?php
    /**
    * Returns a COMMON extension with a dot
    */
    function gd_extension($full_path_to_image='')
    {
      $extension = 'null';
      if($image_type = exif_imagetype($full_path_to_image))
      {
        $extension = image_type_to_extension($image_type, false);
      }
      $known_replacements = array(
        'jpeg' => 'jpg',
        'tiff' => 'tif',
      );
      $extension = '.'.str_replace(array_keys($known_replacements), array_values($known_replacements), $extension);
      
      return $extension;
    }
    # Testing
    $images = glob('*');
    foreach($images as $i => $image)
    {
      $extension = gd_extension($image);
      echo "\r\n", $image, ': ', $extension;
    }
    ?>
    Sometimes, the extension is not as I expected, until I wrote this piece.
    There is no need to over complicated folks.
    <?php
    if ( !function_exists('image_type_to_extension') ) {
      function image_type_to_extension ($type, $dot = true)
      {
        $e = array ( 1 => 'gif', 'jpeg', 'png', 'swf', 'psd', 'bmp' 
          'tiff', 'tiff', 'jpc', 'jp2', 'jpf', 'jb2', 'swc',
          'aiff', 'wbmp', 'xbm');
        // We are expecting an integer.
        $type = (int)$type;
        if (!$type) {
          trigger_error( '...come up with an error here...', E_USER_NOTICE );
          return null;
        }
        if ( !isset($e[$type]) ) {
          trigger_error( '...come up with an error here...' E_USER_NOTICE );
          return null;
        }
        return ($dot ? '.' : '') . $e[$type];
      }
      
    }
    if ( !function_exists('image_type_to_mime_type') ) {
      function image_type_to_mime_type ($type)
      {
        $m = array ( 1 => 'image/gif', 'image/jpeg', 'image/png',
          'application/x-shockwave-flash', 'image/psd', 'image/bmp',
          'image/tiff', 'image/tiff', 'application/octet-stream',
          'image/jp2', 'application/octet-stream', 'application/octet-stream',
          'application/x-shockwave-flash', 'image/iff', 'image/vnd.wap.wbmp', 'image/xbm');
        // We are expecting an integer.
        $type = (int)$type;
        if (!$type) {
          trigger_error( '...come up with an error here...', E_USER_NOTICE );
          return null;
        }
        if ( !isset($m[$type]) ) {
          trigger_error( '...come up with an error here...' E_USER_NOTICE );
          return null;
        }
        return $m[$type];
      }
    }
    ?>