php识别jpg图片exif信息中Photoshop格式 类型

时间:18-12-26 栏目:问题及解决 作者:admin 评论:0 点击: 532 次

最近开发一套绣标生产管理系统,遇到一个问题就是如果用户上传的图片是除了基线(“标准”)外的格式,印刷机会认不出来。所以需要在上传时进行检测。

 

网上没有找到现成的方案,前后尝试了三种方式,最后成功解决准确识别photoshop格式类型的方法。

为了避免遇到同样问题的朋友少走弯路,特将解决方法和代码分享出来。

方法一:
/**
* 检测JPEG图片的基线优化标准
*最初的版本,只能识别是否连续模式,并且准确性有点问题
* @param $filename string 图片路径
* @return string 图片基线优化标准 FFC0=标准,FFC2=连续,0000=不支持
*/
function get_interlace_old($filename)
{

if(!file_exists($filename)) throw new Exception("no found file!");
$file = @fopen($filename,"rb");
if(!$file) throw new Exception("file refuse!");
$bin = fread($file, 2*8*50000); //只读15字节 各个不同文件类型,头信息不一样。
fclose($file);

//ffc0的几种格式
//ffc0 0011 0800 3800 3803 0122 0002 1101
//ffc0 0011 0800 3800 3803 0122 0002 1101
//ffc0 0011 0802 4f02 4f03 0122 0002 1101

//ffc2的几种格式
//ffc2 0011 0802 4f02 4f03 0111 0002 1101
//ffc2 0011 0802 4f02 4f03 0122 0002 1101

$f = implode(' ',str_split(bin2hex($bin),4));
// var_dump($f);
if(strpos($f,'ffc2 0011 080'))return 'SOF2';
if(strpos($f,'ffc0 0011 080'))return 'SOF0';
return '0000';

}

方法二:

/**
* 检测JPEG图片的基线优化标准
*   第二个版本,只能识别是否连续模式,准确性没问题(使用ImageMagick工具集的identify命令实现)
* @param $filename string 图片路径
* @return string 图片基线优化标准 FFC0=标准,FFC2=连续,0000=不支持
*/
function get_interlace2($filename)
{

if(PHP_OS=='Darwin'){
$result = `/usr/local/bin/identify -verbose $filename |grep Interlace`;//调用系统命令covert处理图片 支持dpi调整

}elseif(substr(PHP_OS,0,3)==='WIN'){

exit();
}else{
$result = `identify -verbose  $filename |grep Interlace`;
}

if(strpos($result,'Interlace: None')!==false){
return 'SOF0';
}else if(strpos($result,'Interlace: JPEG')!==false){
return 'SOF2';
}else{
return '0000';
}
}

方法三:
/**
* 检测JPEG图片的基线优化标准
* 这个版本是,识别是否连续模式,如是标准模式还能识别是否优化
* @param $filename string 图片路径
* @return string 图片基线优化标准 Baseline.Standard=基线标准,Baseline.Optimized=基线已优化,Progressive.Progressive=连续,unknow=不支持
*/
function get_interlace($filename)
{

if(!file_exists($filename)) throw new Exception("no found file!");
$file = @fopen($filename,"rb");
if(!$file) throw new Exception("file refuse!");
$bin = fread($file, 2*8*50000); //只读15字节 各个不同文件类型,头信息不一样。
fclose($file);
$f = implode(' ',str_split(bin2hex($bin),4));

if(strpos($f,'3842 494d 0406 0000 0000 0007 0008 0000 0001 0100'))return 'Baseline.Standard';
if(strpos($f,'3842 494d 0406 0000 0000 0007 0008 0001 0001 0100'))return 'Baseline.Optimized';
if(strpos($f,'3842 494d 0406 0000 0000 0007 0008 0101 0001 0100'))return 'Progressive.Progressive';
return 'unknow';

}

方法三之2:
/**
* 检测JPEG图片的基线优化标准
*
* @param $filename string 图片路径
* @return string 图片基线优化标准 Baseline.Standard=标准,Baseline.Optimized=优化,Progressive.Progressive=连续,unknow=不支持
*/
function get_interlace4($filename)
{

if(!file_exists($filename)) throw new Exception("no found file!");
$size = getimagesize($filename, $info);
$f='';
if(isset($info['APP13']))
{
$bin =  substr($info['APP13'],-6,2);
$f = implode(' ',str_split(bin2hex($bin),4));
}

switch($f){
case '0000':
$psformat = 'Baseline.Standard';
break;
case '0001':
$psformat = 'Baseline.Optimized';
break;
case '0101':
$psformat = 'Progressive.Progressive';
break;
default:
$psformat = 'unknow';
}
return $psformat;

}

 

 

最后给出一个测试用的脚本:

<?php

/**
* 检测JPEG图片的基线优化标准
*
* @param $filename string 图片路径
* @return string 图片基线优化标准 Baseline.Standard=基线标准,Baseline.Optimized=基线已优化,Progressive.Progressive=连续,unknow=不支持
*/
function get_interlace1($filename)
{

if(!file_exists($filename)) throw new Exception("no found file!");
$file = @fopen($filename,"rb");
if(!$file) throw new Exception("file refuse!");
$bin = fread($file, 2*8*50000); //只读15字节 各个不同文件类型,头信息不一样。
fclose($file);
$f = implode(' ',str_split(bin2hex($bin),4));

if(strpos($f,'3842 494d 0406 0000 0000 0007 0008 0000 0001 0100'))return 'Baseline.Standard';
if(strpos($f,'3842 494d 0406 0000 0000 0007 0008 0001 0001 0100'))return 'Baseline.Optimized';
if(strpos($f,'3842 494d 0406 0000 0000 0007 0008 0101 0001 0100'))return 'Progressive.Progressive';
return 'unknow';

}

?>

<html lang="zh-cn">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<h1>检测JPEG图片的基线优化标准</h1>
<form action="" method="post" enctype="multipart/form-data">
请选择文件:<input type="file" name="file" /><input type="submit" value="上传" />
<hr>
<?php

if($_FILES){

$arr = $_FILES["file"];

// $pa = get_interlace('runtime/180808171002-00001-a0.jpg');
// $pb = get_interlace('runtime/180808171002-00001-a1.jpg');
// $pc = get_interlace('runtime/180808171002-00001-c.jpg');
$pc = '';
// $pa = get_interlace($arr['tmp_name']);
// $pa = get_interlace2($arr['tmp_name']);
$pa = get_interlace($arr['tmp_name']);

echo '<br>文件名:'.$arr['name'];
echo '<br>文件类型:'.$arr['type'];
echo '<br>文件大小:'.$arr['size'];
echo '<br>平台:'.PHP_OS;
echo '<br>检测结果:';
if($pa=='Baseline.Standard'){
echo '基线标准模式<font color=green>【允许】</font>';
}elseif($pa=='Baseline.Optimized'){
echo '基线已优化模式<font color=red>【禁止】</font>';
}elseif($pa=='Progressive.Progressive'){
echo '连续<font color=red>【禁止】</font>';
}else{
echo '不能识别<font color=red>【禁止】</font>';
// var_dump($pa);
}
}

?>
</form></body></html>

通过exif.tuchong.com网站的exif信息分析得到区别:

基线标准:https://exif.tuchong.com/view/6907702/
EncodingProcess     Baseline DCT, Huffman coding
Photoshop格式     Standard
二进制识别字符:"3842 494d 0406 0000 0000 0007 0008 0000 0001 0100"

基线优化:https://exif.tuchong.com/view/6907705/
EncodingProcess     Baseline DCT, Huffman coding
Photoshop格式     Optimized
二进制识别字符:"3842 494d 0406 0000 0000 0007 0008 0001 0001 0100"

连续:https://exif.tuchong.com/view/6907709/
EncodingProcess     Progressive DCT, Huffman coding
Photoshop格式     Progressive
二进制识别字符:"3842 494d 0406 0000 0000 0007 0008 0101 0001 0100"

 

参考链接:

  •    JPEG文件编/解码详解 https://blog.csdn.net/yuan892173701/article/details/8710316
  •    [最新]mac安装ImageMagick与PHP扩展Imagick    https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/79103930
  •     PHP把JPEG图片转换成Progressive JPEG的方法    https://www.jb51.net/article/51653.htm
  • * PhotoShop制作渐进式JPEG的方法    https://www.jb51.net/photoshop/182198.html
  • XMP Sidecar, embedded XMP, IPTC, EXIF -- PhotoMechanic and Lightroom https://www.dpreview.com/forums/post/50375450

声明: 本文由( admin )原创编译,转载请保留链接: php识别jpg图片exif信息中Photoshop格式 类型

php识别jpg图片exif信息中Photoshop格式 类型:等您坐沙发呢!

发表评论


------====== 本站公告 ======------
联系信息:
lxq73061#qq.com qq:583964941
支付宝:https://me.alipay.com/lxq73061
相关插件程序等信息均会在站内发布,敬请关注。

读者排行