Search code examples
iphoneuiimageviewcgaffinetransform

How to smoothen the edges of a UIImageView in iOs


Possible Duplicate:
Any quick and dirty anti-aliasing techniques for a rotated UIImageView?

I wanted to change the angle of an UIImageView in my iPhone and app i used the following code:

previewImg.transform = CGAffineTransformMakeRotation(atan2(y2-y1,x2-x1));

and I got it working and the image is below.

enter image description here

In the image, the edges of the image is not smooth. Is there any way to smoothen the edges?


Solution

  • This has been asked before, check this post here, Any quick and dirty anti-aliasing techniques for a rotated UIImageView?

    With that said, the optimal solution would be to create a 1px transparent border around your image.

    UPDATE: Here's a helper method to add a transparent border to a UIImage, referenced from here: http://vocaro.com/trevor/blog/2009/10/12/resize-a-uiimage-the-right-way/

    - (UIImage *)transparentBorderImage:(NSUInteger)borderSize {
    // If the image does not have an alpha layer, add one
    UIImage *image = [self imageWithAlpha];
    
    CGRect newRect = CGRectMake(0, 0, image.size.width + borderSize * 2, image.size.height + borderSize * 2);
    
    // Build a context that's the same dimensions as the new size
    CGContextRef bitmap = CGBitmapContextCreate(NULL,
                                                newRect.size.width,
                                                newRect.size.height,
                                                CGImageGetBitsPerComponent(self.CGImage),
                                                0,
                                                CGImageGetColorSpace(self.CGImage),
                                                CGImageGetBitmapInfo(self.CGImage));
    
    // Draw the image in the center of the context, leaving a gap around the edges
    CGRect imageLocation = CGRectMake(borderSize, borderSize, image.size.width, image.size.height);
    CGContextDrawImage(bitmap, imageLocation, self.CGImage);
    CGImageRef borderImageRef = CGBitmapContextCreateImage(bitmap);
    
    // Create a mask to make the border transparent, and combine it with the image
    CGImageRef maskImageRef = [self newBorderMask:borderSize size:newRect.size];
    CGImageRef transparentBorderImageRef = CGImageCreateWithMask(borderImageRef, maskImageRef);
    UIImage *transparentBorderImage = [UIImage imageWithCGImage:transparentBorderImageRef];
    
    // Clean up
    CGContextRelease(bitmap);
    CGImageRelease(borderImageRef);
    CGImageRelease(maskImageRef);
    CGImageRelease(transparentBorderImageRef);
    
    return transparentBorderImage;
    }