2008年10月25日 星期六

Get Image ColorSpace CMYK or RGB

用過 ImageMagick的人都知道 ImageMagick 的功能比GD2 多很多
但是 如果在別人的伺服器上沒有安裝 ImageMagick 的時候要怎辦

我自己寫了一個個人相簿 主要是有些圖像整理起來需要用到特殊的功能
包括 300dpi的問題 cmyk的問題
當然這些東西 如果安裝了 ImageMagick 那一切好辦事
但是如果沒有呢

找了好幾天 才發現 其實 GD的 getimagesize 就有這樣的功能
當然 他僅限於 JPEG 其他的 TIFF 他根本就沒支援
但是這樣也夠了 因為 TIFF根本不能顯示在網頁上
而JPEG (CMYK) 也不能顯示在網頁上
那一但上傳了 JPEG (CMYK) 就需要做轉換
至於其他可以在網頁上顯示的 GIF 與PNG 都是RGB 根本也無須判別

先用以下的涵式看看 getimagesize 取得哪些資料

function CheckColorSpace($file){
$imagedata = getimagesize($file);
foreach ($imagedata as $val){
echo $val;
}
}

先整裡兩個JPEG檔 一個為RGB 一個為CMYK

分別呼叫這個涵式之後
會發現
-----------------RGB-------------------------
1600
1200
2
width="1600" height="1200"
8
3
image/jpeg
-----------------CMYK------------------------
1600
1200
2
width="1600" height="1200"
8
4
image/jpeg

Array[0] = Width
Array[1] = Height
Array[2] = Image Type Flag
Array[3] = width="xxx" height="xxx"
Array[bits] = bits
Array[channels] = channels
Array[mime] = mime-type

通常我們用到的 只是 第0 與第1個 索引 也就是寬與高
第2索引 是圖片類型的判斷
第3索引 則是以文字表現寬高
第4索引 每個像素用幾個bit表示
第5索引 如果為3 則表示 這個圖像由3個 channel組成 所以為RGB
如果為4 則表示 這個圖像由4個 channel組成 所以為CMYK
這個索引式JPEG特有的
第6索引 IMAGETYPE 可直接給 HTTP Content-type header使用

由此就可以判斷出 這個JPEG 是CMYK 還是RGB

function GD_CheckColorSpace($file){
$imagedatas = getimagesize($file,$imageinfo);
if ($imagedatas[2] != 2){
$CheckColor = "RGB";
}
else{
if ($imagedatas[channels] == 3){
$CheckColor = "RGB";
}
elseif ($imagedatas[channels] == 4){
$CheckColor = "CMYK";
}
}
return $CheckColor;
}

以下是 ImageMagick 判斷色域的涵式

function MW_CheckColorSpace($file){
$mgck_wnd = NewMagickWand();
MagickReadImage($mgck_wnd, $file);
$img_colspc = MagickGetImageColorspace($mgck_wnd);
//echo $img_colspc;
switch ($img_colspc){
case MW_CMYKColorspace :
return "CMYK";
break;
case MW_sRGBColorspace :
return "sRGB";
break;
case MW_RGBColorspace :
return "RGB";
break;
case MW_GRAYColorspace :
return "GRAY";
break;
case MW_LABColorspace :
return "LAB";
break;
//default:
}
}

兩者個功能差很多 當然 使用GD是不得已的作法

沒有留言: