High Quality Scaling of UIImage

前端 未结 4 1131
谎友^
谎友^ 2020-11-27 19:16

I need to scale the resolution of an image coming from a view layer in an iPhone application. The obvious way is to specify a scale factor in UIGraphicsBeginImageContextWit

4条回答
  •  情书的邮戳
    2020-11-27 20:00

    About UIImage resize problem, this post give many ways to handle UIImage object. The UIImage has some orientation problems need to be fixed. This and Another post will address it.


    -(UIImage*)resizedImageToSize:(CGSize)dstSize
    {
        CGImageRef imgRef = self.CGImage;
        // the below values are regardless of orientation : for UIImages from Camera, width>height (landscape)
        CGSize  srcSize = CGSizeMake(CGImageGetWidth(imgRef), CGImageGetHeight(imgRef)); // not equivalent to self.size (which is dependant on the imageOrientation)!
    
        /* Don't resize if we already meet the required destination size. */
        if (CGSizeEqualToSize(srcSize, dstSize)) {
            return self;
        }
    
        CGFloat scaleRatio = dstSize.width / srcSize.width;
    
        // Handle orientation problem of UIImage
        UIImageOrientation orient = self.imageOrientation;
        CGAffineTransform transform = CGAffineTransformIdentity;
        switch(orient) {
    
            case UIImageOrientationUp: //EXIF = 1
                transform = CGAffineTransformIdentity;
                break;
    
            case UIImageOrientationUpMirrored: //EXIF = 2
                transform = CGAffineTransformMakeTranslation(srcSize.width, 0.0);
                transform = CGAffineTransformScale(transform, -1.0, 1.0);
                break;
    
            case UIImageOrientationDown: //EXIF = 3
                transform = CGAffineTransformMakeTranslation(srcSize.width, srcSize.height);
                transform = CGAffineTransformRotate(transform, M_PI);
                break;
    
            case UIImageOrientationDownMirrored: //EXIF = 4
                transform = CGAffineTransformMakeTranslation(0.0, srcSize.height);
                transform = CGAffineTransformScale(transform, 1.0, -1.0);
                break;
    
            case UIImageOrientationLeftMirrored: //EXIF = 5
                dstSize = CGSizeMake(dstSize.height, dstSize.width);
                transform = CGAffineTransformMakeTranslation(srcSize.height, srcSize.width);
                transform = CGAffineTransformScale(transform, -1.0, 1.0);
                transform = CGAffineTransformRotate(transform, 3.0 * M_PI_2);
                break;  
    
            case UIImageOrientationLeft: //EXIF = 6  
                dstSize = CGSizeMake(dstSize.height, dstSize.width);
                transform = CGAffineTransformMakeTranslation(0.0, srcSize.width);
                transform = CGAffineTransformRotate(transform, 3.0 * M_PI_2);
                break;  
    
            case UIImageOrientationRightMirrored: //EXIF = 7  
                dstSize = CGSizeMake(dstSize.height, dstSize.width);
                transform = CGAffineTransformMakeScale(-1.0, 1.0);
                transform = CGAffineTransformRotate(transform, M_PI_2);
                break;  
    
            case UIImageOrientationRight: //EXIF = 8  
                dstSize = CGSizeMake(dstSize.height, dstSize.width);
                transform = CGAffineTransformMakeTranslation(srcSize.height, 0.0);
                transform = CGAffineTransformRotate(transform, M_PI_2);
                break;  
    
            default:  
                [NSException raise:NSInternalInconsistencyException format:@"Invalid image orientation"];  
    
        }  
    
        /////////////////////////////////////////////////////////////////////////////
        // The actual resize: draw the image on a new context, applying a transform matrix
        UIGraphicsBeginImageContextWithOptions(dstSize, NO, self.scale);
    
        CGContextRef context = UIGraphicsGetCurrentContext();
    
           if (!context) {
               return nil;
           }
    
        if (orient == UIImageOrientationRight || orient == UIImageOrientationLeft) {
            CGContextScaleCTM(context, -scaleRatio, scaleRatio);
            CGContextTranslateCTM(context, -srcSize.height, 0);
        } else {  
            CGContextScaleCTM(context, scaleRatio, -scaleRatio);
            CGContextTranslateCTM(context, 0, -srcSize.height);
        }
    
        CGContextConcatCTM(context, transform);
    
        // we use srcSize (and not dstSize) as the size to specify is in user space (and we use the CTM to apply a scaleRatio)
        CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, srcSize.width, srcSize.height), imgRef);
        UIImage* resizedImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    
        return resizedImage;
    }
    

提交回复
热议问题