2008-11-10 1 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 значение 128 для каждого цветового компонента (RG и B) будет давать средний серый цвет. Вы можете также поставить любое значение ниже или больше 128, чтобы получить разную интенсивность (оттенки) серого.

-AD

22

Как отметил 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'); 
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 приблизительно равна, 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) 
    ); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^