最近开发一套绣标生产管理系统,遇到一个问题就是如果用户上传的图片是除了基线(“标准”)外的格式,印刷机会认不出来。所以需要在上传时进行检测。php识别jpg图片exif信息中Photoshop格式 类型网上没有找到现成的方案,前后尝试了三种方式,最后成功解决准确识别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(file = @fopen(filename,“rb”);
if(!$file) throw new Exception(“file refuse!”);
bin=fread(bin = fread(file, 2850000); //只读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

KaTeX parse error: Double superscript at position 15: f = implode(' '̲,str_split(bin2…bin),4));
// var_dump(f);if(strpos(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)returnSOF0;elseif(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(file = @fopen(filename,“rb”);
if(!$file) throw new Exception(“file refuse!”);
bin=fread(bin = fread(file, 2850000); //只读15字节 各个不同文件类型,头信息不一样。
fclose($file);
KaTeX parse error: Double superscript at position 15: f = implode(' '̲,str_split(bin2…bin),4));

if(strpos(f,3842494d04060000000000070008000000010100))returnBaseline.Standard;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(size = getimagesize(filename, $info);
f=;if(isset(f=''; if(isset(info[‘APP13’]))
{
bin=substr(bin = substr(info[‘APP13’],-6,2);
KaTeX parse error: Double superscript at position 15: f = implode(' '̲,str_split(bin2…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'; } ?>

检测JPEG图片的基线优化标准

请选择文件:
<?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=getinterlace(pa = get_interlace(arr[‘tmp_name’]);
// pa=getinterlace2(pa = get_interlace2(arr[‘tmp_name’]);
pa=getinterlace(pa = get_interlace(arr[‘tmp_name’]);

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

?>

通过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

相关文章:

  • 2021-11-09
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-08-08
  • 2021-12-21
  • 2021-10-14
猜你喜欢
  • 2021-11-17
  • 2022-12-23
  • 2021-09-19
  • 2022-12-23
  • 2021-06-27
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案