如何扩大和裁剪UIImage?

时间:2010-09-04 03:22:13

标签: iphone objective-c uiimage scale cgaffinetransform

这是我的代码,但它正在崩溃......任何想法?

UIImage *tempImage = [[UIImage alloc] initWithData:imageData];
CGImageRef imgRef = [tempImage CGImage];
 [tempImage release];

 CGFloat width = CGImageGetWidth(imgRef);
 CGFloat height = CGImageGetHeight(imgRef);
 CGRect bounds = CGRectMake(0, 0, width, height);
 CGSize size = bounds.size;

 CGAffineTransform transform = CGAffineTransformMakeScale(4.0, 4.0);

 UIGraphicsBeginImageContext(size);
 CGContextRef context = UIGraphicsGetCurrentContext();
 CGContextConcatCTM(context, transform);
 CGContextDrawImage(context, bounds, imgRef);
 UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
 UIGraphicsEndImageContext();

我在这里缺少什么?基本上只是尝试缩放图像并将其裁剪为与原始图像相同的尺寸。

由于

2 个答案:

答案 0 :(得分:1)

问题在于这一行:

CGImageRef imgRef = [tempImage CGImage];

或者更确切地说,这条线的直接跟进:

[tempImage release];

您在这里获得了一个CF对象CGImageRef。 Core Foundation对象仅具有保留/释放内存管理,但没有自动释放的对象。因此,当您在第二行中释放UIImage时,CGImageRef也将被删除。这再次意味着当你试图将它绘制在那里时它是未定义的。

我可以想到三个修复:

  • 使用autorelease延迟图片的发布:[tempImage autorelease];
  • 将版本移至方法的最底部
  • 使用CFRetainCFRelease保留并发布图片。

答案 1 :(得分:0)

试试这个:

-(CGImageRef)imageCapture
{
    UIGraphicsBeginImageContext(self.view.bounds.size);
   [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
   UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
   UIGraphicsEndImageContext();
   CGRect rect= CGRectMake(0,0 ,320, 480);

   CGImageRef imageRef = CGImageCreateWithImageInRect([viewImage CGImage], rect);
   return imageRef;
}

每当您想要捕捉屏幕时,请使用以下行

UIImage *captureImg=[[UIImage alloc] initWithCGImage:[self imageCapture]];