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
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
¿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.
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.