`
啸笑天
  • 浏览: 3465556 次
  • 性别: Icon_minigender_1
  • 来自: China
社区版块
存档分类
最新评论

UIImage的imageOrientation属性(app中图片旋转了的bug)

 
阅读更多

UIImage有一个imageOrientation的属性,主要作用是控制image的绘制方向,共有以下8中方向

//UIImageOrientation的定义,定义了如下几种变换
typedef enum 
{
    UIImageOrientationUp,            // default orientation

    UIImageOrientationDown,          // 180 deg rotation

    UIImageOrientationLeft,          // 90 deg CCW
    
    UIImageOrientationRight,         // 90 deg CW
    
    UIImageOrientationUpMirrored,    // as above but image mirrored along other axis. horizontal flip
    
    UIImageOrientationDownMirrored,  // horizontal flip
    
    UIImageOrientationLeftMirrored,  // vertical flip
    
    UIImageOrientationRightMirrored, // vertical flip

} UIImageOrientation;

 + (UIImage *)imageWithCGImage:(CGImageRef)cgImage scale:(CGFloat)scale orientation:(UIImageOrientation)orientation NS_AVAILABLE_IOS(4_0); 

该方面使用一个CGImageRef创建UIImage,在创建时还可以指定方法倍数以及旋转方向。当scale设置为1的时候,新创建的图像将和原图像尺寸一摸一样,而orientaion则可以指定新的图像的绘制方向。

 

下面是个解决应用图片旋转或颠倒的bug:

 

+ (UIImage *)fixOrientation:(UIImage *)aImage {
    
    // No-op if the orientation is already correct
    if (aImage.imageOrientation == UIImageOrientationUp) 
        return aImage;
    
    // We need to calculate the proper transformation to make the image upright.
    // We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored.
    CGAffineTransform transform = CGAffineTransformIdentity;
    
    switch (aImage.imageOrientation) {
        case UIImageOrientationDown:
        case UIImageOrientationDownMirrored:
            transform = CGAffineTransformTranslate(transform, aImage.size.width, aImage.size.height);
            transform = CGAffineTransformRotate(transform, M_PI);
            break;
            
        case UIImageOrientationLeft:
        case UIImageOrientationLeftMirrored:
            transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);
            transform = CGAffineTransformRotate(transform, M_PI_2);
            break;
            
        case UIImageOrientationRight:
        case UIImageOrientationRightMirrored:
            transform = CGAffineTransformTranslate(transform, 0, aImage.size.height);
            transform = CGAffineTransformRotate(transform, -M_PI_2);
            break;
        default:
            break;
    }
    
    switch (aImage.imageOrientation) {
        case UIImageOrientationUpMirrored:
        case UIImageOrientationDownMirrored:
            transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);
            transform = CGAffineTransformScale(transform, -1, 1);
            break;
            
        case UIImageOrientationLeftMirrored:
        case UIImageOrientationRightMirrored:
            transform = CGAffineTransformTranslate(transform, aImage.size.height, 0);
            transform = CGAffineTransformScale(transform, -1, 1);
            break;
        default:
            break;
    }
    
    // Now we draw the underlying CGImage into a new context, applying the transform
    // calculated above.
    CGContextRef ctx = CGBitmapContextCreate(NULL, aImage.size.width, aImage.size.height,
                                             CGImageGetBitsPerComponent(aImage.CGImage), 0,
                                             CGImageGetColorSpace(aImage.CGImage),
                                             CGImageGetBitmapInfo(aImage.CGImage));
    CGContextConcatCTM(ctx, transform);
    switch (aImage.imageOrientation) {
        case UIImageOrientationLeft:
        case UIImageOrientationLeftMirrored:
        case UIImageOrientationRight:
        case UIImageOrientationRightMirrored:
            // Grr...
            CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.height,aImage.size.width), aImage.CGImage);
            break;
            
        default:
            CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.width,aImage.size.height), aImage.CGImage);
            break;
    }
    
    // And now we just create a new UIImage from the drawing context
    CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
    UIImage *img = [UIImage imageWithCGImage:cgimg];
    CGContextRelease(ctx);
    CGImageRelease(cgimg);
    return img;
}

 

 

分享到:
评论

相关推荐

    ios开发UIImage category实现添加水印(图片和文字)

    - 水印位置调整:在实际应用中,你可能需要根据需求调整水印的位置、透明度、旋转角度等属性。 - 图片质量:Category方法使用了UIGraphicsBeginImageContextWithOptions来创建一个新的上下文,其中的`opaque`参数...

    OC Extension UIImage+FHXImage(图片扩展).zip

    OC Extension UIImage+FHXImage(图片扩展) 针对UIImage进行封装的工具类。 /** 输入图片颜色返回一张图片 */ + (UIImage *)createImageWithColor:(UIColor *)color; /** 裁切图片的一个点进行延伸 */ - ...

    swift-给UIView或UIImage高性能添加圆角生成渐变色图片等

    在Swift编程语言中,对UIView或UIImage进行高性能的圆角处理和生成渐变色图片是常见的图像操作。这些操作在用户界面设计中尤其重要,因为它们可以提升应用的视觉效果和用户体验。以下将详细介绍如何实现这些功能。 ...

    ios UIImage category 图片加载

    在iOS开发中,`UIImage`类是处理图片的核心组件,用于加载、显示和操作图片。在实际应用中,我们经常需要高效地加载图片以优化内存使用和应用性能。标题提到的"ios UIImage category 图片加载"是关于如何通过分类...

    图片旋转Demo

    对于单张图片的旋转,开发者通常会使用图像处理库,如Android的Bitmap类或者iOS的UIImage类。这些类提供了旋转图片的方法,通过指定旋转角度(通常是90度、180度或270度)来实现。旋转过程涉及到图片的矩阵变换,其...

    UIIMage 改变颜色和遮罩

    当你需要对图片进行颜色调整或添加遮罩效果时,可以利用UIKit框架中的各种方法和属性来实现。下面将详细介绍如何改变UIImage的颜色以及如何应用遮罩。 1. 改变UIImage颜色: - 使用`UIImageRenderingMode....

    swift-加载图片Loading视频加载图片旋转图片

    - **元数据校正**:图片在拍摄时可能包含旋转元数据,使用`image.imageOrientation`属性可以查看和修正这种旋转。 以上所述,Swift在处理图片方面提供了丰富的原生API,同时还有许多优秀的第三方库来增强功能。...

    iOS 图片旋转动画

    在iOS开发中,图片旋转动画是一种常见的视觉效果,常用于音乐播放器、加载指示器或者各种过渡动画。本文将深入探讨如何实现一个类似音乐播放器的图片旋转动画,并在动画停止时保持图片当前的旋转角度。 首先,我们...

    UIImage-PDF.zip

    在iOS开发中,`UIImage`类是用于处理和显示图像的核心类,但默认情况下它并不支持PDF文档的显示。为了扩展`UIImage`的功能,开发者通常会创建分类(Category)来添加新的方法。`UIImage-PDF`就是这样一个Objective-C...

    UIImage+Sprite+Animmation

    在iOS开发中,`UIImage`是苹果提供的一个关键类,用于处理和显示图像。这个类扩展了`UIImage`,增加了精灵(Sprite)和动画功能,让开发者能够更灵活地创建和控制游戏或应用中的动态图像。`UIImage+Sprite+Additions...

    iOS图片压缩---UIImage+Wechat

    在iOS开发中,图片处理是一项常见且重要的任务,特别是在移动应用中,由于设备存储空间有限,用户对应用的性能和内存占用有较高要求。UIImage+Wechat 是一个专门用于图片压缩的优秀框架,旨在帮助开发者有效地减小...

    OC Extension UIImage+WaterMark(图片+水印+文字标识).zip

    /** * 给图片加水印图片 * * @param image 水印图片 ...- (UIImage*)imageWaterMarkWithImage:(UIImage *)image imageRect:(CGRect)imgRect alpha:(CGFloat)alpha; /** * 同上 * * @param image 同上 *

    UIImage+ImageEffects

    `UIImage+ImageEffects` 提供了对图片进行模糊处理的功能,这在iOS应用中常常用于创建背景模糊、视差效果或者某些特定UI元素的美学设计。这个类扩展了系统自带的`UIImage`类,添加了自定义的模糊效果方法,使得...

    WebP-UIImage-源码.rar

    这个“WebP-UIImage-源码.rar”压缩包可能包含了用Objective-C或Swift实现的iOS平台上对WebP图像格式的支持,使得开发者可以直接在UIImage对象中加载和显示WebP图片。 在iOS开发中,UIImage是苹果提供的一个关键类...

    iOS uiimage部分截取图片

    在特定场景下,我们可能需要从一个UIImage对象中部分截取图片,例如创建可拉伸的按钮背景或者实现自定义的图片效果。"stretchableImageWithLeftCapWidth"和"resizableImageWithCapInsets"这两个方法是UIImage的重要...

    swift-UIImage分类包含根据颜色生成图片等功能

    在Swift编程语言中,UIImage是处理图像的核心类,它提供了加载、显示和操作图像的各种方法。这个名为"swift-UIImage分类包含根据颜色生成图片等功能"的项目,显然扩展了UIImage的功能,通过创建一个分类(Category)...

    旋转图片很好用的实用demo.zip

    在实际的用户界面中,我们更常见的是通过UIImageView来展示图片,并通过改变UIImageView的transform属性来旋转图片。其中,transform属性是一个CATransform3D类型,它可以实现更复杂的3D旋转效果。例如,可以设置`...

    UIImage 图片处理:截图,缩放,设定大小,存储_蓝科教育

    UI 图片处理是 iOS 开发中一个非常重要的topic,UIImage 是 iOS 中表示图像的类,它提供了多种方法来处理图像,在这里我们将介绍 UIImage 图片处理的四种方法:截图、缩放、设定大小和存储。 截图 截图是将 UIView...

    iOS 录制视频流 转uiimage

    在iOS开发中,录制视频流并将其转换为UIImage是一项常见的需求,这通常涉及到多媒体处理、图形编程以及实时渲染等技术。下面将详细讲解这个过程涉及的知识点。 首先,我们需要了解如何在iOS上进行实时视频录制。...

Global site tag (gtag.js) - Google Analytics