2008年10月28日 星期二

ColorSpace 一個看起來好像很有用 但是沒用的玩具

上一篇只講到 有關於JPEG如何判斷檔案的色域是RGB或是CMYK
如果 僅僅是為了顯示圖片在瀏覽器上 那篇就絲毫沒有用處
可是如果是用來做影像管理 圖庫這類的東西 那是大大的不足

印刷與顯示的需求差異很大
印刷要求的是 CMYK 300dpi
而顯示要求的是 RGB 72dpi
也許 在儲存上 還是要以 CMYK 300dpi來儲存 但是在網頁顯示上 卻需要 RGB 72dpi

所以 就必須要有 檢查色域與改變色域的功能
而這兩個功能都是imagemagick所擁有的

以下是每個色域的代號
ColorspaceType constants
0 MW_UndefinedColorspace
1 MW_RGBColorspace
2 MW_GRAYColorspace
3 MW_TransparentColorspace
4 MW_OHTAColorspace
5 MW_LABColorspace
6 MW_XYZColorspace
7 MW_YCbCrColorspace
8 MW_YCCColorspace
9 MW_YIQColorspace
10 MW_YPbPrColorspace
11 MW_YUVColorspace
12 MW_CMYKColorspace
13 MW_sRGBColorspace
14 MW_HSBColorspace
15 MW_HSLColorspace
16 MW_HWBColorspace

由於 PHP 5.2.6 之後就可以安裝 imagick 所以 我把同樣的功能寫成兩個不同的函式
一個是在 imagick 上使用 一個是在 magickwand 上使用

function IM_ColorSpace_Check($file){
$image=new Imagick($file);
$ColorspaceType = $image->getImageColorspace($file);
return $ColorspaceType;
}

imagick 傳回的是一個數值 例如 12 代表 CMYK

function MW_ColorSpace_Check($file){
$mgck_wnd = NewMagickWand();
MagickReadImage($mgck_wnd, $file);
$ColorspaceType = MagickGetImageColorspace($mgck_wnd);
return $ColorspaceType;
}

magickwand 傳回的是一個功能變數 例如 MW_CMYKColorspace 代表 CMYK 當然也就是 12

其實我個人發現 這16個色域 絕大部分是很少用到的 可卻也缺少一個 index color
這是GIF的格式

function IM_ColorSpace_Change($file, $ColorspaceType, $outputfile = False){
$image=new Imagick($file);
$image->setImageColorspace($ColorspaceType);
if ($output == False){
$image->writeImage($file);}
else{
$image->writeImage($outputfile);}
}

function MW_ColorSpace_Change($file, $ColorspaceType, $outputfile = False){
$mgck_wnd = NewMagickWand();
MagickReadImage($mgck_wnd, $file);
MagickSetImageColorspace($mgck_wnd, $ColorspaceType);
if ($outputfile == False){
MagickWriteImage($mgck_wnd);}
else{
MagickWriteImage($mgck_wnd, $outputfile);}
}

同樣的 一個是給 imagick 上使用 一個是給 magickwand 上使用

看起來是乎很方便 但是試過之後就會發現 這功能完全不能用
在網路上也幾乎沒有找到有這方面的範例
RGB的色域較廣 所以 可以轉換到CMYK的時候 有些顏色就會消失 某些圖片看起來會比較暗沉
而色域較小的CMYK 轉換到 RGB的時候 卻可以完全轉換
這個差異大家可以用Photoshop試試看就知道了
當然我不強求 RGB to CMYK的時候會有多漂亮
但是 CMYK to RGB 卻不能變化太多
可是 試驗下來 卻發現 通通會變色 而且差異蠻大的
這樣一來 還能用嗎
我知道 RGB to CMYK 的時候 先轉換為 index color 顏色掉得比較少
可是 卻沒有 index color 可以中介轉換
試了之後 我只能說 色域轉換個功能是玩具

沒有留言: