[轉貼]Adobe 色彩系統 RGB 和 CMYK 相互轉換原理 @ JTHWAX BLOG :: 隨意窩 Xuite日誌
  • 線上人數
  • 關鍵字
    1. 沒有新回應!
  • 訪客地圖
  • 200808301550[轉貼]Adobe 色彩系統 RGB 和 CMYK 相互轉換原理
    平均分數:0 顆星    投票人數:0
    我要評分:


    來源: http://www.mjtd.com/bbs/dispbbs.asp?boardID=3&ID=65975&page=1

    為了說明 adobe 的 RGB 轉換 CMYK 的過程,不得不先涉及到一些色彩轉換程序方面的東西。

    CMYK_ADOBE_COLORSPACE:
    r = (k*c)/maxval;
    g = (k*m)/maxval;
    b = (k*y)/maxval;

    以上是 adobe 的 CMYK 到 RGB轉換公式,下面再來看看 RGB 如何 轉換為 CMYK

    下面的語句是經過改寫的適用於 Flash 的 actionscript

     

    // RGB to CMY 色彩轉換
    function rgbtocmy () {
    mycyan = 255 - myred;
    mymagenta = 255 - mygreen;
    myyellow = 255 - myblue;
    correctCMYK();
    }

    // CMY to RGB 色彩轉換
    function cmytorgb () {
    myred = 255 - mycyan;
    mygreen = 255 - mymagenta;
    myblue = 255 - myyellow;
    correctCMYK();
    }

    // CMYK 色彩修正
    function correctCMYK () {
    if (rep_v != "ERR") {
    var temp = Math.min(Math.min(mycyan, mymagenta), myyellow);
    if (temp != 0) {
    temp2 = Math.round((rep_v / 100) * temp);
    rep_k = Math.round((temp2 / 255) * 100);
    rep_c = Math.round(((mycyan - temp2) / 255) * 100);
    rep_m = Math.round(((mymagenta - temp2) / 255) * 100);
    rep_y = Math.round(((myyellow - temp2) / 255) * 100);
    } else {
    rep_c = Math.round((mycyan / 255) * 100);
    rep_m = Math.round((mymagenta / 255) * 100);
    rep_y = Math.round((myyellow / 255) * 100);
    rep_k = 0;
    }
    }
    }

    // RGB to CMY 色彩轉換
    function rgbtocmy () {
    mycyan = 255 - myred;
    mymagenta = 255 - mygreen;
    myyellow = 255 - myblue;
    correctCMYK();
    }

    // CMY to RGB 色彩轉換
    function cmytorgb () {
    myred = 255 - mycyan;
    mygreen = 255 - mymagenta;
    myblue = 255 - myyellow;
    correctCMYK();
    }

    // CMYK 色彩修正
    function correctCMYK () {
    if (rep_v != "ERR") {
    var temp = Math.min(Math.min(mycyan, mymagenta), myyellow);
    if (temp != 0) {
    temp2 = Math.round((rep_v / 100) * temp);
    rep_k = Math.round((temp2 / 255) * 100);
    rep_c = Math.round(((mycyan - temp2) / 255) * 100);
    rep_m = Math.round(((mymagenta - temp2) / 255) * 100);
    rep_y = Math.round(((myyellow - temp2) / 255) * 100);
    } else {
    rep_c = Math.round((mycyan / 255) * 100);
    rep_m = Math.round((mymagenta / 255) * 100);
    rep_y = Math.round((myyellow / 255) * 100);
    rep_k = 0;
    }
    }
    }

    // RGB to CMY 色彩轉換
    function rgbtocmy () {
    mycyan = 255 - myred;
    mymagenta = 255 - mygreen;
    myyellow = 255 - myblue;
    correctCMYK();
    }

    // CMY to RGB 色彩轉換
    function cmytorgb () {
    myred = 255 - mycyan;
    mygreen = 255 - mymagenta;
    myblue = 255 - myyellow;
    correctCMYK();
    }

    // CMYK 色彩修正
    function correctCMYK () {
    if (rep_v != "ERR") {
    var temp = Math.min(Math.min(mycyan, mymagenta), myyellow);
    if (temp != 0) {
    temp2 = Math.round((rep_v / 100) * temp);
    rep_k = Math.round((temp2 / 255) * 100);
    rep_c = Math.round(((mycyan - temp2) / 255) * 100);
    rep_m = Math.round(((mymagenta - temp2) / 255) * 100);
    rep_y = Math.round(((myyellow - temp2) / 255) * 100);
    } else {
    rep_c = Math.round((mycyan / 255) * 100);
    rep_m = Math.round((mymagenta / 255) * 100);
    rep_y = Math.round((myyellow / 255) * 100);
    rep_k = 0;
    }
    }
    }

    我們知道, RGB 和 CMYK 並不能一一對應,這裡面存在的問題是黑色部分的替換值的取值問題。

    但是, RGB 所可以全部對應的,是CMY 格式,其最取值範圍是0-255。從色輪上我們可以很容易的瞭解到這其中的補色計算關係。因此,CMY 和 RGB 的對換 可以說是「無損,可逆轉」的。

    當從RGB 得到相應的CMY 之後,我們若要得到 CMYK 值,就必須定義一個「黑色替換值」,也就是說提取各色通道中的若幹成分來形成黑色通道。CMYK 的取值是 0-100。

    這個「黑色替換值」的取值不同,得到的CMYK份量分佈也就不同。也就是我們在photoshop裡面可以選擇 CMYK 的分色方案為 「UCR」或者「GCR」的不同。

    「黑色替換值」越大,CMYK圖像在印刷時的偏色幾率就越小,但相應的狀況是圖片彩墨份量在暗黑部位顯薄,不夠飽和。這種分色方式適用於印刷材質較薄或較粗糙,印刷精度不高的場合。

    附註:為什麼直接去色和直接轉換灰度比 Lab 的 L 通道得到的灰度層次顯得差?

    我們還是來用色彩轉換公式說話來比較:
    L = 0.3R+0.59G+0.11B
    Gray = (R+G+B)/3

    我們很容易就看出區別,平均取值的灰度和根據色彩明度增益比例混合的值是完全不同的。


    回應