ios core-graphics cgcontext cgcontextdrawimage

ios - Coloque el borde alrededor de la imagen parcialmente transparente que se está dibujando en CGContext



core-graphics cgcontextdrawimage (2)

Intentaría establecer el color del trazo y el ancho de línea antes de su llamada a CGContextDrawImage , o ajustar la sombra (opacidad, desenfoque, etc.) para que se vea como un trazo alrededor de la imagen. ¡Hazme saber si esto funciona!

Tengo una imagen con un jarrón amarillo en primer plano y fondo transparente:

Lo estoy dibujando en un CGContext:

CGContextDrawImage(context, CGRectMake(0, 0, 100, 100), myImage.CGImage);

Puedo dibujar una sombra a su alrededor usando la siguiente declaración antes de CGContextDrawImage :

CGContextSetShadowWithColor(context, CGSizeMake(0,0), 5, [UIColor blueColor].CGColor);

Pero quiero poner un trazo alrededor de la imagen, para que se vea como sigue:

Si yo hiciera esto:

CGContextSetRGBStrokeColor(shadowContext, 0.0f, 0.0f, 1.0f, 1.0f); CGContextSetLineWidth(shadowContext, 5); CGContextStrokeRect(shadowContext, CGRectMake(0, 0, 100, 100));

(Obviamente) dibuja un borde rectangular alrededor de todo el iamge así:

Que no es lo que necesito.

¿Pero cuál es la mejor manera de dibujar el borde como en la tercera imagen?

Tenga en cuenta que no es posible utilizar UIImageView en este caso, por lo que no se aplica el uso de las propiedades de CALayer de UIImageView.


Una forma de hacer esto es usar el operador de morfología matemática de la dilatación para "hacer crecer" el canal alfa de la imagen hacia afuera, luego usar la imagen en escala de grises resultante como una máscara para simular un trazo. Al rellenar la máscara dilatada y luego dibujar la imagen principal en la parte superior, se obtiene el efecto de un trazo. He creado una demostración que muestra este efecto, disponible en Github aquí: https://github.com/warrenm/Morphology (toda la fuente tiene licencia MIT, si le resulta útil).

Y aquí hay una captura de pantalla en acción:

Tenga en cuenta que esto es asombrosamente lento (la dilatación requiere la iteración de un núcleo sobre cada píxel), por lo que debe elegir un ancho de trazo y calcular previamente la imagen de la máscara para cada una de las imágenes de origen.