如何在PHP中识别CMYK图像

发布于 2024-12-11 07:40:40 字数 39 浏览 0 评论 0原文

谁能告诉我如何使用 PHP 识别图像是 CMYK 还是 RGB?

Can anyone tell me how to identify an image if it is in CMYK or RGB using PHP ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

玩套路吗 2024-12-18 07:40:40

仔细看看 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 标头的图像:
RGB 图片的通道为 3,CMYK 图片的通道为 4。

位是每种颜色的位数。

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

失败时,返回 FALSE。

Take a good look at getimagesize.

Example:

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

It returns an array with 7 elements.

Index 0 and 1 contains respectively the width and the height of the image.

Index 2 is one of the IMAGETYPE_XXX constants indicating the type of the image.

Index 3 is a text string with the correct height="yyy" width="xxx" string that can be used directly in an IMG tag.

mime is the correspondant MIME type of the image. This information can be used to deliver images with the correct HTTP Content-type header:
channels will be 3 for RGB pictures and 4 for CMYK pictures.

bits is the number of bits for each color.

For some image types, the presence of channels and bits values can be a bit confusing. As an example, GIF always uses 3 channels per pixel, but the number of bits per pixel cannot be calculated for an animated GIF with a global color table.

On failure, FALSE is returned.

时光清浅 2024-12-18 07:40:40

这里有两个实现。此版本使用 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。

Here are two implementations. This version uses 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;
}

This version uses 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);
}

The GD version is about 18 times faster for me. The imagemagick version will also spot CMYK in other formats, such as TIFF.

柳若烟 2024-12-18 07:40:40

如果图像是 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($文件名))

If the image is in jpg format, you can check SOF (Start Of Frame - SOF0 or SOF2) section in jpeg header (see 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 variable is the raw file contents (e.g. $img_data = file_get_contents($filename))

ペ泪落弦音 2024-12-18 07:40:40

对我来说,没有一个答案足够准确。使用 Imagemagick。

要获取颜色空间(即“RGB”、“CMYK”等):

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

要获取颜色配置文件:

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

None of the answers are accurate enough for me. Use Imagemagick.

To get color space (ie. 'RGB', 'CMYK', etc):

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

To get color profile:

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

小鸟爱天空丶 2024-12-18 07:40:40
    $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";    
        }
    $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";    
        }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文