2010-01-22 11 views
5

Quiero recortar una imagen rectangular a una forma no rectangular. Me doy cuenta de que si tomas eso literalmente, no es posible. Con lo que quiero terminar es con la imagen X, recortada para dar forma a Y, sobre un fondo transparente.¿Cómo recortaría programáticamente una imagen a una forma no rectangular?

Digamos, por ejemplo, que quiero tomar una foto de la bandera de Idaho y recortarla en la forma del estado de Idaho. Me imagino que me gustaría hacer algo como esto:

  1. Crear una imagen que tiene píxeles opacos para la forma de Idaho, los píxeles transparentes en todos los demás
  2. leer y almacenar algún tipo de mapa de bits para la imagen del estado de Idaho
  3. para cada posición de píxel opacos en la imagen del estado de Idaho en, copie el píxel correspondiente de la imagen de la bandera del estado de Idaho y colocarlo en un lienzo en blanco, transparente

Paso 1, obviamente, se llevaría a cabo de forma manual, pero el resto se haría programaticamente Creo que tengo la idea correcta en general, pero no sé cómo abordaría los detalles. ¿Alguien puede señalarme en la dirección correcta?

En lo que respecta a la tecnología de implementación, soy un tipo de PHP, por lo que usar gdLibrary o algo que funcione con PHP probablemente sea la mejor forma de hacerlo.

+0

Debería agregar la etiqueta php a la pregunta – wich

Respuesta

2

Creo que sería mucho más fácil hacerlo simplemente añadiendo una máscara de bits o un canal alfa. En ese caso, usaría una imagen de máscara negativa de su forma y luego simplemente la aplicaría a la imagen normal como una máscara y luego la salvaría en un formato transparente. Nunca he hecho esto con GD o ImageMagick, pero creo que está disponible como sugiere Jerry.

Acutally aquí es un blog formar una pregunta similar, así que puede ayudar a: http://about.phalacee.com/geek/creating-mask-layers-using-php-gd

2

La forma habitual de hacer algo como esto sería usar blanco (todos 1) y negro (todos los 0) para su contorno en lugar de transparente y opaco. Entonces usted Y esa imagen con la imagen que está tratando de recortar. El resultado es 0 donde la imagen del contorno tenía 0, y la otra imagen donde el contorno tenía 1.

Es posible que también deba invertir su imagen de contorno y AND la versión invertida con la imagen de fondo. Luego usted O la imagen de fondo con la imagen de primer plano para producir un compuesto de la imagen de primer plano en forma de Idaho (para usar su ejemplo) y la imagen de fondo en cualquier otro lugar.

Dependiendo de las capacidades de la biblioteca que esté utilizando, existe una buena posibilidad de que el tipo de capacidad esté directamente disponible. Solo por ejemplo, Windows tiene esta capacidad en la función MaskBlt.

1

En PHP usando ImageMagick es probablemente su mejor apuesta:

$source = IMagick("sourcefile"); 
$mask = IMagick("maskfile"); 
$mask->adaptiveResizeImage($source->getImageWidth(), $source->getImageHeight(), true); 
$source->compositeImage($mask, imagick::COMPOSITE_MULTIPLY, 0, 0); 
$source->writeImage("newfile"); 
$source->clear(); 
$source->destroy(); 

SourceFile debe ser la imagen de origen como desee , maskfile debe ser un archivo de máscara que tenga el canal alfa configurado correctamente para la forma que desee.

Cuestiones relacionadas