20p*_*res 7 php image color-management imagick color-profile
我一直在努力解决这个问题并且惊讶于找不到任何文档!
我正在将图像上传到网站,并希望提取每个图像ICC配置文件的名称并在图像描述中使用它.到目前为止,标准PHP没有产生任何结果.我用Photoshop,Bridge和Exiftool检查了图像,每个人都识别出嵌入的配置文件.
<?php
$info = exif_read_data($image);
echo 'ICC Profile: '.$info['ICC_Profile'].'<br>';
echo 'ICC Profile: '.$info['CurrentICCProfile'].'<br>';
echo 'ICC Profile: '.$info['ColorSpace'].'<br>';
?>
Run Code Online (Sandbox Code Playgroud)
Imagick产生了最好的结果:
$imagick = new Imagick();
$imagick->readImage($image);
print_r ($imagick->getImageProfiles("icc",true));
Run Code Online (Sandbox Code Playgroud)
生成实际提到配置文件但不是可用字符串的数组.任何帮助赞赏.
我正在使用这些版本:
PHP版本5.2.17 - imagick模块版本3.0.1 - ImageMagick版本6.7.6-8
并print_r返回(对于'ProPhoto RGB'ICC配置文件):
数组([icc] => KCMSmntrRGBXYZ :acspMSFTKODAROMM + KODAcprtHdesc\wtpt rTRC gTRC bTRC rXYZgXYZbXYZ,dmnd @ndmdd mmod (textCopyright(c)Eastman Kodak Company,1999,all rights reserved.descProPhotoRGB ProPhotoRGBProPhotoRGBXYZ ,curv XYZ 4I XYZ" > XYZ -descKODAK KODAKKODAKdesc'Reference输出介质公制(ROMM)( 参考输出介质公制(ROMM) )'参考输出中度量(ROMM)mmod ; )
完整(来自Exiftool):
Profile CMM Type : KCMS
Profile Version : 2.1.0
Profile Class : Display Device Profile
Color Space Data : RGB
Profile Connection Space : XYZ
Profile Date Time : 1998:12:01 18:58:21
Profile File Signature : acsp
Primary Platform : Microsoft Corporation
CMM Flags : Not Embedded, Independent
Device Manufacturer : KODA
Device Model : ROMM
Device Attributes : Reflective, Glossy, Positive, Color
Rendering Intent : Perceptual
Connection Space Illuminant : 0.9642 1 0.82487
Profile Creator : KODA
Profile ID : 0
Profile Copyright : Copyright (c) Eastman Kodak Company, 1999, all rights reserved.
Profile Description : ProPhoto RGB
Media White Point : 0.9642 1 0.82489
Red Tone Reproduction Curve : (Binary data 14 bytes, use -b option to extract)
Green Tone Reproduction Curve : (Binary data 14 bytes, use -b option to extract)
Blue Tone Reproduction Curve : (Binary data 14 bytes, use -b option to extract)
Red Matrix Column : 0.79767 0.28804 0
Green Matrix Column : 0.13519 0.71188 0
Blue Matrix Column : 0.03134 9e-005 0.82491
Device Mfg Desc : KODAK
Device Model Desc : Reference Output Medium Metric(ROMM)
Make And Model : (Binary data 40 bytes, use -b option to extract)
Run Code Online (Sandbox Code Playgroud)
我不太确定,如果所有图像都是如此.至少我拥有的图像,在他们的"属性"中有这些信息.因此,要获得可打印的配置文件名称,它应该像这样工作:
$imagick = new imagick('/some/filename');
$profile = $imagick->getImageProperties('icc:model', true);
/**
* If the property 'icc:model' is set $profile now should be:
* array( 'icc:model' => 'ICC model name')
*/
Run Code Online (Sandbox Code Playgroud)
如果要查看为图像设置的所有属性,可以使用手动探测图像identify -verbose /some/filename.在那里你将不得不寻找"属性:",ICC名称应该在那里设置.
以上是获取ICC配置文件名称的简便方法.如果您真的需要icc配置文件中的ICC名称,您可能需要查看ICC配置文件格式规范
简而言之:
我们对'desc'标签感兴趣(参见规范中的第63页).
在代码中它的工作方式如下:
$image = new imagick('/path/to/img');
try {
$existingICC = $image->getImageProfile('icc');
} catch (ImagickException $e) {
// Handle it
$existingICC = null;
}
if($existingICC) {
// Search the start of the description tag in the tag table.:
// We are not looking in the 128 bytes for the header + 4 bytes for the size of the table
$descTagPos = stripos( $existingICC, 'desc', 131 );
if( $descTagPos === false) {
// There is no description, handle it.
} else {
// This is the description Tag ( 'desc'|offset|size each with a size of 4 bytes
$descTag = substr( $existingICC, $descTagPos, 12 );
// Get the offset out of the description tag, unpack it from binary to hex and then from hex to decimal
$descTagOffset = substr ( $descTag, 4, 4 );
$descTagOffset = unpack( 'H*', $descTagOffset );
$descTagOffset = hexdec( $descTagOffset[1] );
// Same for the description size
$descTagSize = substr ( $existingICC, $descTagPos + 8, 4 );
$descTagSize = unpack('H*', $descTagSize);
$descTagSize = hexdec( $descTagSize[1] );
// Here finally is the descripton
$iccDesc = substr( $existingICC, $descTagOffset, $descTagSize );
// See page 63 in the standard, here we extract the size of the ICC profile name string
$iccNameSize = substr( $iccDesc, 8, 4 );
$iccNameSize = unpack( 'H*', $iccNameSize);
$iccNameSize = hexdec( $iccNameSize[1]);
// Finally got the name.
$iccName = substr( $iccDesc, 12, $iccNameSize );
echo "ICC name: $iccName\n";
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3558 次 |
| 最近记录: |