解决CMYK图片上传后偏色问题

Node.js August 09 2013 Node.js


最近在做一个资源上传的项目,期间遇到一个问题,因为上传的图片有一些是用于印刷,使用的是 CMYK,上传到服务器后因为 web 展示是 RGB 的,所以就发生偏色了。最后还是解决了这个上传 CMYIK 图片偏色的问题,先上处理结果图,再仔细说具体的实现:

duibi

研究了一下,决定采用服务器进行处理,对上传的 CMYK 图片进行处理,转换成 RGB 再替换原图。转换使用一个比较著名强大的工具集 ImageMagick(http://www.imagemagick.org/),安装过程就不讲了,可以参考官网的安装方法:http://www.imagemagick.org/script/install-source.php

使用安装后的命令行工具 Convert 进行转换,使用 Convert 还要加入颜色的描述文件,使用 -profile` 参数载入,在Adobe官网下了一套各种描述文件的集合:

icc

经过一轮测试和研究后,发现最通用的 CMYK 描述文件为 JapanColor2001Coated.icc,而转换出来的 RGB 描述文件使用 ColorMatchRGB.icc,因为服务器端使用的是 Node.js,所以就用 Node.js 写了一个 Demo 共享之:

Git地址:

主要的核心 function 如下:

判断图片是否为 CMYK

function ColorSpace(filename, callback) {
  console.log('Start Identfity');
  var ident = exec('identify -format %[colorspace] ./upload/' + filename,
  function(error, stdout, stderr) {
    console.log('ident');
    console.log('stdout: ' + stdout);
    console.log('stderr: ' + stderr);
    if (error !== null) {
      console.log('exec error: ' + error);
    }
    console.log('ident OK');
    callback(stdout);
  });
}

转换 CMYKRGB

function ConvCMYK(filename, callback) {
  console.log('Start');
  var conv = exec('convert ./upload/' + filename + ' -profile ./iccs/JapanColor2001Coated.icc -profile ./iccs/ColorMatchRGB.icc ./upload/' + filename,
  function(error, stdout, stderr) {
    console.log('conv');
    console.log('stdout: ' + stdout);
    console.log('stderr: ' + stderr);
    if (error !== null) {
      console.log('exec error: ' + error);
    }
    console.log('OK');
    callback('OK');
  });
}

其中最核心的就是使用 ImageMagick 的两条命令: identifyconvert。使用方法如下,使用其他语言的朋友也可以举一反三在自己的项目中使用:

identify -format %[colorspace] file

convert file -profile JapanColor2001Coated.icc -profile ColorMatchRGB.icc newfile

相关的 ICC 文件什么的都在项目上有,欢迎大家一起讨论一同进步!

Demo地址: https://github.com/yourtion/Demo_CMYKImageUploader

原文链接:https://blog.yourtion.com/solve-cmyk-image-upload-problem.html


欢迎来到郭宇翔的博客

打酱油专业户,喜欢各种折腾!

Follow @yourtion on GitHub

推荐内容