Tengo una UIImage
que es UIImageOrientationUp
(vertical) que me gustaría a rotar en sentido antihorario en 90 grados (a horizontal). No quiero usar a CGAffineTransform
. Quiero que los píxeles de la UIImage
real cambien de posición. Estoy usando un bloque de código (que se muestra a continuación) originalmente destinado a cambiar el tamaño de a UIImage
para hacer esto. Configuré un tamaño de destino como el tamaño actual de UIImage
pero recibo un error:
(Error): CGBitmapContextCreate: bytes / fila de datos no válidos: debe ser al menos 1708 para 8 bits enteros / componente, 3 componentes, kCGImageAlphaPremultipliedLast.
(No obtengo un error cada vez que proporciono un tamaño MÁS PEQUEÑO como el tamaño objetivo BTW). ¿Cómo puedo ROTAR mi 90W en sentido UIImage
horario usando solo las funciones gráficas principales y al mismo tiempo preservar el tamaño actual?
-(UIImage*)reverseImageByScalingToSize:(CGSize)targetSize:(UIImage*)anImage
{
UIImage* sourceImage = anImage;
CGFloat targetWidth = targetSize.height;
CGFloat targetHeight = targetSize.width;
CGImageRef imageRef = [sourceImage CGImage];
CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef);
CGColorSpaceRef colorSpaceInfo = CGImageGetColorSpace(imageRef);
if (bitmapInfo == kCGImageAlphaNone) {
bitmapInfo = kCGImageAlphaNoneSkipLast;
}
CGContextRef bitmap;
if (sourceImage.imageOrientation == UIImageOrientationUp || sourceImage.imageOrientation == UIImageOrientationDown) {
bitmap = CGBitmapContextCreate(NULL, targetHeight, targetWidth, CGImageGetBitsPerComponent(imageRef), CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo);
} else {
bitmap = CGBitmapContextCreate(NULL, targetWidth, targetHeight, CGImageGetBitsPerComponent(imageRef), CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo);
}
if (sourceImage.imageOrientation == UIImageOrientationRight) {
CGContextRotateCTM (bitmap, radians(90));
CGContextTranslateCTM (bitmap, 0, -targetHeight);
} else if (sourceImage.imageOrientation == UIImageOrientationLeft) {
CGContextRotateCTM (bitmap, radians(-90));
CGContextTranslateCTM (bitmap, -targetWidth, 0);
} else if (sourceImage.imageOrientation == UIImageOrientationDown) {
// NOTHING
} else if (sourceImage.imageOrientation == UIImageOrientationUp) {
CGContextRotateCTM (bitmap, radians(90));
CGContextTranslateCTM (bitmap, 0, -targetHeight);
}
CGContextDrawImage(bitmap, CGRectMake(0, 0, targetWidth, targetHeight), imageRef);
CGImageRef ref = CGBitmapContextCreateImage(bitmap);
UIImage* newImage = [UIImage imageWithCGImage:ref];
CGContextRelease(bitmap);
CGImageRelease(ref);
return newImage;
}
fuente
Respuestas:
¿Qué pasa con algo como:
fuente
Creo que la forma más fácil (y segura para hilos también) es hacer:
Nota: como Brainware dijo, esto solo modifica los datos de orientación de la imagen: los datos de píxeles no se tocan. Para algunas aplicaciones, esto puede no ser suficiente.
O en Swift:
fuente
let img = UIImage(cgImage: myImage!.cgImage!, scale: UIScreen.main.scale, orientation: .right)
Echa un vistazo al código simple e impresionante de Hardy Macia en: cortando-escalando-y-rotando-uiimages
Solo llama
Gracias Hardy Macia!
Encabezamiento:
Dado que el enlace puede morir, aquí está el código completo
fuente
Por extraño que parezca, el siguiente código resolvió el problema para mí:
fuente
Una función de rotación segura para subprocesos es la siguiente (funciona mucho mejor):
fuente
UIImageOrientationDown
.Tuve problemas con todo lo anterior, incluida la respuesta aprobada. Convertí la categoría de Hardy nuevamente en un método ya que todo lo que quería era rotar una imagen. Aquí está el código y el uso:
Y el uso:
Gracias Hardy!
fuente
Girar la imagen 90 grados (en sentido horario / antihorario)
Llamada de función -
Implementación:
fuente
Si desea agregar un botón de rotación de fotos que seguirá girando la foto en incrementos de 90 grados, aquí tiene. (
finalImage
es un UIImage que ya se ha creado en otro lugar).fuente
Sencillo. Simplemente cambie la bandera de orientación de la imagen.
fuente
Aquí hay una extensión Swift de UIImage que rota la imagen en cualquier ángulo arbitrario. Utilizar de esta manera:
let rotatedImage = image.rotated(byDegrees: degree)
. Utilicé el código Objective-C en una de las otras respuestas y eliminé algunas líneas que incorrectamente (cosas de caja rotadas) y lo convertí en una extensión para UIImage.fuente
Extensión Swift 3 UIImage:
fuente
Versión Swift 4.2 de la respuesta de RawMean :
fuente
Intento este código, funciona, y tomé de http://www.catamount.com/blog/1015/uiimage-extensions-for-cutting-scaling-and-rotating-uiimages/
fuente
Pequeños cambios a las otras respuestas que se basan en el código de Hardy Macia. No es necesario crear un
UIView
objeto completo simplemente para calcular el rectángulo delimitador de la imagen girada. Simplemente aplique una transformación de rotación al rectángulo de la imagen usandoCGRectApplyAffineTransform
.fuente
"tint uiimage grayscale" parece ser el Google-Fu apropiado para este
enseguida me sale:
https://discussions.apple.com/message/8104516?messageID=8104516ꩄ
https://discussions.apple.com/thread/2751445?start=0&tstart=0
¿Cómo teñiría una imagen mediante programación en el iPhone?
fuente
Me gusta la simple elegancia de
Peter Sarnowski
la respuesta, pero puede causar problemas cuando no puede confiar enEXIF
metadatos y similares. En situaciones en las que necesita rotar los datos de la imagen real , recomendaría algo como esto:El código anterior toma una imagen cuya orientación es
Landscape
(no recuerdo si esLandscape Left
oLandscape Right
) y la giraPortrait
. Es un ejemplo que puede modificarse según sus necesidades.Los argumentos clave con los que tendrías que jugar son
CGContextRotateCTM(context, M_PI_2)
dónde decides cuánto quieres rotar, pero luego debes asegurarte de que la imagen todavía se dibuja en la pantalla usandoCGContextTranslateCTM(context, 0, -640)
. Esta última parte es bastante importante para asegurarse de ver la imagen y no una pantalla en blanco.Para obtener más información, consulte la fuente .
fuente
resize-a-uiimage-the-right-way explica algunos de los problemas que tienen muchos ejemplos de código para hacer esto, y tiene algunos fragmentos de código para ayudar a lidiar con UIImages: el método de ayuda privada en UIImage + resize.m acepta una transformación para permitir rotación, por lo que solo debe exponer eso como una interfaz pública.
Esta es la licencia de ese archivo:
fuente
Hay una categoría de UIImage extremadamente eficiente llamada NYXImagesKit. Utiliza vDSP, CoreImage y vImage para ser lo más rápido posible. Tiene una categoría UIImage + Rotating que me salvó el día :)
https://github.com/Nyx0uf/NYXImagesKit
fuente
Para Swift: Aquí hay una extensión simple para UIImage:
( Fuente )
Úselo con:
El primero rotará una imagen y la volteará si flip se establece en verdadero.
fuente