UIImage created from CGImageRef fails with UIImagePNGRepresentation

前端 未结 4 1396
栀梦
栀梦 2021-01-01 23:00

I\'m using the following code to crop and create a new UIImage out of a bigger one. I\'ve isolated the issue to be with the function CGImageCreateWithImageInRect() which see

4条回答
  •  既然无缘
    2021-01-01 23:33

    I had the same problem, but only when testing compatibility on iOS 3.2. On 4.2 it works fine.

    In the end I found this http://www.hive05.com/2008/11/crop-an-image-using-the-iphone-sdk/ which works on both, albeit a little more verbose!

    I converted this into a category on UIImage:

    UIImage+Crop.h

    @interface UIImage (Crop)
    - (UIImage*) imageByCroppingToRect:(CGRect)rect;
    @end
    

    UIImage+Crop.m

    @implementation UIImage (Crop)
    
    - (UIImage*) imageByCroppingToRect:(CGRect)rect
    {
        //create a context to do our clipping in
        UIGraphicsBeginImageContext(rect.size);
        CGContextRef currentContext = UIGraphicsGetCurrentContext();
    
        //create a rect with the size we want to crop the image to
        //the X and Y here are zero so we start at the beginning of our
        //newly created context
        CGRect clippedRect = CGRectMake(0, 0, rect.size.width, rect.size.height);
        CGContextClipToRect( currentContext, clippedRect);
    
        //create a rect equivalent to the full size of the image
        //offset the rect by the X and Y we want to start the crop
        //from in order to cut off anything before them
        CGRect drawRect = CGRectMake(rect.origin.x * -1,
                                     rect.origin.y * -1,
                                     self.size.width,
                                     self.size.height);
    
        //draw the image to our clipped context using our offset rect
        CGContextTranslateCTM(currentContext, 0.0, rect.size.height);
        CGContextScaleCTM(currentContext, 1.0, -1.0);
        CGContextDrawImage(currentContext, drawRect, self.CGImage);
    
        //pull the image from our cropped context
        UIImage *cropped = UIGraphicsGetImageFromCurrentImageContext();
    
        //pop the context to get back to the default
        UIGraphicsEndImageContext();
    
        //Note: this is autoreleased
        return cropped;
    }
    
    
    @end
    

提交回复
热议问题