UIImageView: get transformed UIImage

后端 未结 3 712
被撕碎了的回忆
被撕碎了的回忆 2021-01-14 02:06

I\'m rotating UIImageView using this:

[UIView beginAnimations:nil context:nil];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationCurve:UI         


        
相关标签:
3条回答
  • 2021-01-14 02:23

    OK, I'm answering my own question again, hopefully it will be useful for somebody in future... Coming back to CGImageRotatedByAngle as I previously said it gives almost required effect but coordinate system translation sequence must be slighly altered. And here is the way I got the desired result:

    - (CGImageRef)CGImageRotatedByAngle:(CGImageRef)imgRef angle:(CGFloat)angle {
    
        CGFloat angleInRadians = angle * (M_PI / 180);
        CGFloat width = CGImageGetWidth(imgRef);
        CGFloat height = CGImageGetHeight(imgRef);
    
        CGRect imgRect = CGRectMake(0, 0, width, height);
        CGAffineTransform transform = CGAffineTransformMakeRotation(angleInRadians);
        CGRect rotatedRect = CGRectApplyAffineTransform(imgRect, transform);
        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    
        CGContextRef bmContext = CGBitmapContextCreate(NULL,
                                                       rotatedRect.size.width,
                                                       rotatedRect.size.height,
                                                       8,
                                                       0,
                                                       colorSpace,
                                                       kCGImageAlphaPremultipliedFirst);
        CGContextSetAllowsAntialiasing(bmContext, YES);
        CGContextSetShouldAntialias(bmContext, YES);
        CGContextSetInterpolationQuality(bmContext, kCGInterpolationHigh);
        CGColorSpaceRelease(colorSpace);
        CGContextTranslateCTM( bmContext, 0.5f * rotatedRect.size.width, 0.5f * rotatedRect.size.height ) ;
        CGContextRotateCTM(bmContext, angleInRadians);
        CGContextDrawImage(bmContext, CGRectMake(-imgRect.size.width* 0.5f, -imgRect.size.height * 0.5f,
                                                 imgRect.size.width,
                                                 imgRect.size.height),
                           imgRef);
        CGImageRef rotatedImage = CGBitmapContextCreateImage(bmContext);
        CFRelease(bmContext);
        [(id)rotatedImage autorelease];
    
        return rotatedImage;
    }
    
    0 讨论(0)
  • 2021-01-14 02:26

    Here is swift 4.1 version of heximal's answer.

    extension CGImage {
    
        func rotated(by angle: CGFloat) -> CGImage? {
            let angleInRadians = angle * .pi / 180
    
            let imgRect = CGRect(x: 0, y: 0, width: width, height: height)
            let transform = CGAffineTransform.identity.rotated(by: angleInRadians)
            let rotatedRect = imgRect.applying(transform)
            let colorSpace = CGColorSpaceCreateDeviceRGB()
    
            guard let bmContext = CGContext(
                data: nil,
                width: Int(rotatedRect.size.width),
                height: Int(rotatedRect.size.height),
                bitsPerComponent: 8,
                bytesPerRow: 0,
                space: colorSpace,
                bitmapInfo: CGImageAlphaInfo.premultipliedFirst.rawValue)
                else {
                    return nil
            }
    
            bmContext.setAllowsAntialiasing(true)
            bmContext.setShouldAntialias(true)
            bmContext.interpolationQuality = .high
            bmContext.translateBy(x: rotatedRect.size.width * 0.5, y: rotatedRect.size.height * 0.5)
            bmContext.rotate(by: angleInRadians)
            let drawRect = CGRect(
                origin: CGPoint(x: -imgRect.size.width * 0.5, y: -imgRect.size.height * 0.5),
                size: imgRect.size)
            bmContext.draw(self, in: drawRect)
    
            guard let rotatedImage = bmContext.makeImage() else { return nil }
    
            return rotatedImage
        }
    
    }
    
    0 讨论(0)
  • 2021-01-14 02:49

    it works for me , and another way to solve

    - (UIImage *)imageRotatedByDegrees:(CGFloat)degrees
    {
        CGRect imgRect = CGRectMake(0, 0, self.size.width, self.size.height);
        CGAffineTransform transform = CGAffineTransformMakeRotation(DegreesToRadians(degrees));
        CGRect rotatedRect = CGRectApplyAffineTransform(imgRect, transform);
        CGSize rotatedSize = rotatedRect.size;
    
        // Create the bitmap context
        UIGraphicsBeginImageContext(rotatedRect.size);
        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;
    }
    
    0 讨论(0)
提交回复
热议问题