• 偶尔,当拍摄从相册或图片相机拍摄照片黑色解决问题的方法,解决问题和头部转动的方法


    我尝试了很多方法,在线。无解!

    其目的是相同的,它是基于图像的方向orientation 对于旋转相应的角度,达到我们想要的效果。!

    的条形码直接观看,我曾是imagePickerController要获取的图片

    #pragma mark - UIImagePickerControllerDelegate methods
    //当选择一张图片后进入这里
    -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
    {
        //照片的处理在这里
      //  NSString *type = [info objectForKey:UIImagePickerControllerMediaType];
    //*
        UIImage *originalImage = [info objectForKey:UIImagePickerControllerOriginalImage];
        UIImageOrientation orientation = originalImage.imageOrientation;
        if (orientation == UIImageOrientationUp) {
            [self dismissViewControllerAnimated:YES completion:nil];
            _memberIconView.image = originalImage;
        }else if(orientation == UIImageOrientationRight){
            [self dismissViewControllerAnimated:YES completion:nil];
            _memberIconView.image = [originalImage imageRotatedByDegrees:90.0];
        }
    }
     
    

    这里我想说一下,在http://stackoverflow.com/上有人指出用这种方法就可以解决这个问题,但是我的问题还是存在!

    stackoverflow上的方法例如以下:

    -(UIImage *)fixOrientation
    {
        if (self.imageOrientation == UIImageOrientationUp) {
            return self;
        }
        CGAffineTransform transform;
        NSLog(@"%i",self.imageOrientation);
        switch (self.imageOrientation) {
            case UIImageOrientationDown:
            case UIImageOrientationDownMirrored:
            {
                transform = CGAffineTransformTranslate(transform, self.size.width, self.size.height);
                transform = CGAffineTransformRotate(transform, M_PI);
                break;
            }
            case UIImageOrientationLeft:
            case UIImageOrientationLeftMirrored:
            {
                transform = CGAffineTransformTranslate(transform, self.size.width, 0);
                transform = CGAffineTransformRotate(transform, M_PI_2);
                break;
            }
            case UIImageOrientationRight:
            {
                transform = CGAffineTransformTranslate(transform, 0, self.size.height);
                transform = CGAffineTransformRotate(transform, -M_PI_2);
                break;
            }
            case UIImageOrientationRightMirrored:
            {
                transform = CGAffineTransformTranslate(transform, 0, self.size.height);
                transform = CGAffineTransformRotate(transform, -M_PI_2);
                break;
            }
            default:
                break;
        }
        switch (self.imageOrientation) {
            case UIImageOrientationUpMirrored:
            case UIImageOrientationDownMirrored:
                transform = CGAffineTransformTranslate(transform, self.size.width, 0);
                transform = CGAffineTransformScale(transform, -1, 1);
                break;
                
            case UIImageOrientationLeftMirrored:
            case UIImageOrientationRightMirrored:
                transform = CGAffineTransformTranslate(transform, self.size.height, 0);
                transform = CGAffineTransformScale(transform, -1, 1);
                break;
        }
        
        CGContextRef ctx = CGBitmapContextCreate(NULL, self.size.width, self.size.height,
                                                 CGImageGetBitsPerComponent(self.CGImage), 0,
                                                 CGImageGetColorSpace(self.CGImage),
                                                 CGImageGetBitmapInfo(self.CGImage));
        CGContextConcatCTM(ctx, transform);
        switch (self.imageOrientation) {
            case UIImageOrientationLeft:
            case UIImageOrientationLeftMirrored:
            case UIImageOrientationRight:
            case UIImageOrientationRightMirrored:
                // Grr...
                CGContextDrawImage(ctx, CGRectMake(0,0,self.size.height,self.size.width), self.CGImage);
                break;
                
            default:
                CGContextDrawImage(ctx, CGRectMake(0,0,self.size.width,self.size.height), self.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;
    }
    

    最后我综合了其它方法。一起来填充UIImage的类扩展,来终于解决这个问题:

    方法:事实上他也是依据方向做出角度旋转,可是他管用

    - (UIImage *)imageRotatedByRadians:(CGFloat)radians {
        return [self imageRotatedByDegrees:radiansToDegrees(radians)];
    }
    - (UIImage *)imageRotatedByDegrees:(CGFloat)degrees {
        // calculate the size of the rotated view's containing box for our drawing space
        UIView *rotatedViewBox = [[UIView alloc] initWithFrame:CGRectMake(0,0,self.size.width, self.size.height)];
        CGAffineTransform t = CGAffineTransformMakeRotation(degreesToRadians(degrees));
        rotatedViewBox.transform = t;
        CGSize rotatedSize = rotatedViewBox.frame.size;
        // Create the bitmap context
        UIGraphicsBeginImageContext(rotatedSize);
        CGContextRef bitmap = UIGraphicsGetCurrentContext();
        // Move the origin to the middle of the image so we will rotate and scale around the center.
        CGContextTranslateCTM(bitmap, rotatedSize.width/2, rotatedSize.height/2);
        // Rotate the image context
        CGContextRotateCTM(bitmap, degreesToRadians(degrees));
        // Now, draw the rotated/scaled image into the context
        CGContextScaleCTM(bitmap, 1.0, -1.0);
        CGContextDrawImage(bitmap, CGRectMake(-self.size.width / 2, -self.size.height / 2, self.size.width, self.size.height), [self CGImage]);
        UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return newImage;
    }
    

    最后附上这个类扩展的全部源代码,直接粘贴复制就可以用:

    先是头文件:UIImage+fixOrientation.h

    #import <UIKit/UIKit.h>
    
    @interface UIImage (fixOrientation)
    - (UIImage *)fixOrientation;
    - (UIImage *)imageRotatedByRadians:(CGFloat)radians;
    - (UIImage *)imageRotatedByDegrees:(CGFloat)degrees;
    
    @end
    

    再来.m文件:UIImage+fixOrientation.m

    #import "UIImage+fixOrientation.h"
    
    CGFloat degreesToRadians(CGFloat degrees) {return degrees * M_PI / 180;};
    CGFloat radiansToDegrees(CGFloat radians) {return radians * 180/M_PI;};
    @implementation UIImage (fixOrientation)
    
    -(UIImage *)fixOrientation
    {
        if (self.imageOrientation == UIImageOrientationUp) {
            return self;
        }
        CGAffineTransform transform;
        NSLog(@"%i",self.imageOrientation);
        switch (self.imageOrientation) {
            case UIImageOrientationDown:
            case UIImageOrientationDownMirrored:
            {
                transform = CGAffineTransformTranslate(transform, self.size.width, self.size.height);
                transform = CGAffineTransformRotate(transform, M_PI);
                break;
            }
            case UIImageOrientationLeft:
            case UIImageOrientationLeftMirrored:
            {
                transform = CGAffineTransformTranslate(transform, self.size.width, 0);
                transform = CGAffineTransformRotate(transform, M_PI_2);
                break;
            }
            case UIImageOrientationRight:
            {
                transform = CGAffineTransformTranslate(transform, 0, self.size.height);
                transform = CGAffineTransformRotate(transform, -M_PI_2);
                break;
            }
            case UIImageOrientationRightMirrored:
            {
                transform = CGAffineTransformTranslate(transform, 0, self.size.height);
                transform = CGAffineTransformRotate(transform, -M_PI_2);
                break;
            }
            default:
                break;
        }
        switch (self.imageOrientation) {
            case UIImageOrientationUpMirrored:
            case UIImageOrientationDownMirrored:
                transform = CGAffineTransformTranslate(transform, self.size.width, 0);
                transform = CGAffineTransformScale(transform, -1, 1);
                break;
                
            case UIImageOrientationLeftMirrored:
            case UIImageOrientationRightMirrored:
                transform = CGAffineTransformTranslate(transform, self.size.height, 0);
                transform = CGAffineTransformScale(transform, -1, 1);
                break;
        }
        
        CGContextRef ctx = CGBitmapContextCreate(NULL, self.size.width, self.size.height,
                                                 CGImageGetBitsPerComponent(self.CGImage), 0,
                                                 CGImageGetColorSpace(self.CGImage),
                                                 CGImageGetBitmapInfo(self.CGImage));
        CGContextConcatCTM(ctx, transform);
        switch (self.imageOrientation) {
            case UIImageOrientationLeft:
            case UIImageOrientationLeftMirrored:
            case UIImageOrientationRight:
            case UIImageOrientationRightMirrored:
                // Grr...
                CGContextDrawImage(ctx, CGRectMake(0,0,self.size.height,self.size.width), self.CGImage);
                break;
                
            default:
                CGContextDrawImage(ctx, CGRectMake(0,0,self.size.width,self.size.height), self.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;
    }
    
    
    - (UIImage *)imageRotatedByRadians:(CGFloat)radians {
        return [self imageRotatedByDegrees:radiansToDegrees(radians)];
    }
    - (UIImage *)imageRotatedByDegrees:(CGFloat)degrees {
        // calculate the size of the rotated view's containing box for our drawing space
        UIView *rotatedViewBox = [[UIView alloc] initWithFrame:CGRectMake(0,0,self.size.width, self.size.height)];
        CGAffineTransform t = CGAffineTransformMakeRotation(degreesToRadians(degrees));
        rotatedViewBox.transform = t;
        CGSize rotatedSize = rotatedViewBox.frame.size;
        // Create the bitmap context
        UIGraphicsBeginImageContext(rotatedSize);
        CGContextRef bitmap = UIGraphicsGetCurrentContext();
        // Move the origin to the middle of the image so we will rotate and scale around the center.
        CGContextTranslateCTM(bitmap, rotatedSize.width/2, rotatedSize.height/2);
        // Rotate the image context
        CGContextRotateCTM(bitmap, degreesToRadians(degrees));
        // Now, draw the rotated/scaled image into the context
        CGContextScaleCTM(bitmap, 1.0, -1.0);
        CGContextDrawImage(bitmap, CGRectMake(-self.size.width / 2, -self.size.height / 2, self.size.width, self.size.height), [self CGImage]);
        UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return newImage;
    }
    @end
    


    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    OC MRC之循环引用问题(代码分析)
    OC MRC之 @property参数(代码分析)
    OC MRC之set方法内存管理(代码分析)
    OC MRC之多对象之间管理(代码分析)
    OC MRC之计数器的基本操作(代码分析)
    最流行的android组件大全
    Android主题切换方案总结
    Picasso – Android系统的图片下载和缓存类库
    Android无法导入下载好的项目(和Eclipse中已经存在的项目命名一样导致冲突)解决办法
    Android Studio 简单设置
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4904094.html
Copyright © 2020-2023  润新知