用PHP将CMYK格式的JPG文件转为RGB格式

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zwfcan/article/details/16963375

imagick是一个PHP的扩展,用ImageMagick提供的API来进行图片的创建与修改,不过这些操作已经包装到扩展imagick中去了,最终调用的是ImageMagick提供的API. 

ImageMagick是一套软件系列,主要用于图片的创建、编辑以及转换等,详细的解释见ImageMagick的官方网站http://www.imagemagick.org/,ImageMagick与GD的性能要高很多,如果是在处理大量的图片时更加能体现ImageMagick的性能。 

1. 下载安装ImageMagick 
Linux代码  收藏代码
  1. wget ftp://mirror.aarnet.edu.au/pub/imagemagick/ImageMagick-6.6.8-10.tar.gz  
  2.   
  3. tar -xzvf ImageMagick-6.6.8-10.tar.gz  
  4. ./configure --prefix=/usr/local/imagemagick  
  5. make  
  6. make install  


后来安装ImageMagick6.8.6总是编译失败:magick/.libs/libMagickCore-6.Q16.so: undefined reference to `jpeg_default_qtables'所以不得不重新编译libjpeg最新版本,下载jpegsrc.v9.tar.gz 
Linux代码  收藏代码
  1. tar -xzvf jpegsrc.v9.tar.gz  
  2. cd jpeg-9  
  3. ./configure  
  4. make libdir=/usr/lib64   
  5. make libdir=/usr/lib64 install  

曾经在一个服务器上,libdir参数必须有,否则错误仍在。我猜,如果不用libdir参数,而是在make install后执行  sudo ldconfig /usr/lib64(imagemagick官方说明)是否起到同样效果.不懂C语言,悲剧啊! 

2. 下载安装Imagick

yum install ImageMagick-devel

即可安装ImageMagick-devel。


3. 下载安装Imagick 
注:安装该扩展不要求安装ImageMagick 
从http://pecl.php.net/package/imagick找到imagick的最新的版本 
Linux代码  收藏代码
  1. wget http://pecl.php.net/get/imagick-3.1.0RC1.tgz  
  2.   
  3. tar -xzvf imagick-3.1.0RC1  
  4. cd imagick-3.1.0RC1
  5. phpize  
  6. ./configure --with-php-config=/usr/local/php/bin/php-config --with-imagick=/usr/local/imagemagick  
  7. make  
  8. make install  


make install执行结果显示: 
Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/ 
Installing header files:          /usr/local/php/include/php/ 

生成imagick.so到/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/,然后手动配置php.ini使其生效


公司某个项目需要抓取pdf的缩略图,最近有部分缩略图无法在IE浏览器显示,但是能够在谷歌浏览器显示。最后发现无法显示的图片图像色彩为CMKY,而CMKY在IE浏览器是无法显示的。所以需要将图像色彩CMKY转为RGB。 
关于ICC 文件 提供地址可以下载:

CMYK: http://www.mattbeals.com/icc/profiles/cmyk/USWebUncoated.icc.zip
RGB:http://www.mattbeals.com/icc/profiles/rgb/AdobeRGB1998.icc.zip

$im = new Imagick($filename);
if ($im->getImageColorspace() == Imagick::COLORSPACE_CMYK) {
          $i = new Imagick($filename);
          $profiles = $i->getImageProfiles('*', false);
          $has_icc_profile = (array_search('icc', $profiles) !== false);
          if ($has_icc_profile === false) {
               $icc_cmyk = file_get_contents('USWebUncoated.icc');
               $i->profileImage('icc', $icc_cmyk);
               unset($icc_cmyk);
           }
           $icc_rgb = file_get_contents('AdobeRGB1998.icc');
           $i->profileImage('icc', $icc_rgb);
           unset($icc_rgb);
           $i->writeImage($filename);
}


展开阅读全文

求助:UYVY422格式转为RGB

08-22

在网上下载过UYVY422转RGB的例子,不知道是不是对的,反正在我这边转出来是乱的。rn我先描述一下情况:rn是隔行扫描的,但是别人给了一个库,专门用于将两场合并为一场,并生成UYVY422格式,rn由我的DirectDraw显示,我的DirectDraw显示格式设置成了dwFourCC = MAKEFOURCC('U', 'Y', 'V', 'Y');rn这样做可以正常显示,没问题。rnrn我现在需要截图,也就是将这个UYVY422格式的数据转为RGB再保存为bmp,奇怪为什么不行。rn我想问的就是DirectDraw能够显示的UYVY格式数据,按理说它这个格式应该是规范的才对吧,rn那我将UYVY按规范转为RGB为什么就不对呢?rnrn//yuv->bmprn//输入:yuvin-yuv图像数据, width-图像像素宽度, height-图像像素高度rn//输出:rgbout-bmp图像数据rnbool CScreenShot::UYVY422ToRGB(int width, int height, BYTE *yuvin, BYTE *rgbout)rnrn if (NULL == yuvin || NULL == rgbout)rn rn return false;rn rn rn int col,row;rn long Y,U,V;rn long red,blue,green;rnrn for (row=0; row>1;rn Y=yuvin[rowptr+col];rn U=yuvin[rowptr+colhalf+width*height-row*width/2];rn V=yuvin[rowptr+colhalf+width*height-row*width/2+width*height/2];rnrn red=(int)(Y+(U-128)*1.375);rn green=(int)(Y-(U-128)*0.34375-(V-128)*0.703125);rn blue=(int)(Y+(V-128)*1.734375);rnrn if (red>255) red=255;rn else if (red<0) red=0;rnrn if (green>255) green=255;rn else if (green<0) green=0;rn rn if (blue>255) blue=255;rn else if (blue<0) blue=0;rnrn rgbout[idx++]=(char)red;rn rgbout[idx++]=(char)green;rn rgbout[idx++]=(char)blue;rn rn rnrn return true;rnrnrnrnrnrn初学,请高手赐教 论坛

没有更多推荐了,返回首页