我的任务是创建一个小应用程序,您可以上传图片,该应用程序将把它变成ASCII艺术。我相信这些已经存在,但我想证明我可以自己做。
这将涉及拍摄图像,使其成为灰度,然后根据图片的暗度和角色的充分程度将每个像素与角色匹配。
所以我的问题是,使用GD库(或者我想其他一些必要的手段)如何使图像变成黑白图像?
答案 0 :(得分:23)
正如nickf中comment所指出的那样,简单公式(pixel.r + pixel.g + pixel.b) / 3
不正确。使用GD包含的函数imagefilter()
(不需要使用PHP循环迭代图像中的所有像素):
$im = imagecreatefrompng('dave.png');
imagefilter($im, IMG_FILTER_GRAYSCALE);
imagepng($im, 'dave.png');
答案 1 :(得分:7)
要使它纯黑色和白色(如你所写)使用此
imagefilter($im, IMG_FILTER_GRAYSCALE);
imagefilter($im, IMG_FILTER_CONTRAST, -1000);
答案 2 :(得分:5)
来自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)
);
}
答案 3 :(得分:2)
将RGB转换为灰度的常用公式为:
Gray scale intensity = 0.30R + 0.59G + 0.11B
答案 4 :(得分:1)
你不必把它转换成灰度......如果你只计算一个像素与某种颜色(在你的情况下是一系列灰点)的接近程度,结果就会一样无论如何,在比较你的灰度图像,然后选择合适的角色时,你已经完成了。
答案 5 :(得分:0)
通常在RGB颜色空间中,每个颜色分量(RG和B)的值为128将为中灰色。您也可以将任何低于或高于128的值设置为获得不同的灰度强度(阴影)。
-AD