Как определить изображение CMYK в PHP - PullRequest
2 голосов
/ 24 октября 2011

Может кто-нибудь сказать мне, как определить изображение, если оно в CMYK или RGB с использованием PHP?

Ответы [ 5 ]

2 голосов
/ 24 октября 2011

Внимательно посмотрите на 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 - это текстовая строка с правильной строкой height = "yyy" width = "xxx", которую можно использовать непосредственно в теге IMG.

mime - соответствующий MIME-тип изображения. Эта информация может использоваться для доставки изображений с правильным заголовком HTTP Content-type: каналов будет 3 для изображений RGB и 4 для изображений CMYK.

бит - это количество бит для каждого цвета.

Для некоторых типов изображений наличие значений каналов и битов может немного сбивать с толку. Например, GIF всегда использует 3 канала на пиксель, но количество бит на пиксель не может быть рассчитано для анимированного GIF с глобальной таблицей цветов.

При ошибке возвращается FALSE.

1 голос
/ 02 сентября 2017

Ни один из ответов не является достаточно точным для меня. Используйте Imagemagick.

Чтобы получить цветовое пространство (например, 'RGB', 'CMYK' и т. Д.):

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

Чтобы получить цветовой профиль:

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

1 голос
/ 23 января 2015

Вот две реализации. Эта версия использует 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 также обнаружит CMYK в других форматах, таких как TIFF.

1 голос
/ 22 августа 2013

Если изображение в формате jpg, вы можете проверить раздел SOF (Начало кадра - SOF0 или SOF2) в заголовке jpeg (см. 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))

0 голосов
/ 01 марта 2012
    $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";    
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...