una invertir imagen colores ios swift uiview

ios - imagen - ¿Cómo invertir los colores de un área específica de un UIView?



invertir colores iphone 8 (3)

Es fácil desenfocar una parte de la vista, teniendo en cuenta que si el contenido de las vistas detrás cambia, el desenfoque también cambia en tiempo real.

Mis preguntas

  1. Cómo hacer un efecto de inversión, y puedes ponerlo sobre una vista y los contenidos que están detrás tendrían colores invertidos

  2. ¿Cómo agregar un efecto que sepa el color promedio de los píxeles detrás?

En general, ¿Cómo acceder a los píxeles y manipularlos? Mi pregunta no es sobre UIImageView, pregunta sobre UIView en general ..

hay bibliotecas que hacen algo similar, pero son muy lentas y no se ejecutan con tanta suavidad como el desenfoque.

Gracias.


No creo que pueda responder completamente a su pregunta, pero tal vez pueda indicarle la dirección correcta.

Apple tiene cierta documentación sobre el acceso a los datos de píxeles de CGImages , pero, por supuesto, eso requiere que tenga una imagen con la que trabajar en primer lugar. Afortunadamente, puede crear una imagen desde una vista UIV como esta:

UIGraphicsBeginImageContext(view.frame.size) view.layer.render(in: UIGraphicsGetCurrentContext()!) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext()

A partir de esta imagen que creó, podrá manipular los datos de píxeles como desee. Puede que no sea la forma más limpia de resolver su problema, pero tal vez sea algo que vale la pena explorar.

Desafortunadamente, el enlace que proporcioné está escrito en Objective-C y tiene algunos años, pero tal vez puedas descubrir cómo hacer un buen uso de él.


Primero te recomendaré que extiendas UIImageView para este propósito. ref

Buena ref por Joe

Tienes que anular el método drawRect

import UIKit @IBDesignable class PortholeView: UIView { @IBInspectable var innerCornerRadius: CGFloat = 10.0 @IBInspectable var inset: CGFloat = 20.0 @IBInspectable var fillColor: UIColor = UIColor.grayColor() @IBInspectable var strokeWidth: CGFloat = 5.0 @IBInspectable var strokeColor: UIColor = UIColor.blackColor() override func drawRect(rect: CGRect) { super.drawRect(rect:rect) // Prep constants let roundRectWidth = rect.width - (2 * inset) let roundRectHeight = rect.height - (2 * inset) // Use EvenOdd rule to subtract portalRect from outerFill // (See https://.com/questions/14141081/uiview-drawrect-draw-the-inverted-pixels-make-a-hole-a-window-negative-space) let outterFill = UIBezierPath(rect: rect) let portalRect = CGRectMake( rect.origin.x + inset, rect.origin.y + inset, roundRectWidth, roundRectHeight) fillColor.setFill() let portal = UIBezierPath(roundedRect: portalRect, cornerRadius: innerCornerRadius) outterFill.appendPath(portal) outterFill.usesEvenOddFillRule = true outterFill.fill() strokeColor.setStroke() portal.lineWidth = strokeWidth portal.stroke() } }

Tu respuesta esta aqui


Si sabes cómo codificar un CIColorKernel, tendrás lo que necesitas.

  • Core Image tiene varios filtros de desenfoque, todos los cuales utilizan la GPU, que le brindarán el rendimiento que necesita.

  • El CIAreaAverage le dará el color promedio para un área rectangular específica.

Filtros de imagen del núcleo

Aquí está sobre el más simple CIColorKernel que puedes escribir. Intercambia el valor rojo y verde por cada píxel en una imagen (note "grba" en lugar de "rgba"):

kernel vec4 swapRedAndGreenAmount(__sample s) { return s.grba; }

Para poner esto en un CIColorKernel, solo use esta línea de código:

let swapKernel = CIKernel(string: "kernel vec4 swapRedAndGreenAmount(__sample s) {" + "return s.grba;" + "}"

@ tww003 tiene un buen código para convertir la capa de una vista en un UIImage. Suponiendo que llame a su imagen myUiImage, para ejecutar este swapKernel, puede:

let myInputCi = CIImage(image: myUiImage) let myOutputCi = swapKernel.apply(withExtent: myInputCi, arguments: myInputCi) Let myNewImage = UIImage(ciImage: myOutputCi)

Eso es todo. Puedes hacer mucho más (incluido el uso de CoreGraphics, etc.) pero este es un buen comienzo.

Una última nota, puede encadenar filtros individuales (incluidos los colores escritos a mano, la deformación y los núcleos generales). Si lo desea, puede encadenar su promedio de color sobre la vista subyacente con un desenfoque y hacer cualquier tipo de inversión que desee como un único filtro / efecto.