2013-10-14 78 views
2

所以我有一個UIImage,我想裁剪。我查找並發現了針對CIImage的imageByCroppingToRect方法。所以,我將數據轉換爲CIImage而不是UIImage,使用指定的方法裁剪它,然後將生成的CIImage轉換爲UIImage,然後將其顯示在UIImageView中。將UIImage轉換爲CIImage以裁剪爲CGRect。 AVFoundation

我的代碼是

NSData *data = [[NSData alloc]initWithData:[def objectForKey:@"imageData"]]; 
//UIImage *normalImage = [[UIImage alloc]initWithData:data]; 
CIImage *originalImage = [CIImage imageWithData:data]; 
[originalImage imageByCroppingToRect:CGRectMake(10, 72, 300, 300)]; 

self.imageView.image = [UIImage imageWithCIImage:originalImage]; 

的問題是圖像被旋轉90度,我不知道,如果是被裁剪它。該圖像是使用設備的相機拍攝的。我使用AVFoundation來訪問相機。我的會話預設爲AVCaptureSessionPresetPhoto。我認爲這就是爲什麼我得到縮放。

+0

圖像可能旋轉,因爲圖像處於另一個方向並使用EXIF標記翻轉。一些圖像格式如JPEG使用有損壓縮。旋轉並重新保存圖像以糾正方向會進一步壓縮圖像。因此圖像本身被保留,但是元數據被引入意味着「該圖像應該被旋轉90,180或270度」。 – Jesper

回答

3
CGRect rect = CGRectMake(10, 72, 300, 300); 
CGImageRef imref = CGImageCreateWithImageInRect([yourOriginalImage CGImage], rect); 
UIImage *newSubImage = [UIImage imageWithCGImage:imref]; 

試試這個。可以幫助你。

編輯:

首先固定圖像取向: 參:https://github.com/j3r3miah/mapmatic-ios/blob/master/Mapmatic/UIImage+FixOrientation.m

然後使用上面的代碼圖像裁剪爲指定的Rect。

+0

不起作用,我仍然有旋轉問題。此外,它使用這種技術動物園很多。 – nupac

+0

如果你的圖像是視網膜圖像,那麼你需要像CGRectMake(20,144,600,600) – Nookaraju

+0

我仍然得到縮放。我從相機中獲取此圖像。我使用AVFoundation來訪問相機。我的會議預設是'AVCaptureSessionPresetPhoto'。你認爲這是爲什麼發生這種情況? – nupac

1

不是一個真正的回答你的問題,但回答您的問題

https://github.com/mbcharbonneau/UIImage-Categories

尤其是這個文件:https://github.com/mbcharbonneau/UIImage-Categories/blob/master/UIImage%2BResize.m

- (UIImage *)croppedImage:(CGRect)bounds { 
    CGFloat scale = MAX(self.scale, 1.0f); 
    CGRect scaledBounds = CGRectMake(bounds.origin.x * scale, bounds.origin.y * scale, bounds.size.width * scale, bounds.size.height * scale); 
    CGImageRef imageRef = CGImageCreateWithImageInRect([self CGImage], scaledBounds); 
    UIImage *croppedImage = [UIImage imageWithCGImage:imageRef scale:self.scale orientation:UIImageOrientationUp]; 
    CGImageRelease(imageRef); 
    return croppedImage; 
} 

你會發現有所有你需要裁剪圖像

+0

是有道理的。謝謝 – nupac