2008-11-10 219 views
4

我的任務是創建一個小應用程序,您可以在其中上傳圖片,然後該應用程序將其轉換爲ASCII藝術。我確信這些已經存在,但我想證明我可以自己做。使用GD庫創建圖像灰度

這將涉及拍攝一張圖像,使其成爲灰度,然後根據圖像有多黑以及該字符的滿度將每個像素與一個字符進行匹配。

所以我的問題是,使用GD庫(或者如果需要,我猜想其他一些方法)如何使圖像成爲黑色和白色?

回答

2

一個共同的公式轉換RGB爲灰度是:

Gray scale intensity = 0.30R + 0.59G + 0.11B
+0

常見的,是的;正確?不,請參閱我的回答。 – 2010-08-23 22:09:33

1

您不必將其轉換爲灰度...如果您只是計算像素與某種顏色的接近程度(在您的情況下爲一系列灰色點),結果將是相同的,您會無論如何,在比較灰度圖像時,必須做出選擇,然後選擇合適的角色。

0

通常在RGB顏色空間中,每個顏色分量(RG和B)的值爲128將給出中等灰度。您也可以將任何低於或大於128的值以獲得不同強度(陰影)的灰色。

〜AD

22

正如他在comment指出的nickf,一個簡單的公式(pixel.r + pixel.g + pixel.b)/3是不正確的。使用GD-包括功能imagefilter()(無需使用PHP循環遍歷圖像中的所有像素),而不是:

$im = imagecreatefrompng('dave.png'); 
imagefilter($im, IMG_FILTER_GRAYSCALE); 
imagepng($im, 'dave.png'); 
6

爲了使純粹的黑與白(爲你寫)使用此

imagefilter($im, IMG_FILTER_GRAYSCALE); 
imagefilter($im, IMG_FILTER_CONTRAST, -1000); 
4

nickf的答案雖然很常見,但卻是錯誤的。 (對不起,尼克。)對於初學者來說,這些是NTSC RGB的亮度數字,而不是sRGB,這是計算機圖像使用的。正確的數字是0.21,0.72,0.07。其次,必須將權重應用於未經伽馬校正的RGB值,然後重新應用伽馬校正。 sRGB的Gamma大約爲2.2。準確地說,它是一個複合函數,其近似指數乘以1/2.2。這裏是用C++編寫的。 (我不會說php,對不起,你需要翻譯。)

// sRGB luminance(Y) values 
const double rY = 0.212655; 
const double gY = 0.715158; 
const double bY = 0.072187; 

// Inverse of sRGB "gamma" function. (approx 2.2) 
double inv_gam_sRGB(int ic) { 
    double c = ic/255.0; 
    if (c <= 0.04045) 
     return c/12.92; 
    else 
     return pow(((c+0.055)/(1.055)),2.4); 
} 

// sRGB "gamma" function (approx 2.2) 
int gam_sRGB(double v) { 
    if(v<=0.0031308) 
     v *= 12.92; 
    else 
     v = 1.055*pow(v,1.0/2.4)-0.055; 
    return int(v*255+.5); 
} 

// GRAY VALUE 
int gray(int r, int g, int b) { 
    return gam_sRGB(
      rY*inv_gam_sRGB(r) + 
      gY*inv_gam_sRGB(g) + 
      bY*inv_gam_sRGB(b) 
    ); 
}