2008-10-31 62 views

Respuesta

10

Simplemente redondee el color de la escala de grises a negro o blanco.

float gray = (r + g + b)/3 
if(gray > 0x7F) return 0xFF; 
return 0x00; 
+3

El canal verde se percibe como más brillante que los otros dos, una mejor ecuación para la escala de grises es: 0.299R + 0.587G + 0.114B – Null303

+0

Estamos redondeando a negro puro y blanco puro para que esos pesos no importen tanto :-) –

+0

Jasper, parece que realmente importan, porque su conversión a negro o blanco se basa en un umbral probado contra el * valor gris *. –

6

Puedes pagar en imagemagick, suponiendo que tu host lo admita. ¿Qué función desea utilizar para decidir si un píxel debe ser negro o blanco?

+0

encontrar una función que corresponde a la línea de comandos: convertido source.jpg -colors 2 destino .jpg –

1

Si tiene la intención de hacerlo usted mismo, deberá implementar un dithering algorithm. Pero como dice @jonni, ¿usar una herramienta existente sería mucho más fácil?

19

El uso de la biblioteca php gd:

imagefilter($im, IMG_FILTER_GRAYSCALE); 
imagefilter($im, IMG_FILTER_CONTRAST, -100); 

Verificar los comentarios de los usuarios en el siguiente enlace para más ejemplos.

+3

realmente usa imagefilter ($ im, IMG_FILTER_CONTRAST, -1000); Tenga en cuenta el 1000 en lugar de 100 –

+0

... Pero tengo un año de retraso –

+0

@Mark ¿Tiene una referencia o sabe si es dependiente de la versión? No he encontrado ningún lugar definitivo en línea, aunque he encontrado varias personas que dicen que es -100 a 100. – Annan

0

Para cada píxel debe convertir de color a escala de grises: algo así como $ gris = $ rojo * 0.299 + $ verde * 0.587 + $ azul * 0.114; (estos son factores de ponderación NTSC, existen otras ponderaciones similares. Esto imita la respuesta variable del ojo a diferentes colores).

Luego debe decidir sobre un valor de corte, generalmente la mitad del valor máximo de píxel, pero dependiendo de la imagen puede preferir un valor más alto (oscurecer la imagen) o inferior (hacer la imagen más brillante).

Simplemente al comparar cada píxel con el corte se pierden muchos detalles, es decir, las áreas oscuras grandes se vuelven completamente negras, por lo que para retener más información, puede oscilar. Básicamente, comience en la esquina superior izquierda de la imagen: para cada píxel, agregue el error (la diferencia entre el valor original y el valor final asignado) para los píxeles a la izquierda y arriba antes de comparar con el valor de corte.

Tenga en cuenta que hacer esto en PHP será muy lento: usted estaría mucho más adelante para encontrar una biblioteca que proporcione esto.

+0

Hacer estas cosas en PHP no es * tan * lento, he hecho una biblioteca de edición de imágenes completa en PHP con eliminación de ojos rojos, filtros de desenfoque, máscaras, filtros de mezcla, etcétera, y el rendimiento no fue tan malo. (No es suficiente para el uso en tiempo real, pero definitivamente lo suficientemente rápido para la mayoría de las aplicaciones). –

1
$rgb = imagecolorat($original, $x, $y); 
     $r = ($rgb >> 16) & 0xFF; 
     $g = ($rgb >> 8) & 0xFF; 
     $b = $rgb & 0xFF; 

     $gray = $r + $g + $b/3; 
     if ($gray >0xFF) {$grey = 0xFFFFFF;} 
     else { $grey=0x000000;} 
1

y su funcionamiento es como un encanto

public function ImageToBlackAndWhite($im) { 

    for ($x = imagesx($im); $x--;) { 
     for ($y = imagesy($im); $y--;) { 
      $rgb = imagecolorat($im, $x, $y); 
      $r = ($rgb >> 16) & 0xFF; 
      $g = ($rgb >> 8) & 0xFF; 
      $b = $rgb & 0xFF; 
      $gray = ($r + $g + $b)/3; 
      if ($gray < 0xFF) { 

       imagesetpixel($im, $x, $y, 0xFFFFFF); 
      }else 
       imagesetpixel($im, $x, $y, 0x000000); 
     } 
    } 

    imagefilter($im, IMG_FILTER_NEGATE); 

} 
0

El uso de la biblioteca GD de PHP:

imagefilter($im, IMG_FILTER_GRAYSCALE); 
imagefilter($im, IMG_FILTER_CONTRAST, 1000); 
Cuestiones relacionadas