cmyk使用php进行rgb

时间:2011-12-30 01:34:41

标签: php image rgb cmyk

我正在使用以下脚本将图像保存在文件夹中,但是有一个图像显示此消息“图像无法显示,因为它包含错误”。

我认为这个问题在图像上有一个叫做cmyk和rgb的东西,但是当在网上搜索一种方式,所以使用php将cmyk转换为rgb我找不到如何做到这一点的例子。

以下是一个示例:http://offshootinc.com/blog/2008/10/24/using-the-imagick-class-to-convert-a-cmyk-jpeg-to-rgb/但我不知道如何在我的情况下使用它。

图片的链接类似于:www.example.com/attachment?id = 2290

脚本如下:

<?php 
$image = 'http://www.dealrush.ie/attachment?id=2290';
$name = 'somename';
$alt = 'somealt';
$saveimage = file_get_contents($image);
file_put_contents("/usr/local/pem/vhosts/155030/webspace/httpdocs/img/$name.jpg", $saveimage);?>

稍后在某些页面中,我将使用类似的内容来显示图像。 &lt; img src =“http://www.example.com/img/<?php echo $name?>.jpg”alt =“<?php echo $alt?>”height =“127px”width =“190px”/&gt;

任何有关转换这些图片的帮助都将受到赞赏 谢谢 丹尼尔

2 个答案:

答案 0 :(得分:4)

我怀疑颜色空间(CMYK或RGB)是你的问题。虽然每个人都应该在网络上使用RGB图像,但浏览器仍然会显示CMYK图像而不会抱怨。

要将图像从CMYK转换为RGB,您需要安装一个想象操作程序,例如ImageMagick,GraphicsMagick或ExactImage。其中任何一个都可以做你想要的,但必须由服务器管理员安装。如果你很幸运,可能已经安装了ImageMagick,在这种情况下你可以这样做:

$image= '/path/to/your/file.jpg';
$i = new Imagick($image);
$i->setImageColorspace(Imagick::COLORSPACE_SRGB);
$i->writeImage($image);
$i->destroy();

请注意,ImageMagick是最强大的,ExactImage是最快的,而GraphicsMagick是ImageMagick的一个人,它更快但功能稍弱并且有一些bug。只有ImageMagick可以在PHP中使用,其他的必须用exec函数执行,虽然这不一定是坏事,因为它们可能比PHP更好地处理自己的内存和清理。

答案 1 :(得分:2)

CMYK是一种使用减色光混合而不是添加剂来打印图像的方法。您可能知道,RGB颜色由红色,绿色和蓝色组成,计算机显示器或电视中的像素会发出这些颜色。在印刷中,通常使用白纸。它反射(接近)100%的红色,绿色和蓝色光。将墨水放在纸张上时,墨水会吸收一种或多种颜色。因此,红色墨水实际上吸收通常从纸张反射的绿色和蓝色光。在印刷中,他们使用红色,绿色和蓝色的补充。这些是青色,品红色和黄色。 CMY =青色,洋红色,黄色。 K代表黑色。 (他们没有使用B,因为RGB中的蓝色已经是B.)事实证明使用青色,品红色和黄色墨水很难获得漂亮的深黑色(加上昂贵的 - 你必须使用全部3个!),因此,他们添加一点纯黑色(反射接近无光),使其看起来更好。

那么这对您来说意味着您必须从CMYK转换为RGB。不幸的是,没有一种方法可以做到这一点。如果您查看类似Photoshop的内容,则需要先在转换前设置要模拟的墨水和纸张类型。

如果您的纯CMY没有黑色成分,您可以使用r = 1.0 - c,g = 1.0 - m,b = 1.0 - y并获得相当好的图像近似值。 this question中的第一个回复是合理的回应。

您还可以找出要在Photoshop或其他应用中使用的特定转换,并从中制作表格。之前我已经通过创建一个1024x1024的图像来完成这项工作。每个32x32的正方形都有一个梯度,x方向的青色从0到1,y方向的洋红色从0到1.然后从左到右,每个正方形的黄色量增加,从上到下,它们中含有越来越多的黑色。我将图像加载到Photoshop中,将其转换为RGB并以无损格式(如TIFF)再次保存,不带瓷砖,条带或图层(为了便于使用)。然后我将它加载到我的应用程序中,并将其用作查找表,以执行相同的RGB转换。这是第一次有点麻烦,但是一旦你制作了转换表,它就很容易使用了。我只是使用双线性插值来生成RGB值。