如何在PHP中识别CMYK图像

时间:2011-10-24 09:28:08

标签: php image-processing

有人能告诉我如何使用PHP以CMYK或RGB格式识别图像吗?

5 个答案:

答案 0 :(得分:2)

好好看看getimagesize

示例:

<?php
$size = getimagesize($filename);
$fp = fopen($filename, "rb");
if ($size && $fp) {
    header("Content-type: {$size['mime']}");
    fpassthru($fp);
    exit;
} else {
    // error
}
?>

它返回一个包含7个元素的数组。

索引0和1分别包含图像的宽度和高度。

索引2是指示图像类型的IMAGETYPE_XXX常量之一。

索引3是一个文本字符串,其正确的高度=“yyy”width =“xxx”字符串,可以直接在IMG标记中使用。

mime是图像的对应MIME类型。此信息可用于使用正确的HTTP Content-type标头传递图像: RGB视频的频道为3,CMYK图片为4。

bits是每种颜色的位数。

对于某些图像类型,通道和位值的存在可能有点令人困惑。例如,GIF每个像素总是使用3个通道,但无法为具有全局颜色表的动画GIF计算每个像素的位数。

失败时,返回FALSE。

答案 1 :(得分:1)

如果图像是jpg格式,您可以在jpeg标题中查看SOF(帧起始 - SOF0或SOF2)部分(参见http://en.wikipedia.org/wiki/JPEG

function isCMYK($img_data) {
    // Search for SOF (Start Of Frame - SOF0 or SOF2) section in header
    // http://en.wikipedia.org/wiki/JPEG
    if (($sof = strpos($img_data, "\xFF\xC0")) === false) {
        // FF C2 is progressive encoding while FF C0 is standard encoding
        $sof = strpos($img_data, "\xFF\xC2");
    } 
    return $sof? ($img_data[($sof + 9)] == "\x04") : false;
}

$img_data变量是原始文件内容(例如$img_data = file_get_contents($filename)

答案 2 :(得分:1)

这是两个实现。此版本使用GD:

/**
 * Check if a JPEG image file uses the CMYK colour space.
 * @param string $path The path to the file.
 * @return bool
 */
function imageIsCMYK($path) {
    $t = getimagesize($path);
    if (array_key_exists('mime', $t) and 'image/jpeg' == $t['mime']) {
        if (array_key_exists('channels', $t) and 4 == $t['channels']) {
            return true;
        }
    }
    return false;
}

此版本使用ImageMagick:

/**
 * Check if an image file uses the CMYK colour space.
 * @param string $path The path to the file.
 * @return bool
 */
function imageIsCMYK($path)
{
    $im = new Imagick($path);
    return ($im->getimagecolorspace() == Imagick::COLORSPACE_CMYK);
}

GD版本对我来说快了大约18倍。 imagemagick版本还会以其他格式(如TIFF)发现CMYK。

答案 3 :(得分:1)

对我来说,这些答案都不够准确。使用Imagemagick。

获取色彩空间(即'RGB','CMYK'等):

exec('identify -format "%[colorspace]\n" '.$imagePath);

获取颜色配置文件:

exec('identify -format "%[profile:icc]\n" '.$imagePath);

答案 4 :(得分:-1)

    $miImagen = array_values(getimagesize('imagenCMYK.jpg'));
  list($width, $height, $type, $attr, $bits, $canales) = $miImagen;
if ($canales = 4){
    echo "Imagen: CMYK";
    }
    else{
    echo "Tu imagen no es CYMK";    
        }