2013-12-09 3 views
2

를 성공적도의 일부만을 얻기 위해 필요한 내 응용 프로그램을 흐리게하기위한 (UIGraphicsGetImageFromCurrentImageContext() 통해) 이미지 표현을 얻기 위해 아이폰 OS 7에 도입 UIView의 새로운 drawViewHierarchyInRect:afterScreenUpdates: 방법을 사용한 후 전망. 나는 다음과 같은 방법으로 그것을 얻을 관리 :UIView의 drawViewHierarchyInRect에서 검정 (빈) 이미지를 얻기 : afterScreenUpdates :

UIImage *image; 

CGSize blurredImageSize = [_blurImageView frame].size; 

UIGraphicsBeginImageContextWithOptions(blurredImageSize, YES, .0f); 

[aView drawViewHierarchyInRect: [aView bounds] afterScreenUpdates: YES]; 

image = UIGraphicsGetImageFromCurrentImageContext(); 

UIGraphicsEndImageContext(); 

이 날의 프레임 aView '_blurImageView 다음의 내용'을 검색 할 수 있습니다.

그러나 지금은 aView의 부분을 가져와야하지만 이번에는이 부분이 "내부"가 될 것입니다. 아래는 내가 성취하고자하는 것을 나타내는 이미지입니다.

는 이미 (물론 그 슈퍼 뷰의 프레임을 새로운 그래픽 컨텍스트를 생성하고 부분의 크기 (빨간색 상자)로 크기를 설정하고 빨간색 상자의 프레임을 나타내는 RECT에 그릴 aView를 호출 시도 aView '과 같음). 그러나 얻은 이미지는 모두 검은 색 (비어 있음)입니다.

답변

3

많은 조정을 한 후에 나는이 일을 한 무언가를 찾을 수 있었지만, 나는 이것이 갈 길이 란 것에 무겁게 의심했다.

은 여기 내 [편집-에 대한 스택 오버플로] 작동 코드 :

- (UIImage *) imageOfPortionOfABiggerView 
{ 
    UIView *bigViewToExtractFrom; 

    UIImage *image; 

    UIImage *wholeImage; 

    CGImageRef _image; 

    CGRect imageToExtractFrame; 

    CGFloat screenScale = [[UIScreen mainScreen] scale]; 

    // have to scale the rect due to (I suppose) the screen's scale for Core Graphics. 

    imageToExtractFrame = CGRectApplyAffineTransform(imageToExtractFrame, CGAffineTransformMakeScale(screenScale, screenScale)); 



    UIGraphicsBeginImageContextWithOptions([bigViewToExtractFrom bounds].size, YES, screenScale); 

    [bigViewToExtractFrom drawViewHierarchyInRect: [bigViewToExtractFrom bounds] afterScreenUpdates: NO]; 

    wholeImage = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 

    // obtain a CGImage[Ref] from another CGImage, this lets me specify the rect to extract. 
    // However since the image is from a UIView which are all at 2x scale (retina) if you specify a rect in points CGImage will not take the screen's scale into consideration and will process the rect in pixels. You'll end up with an image from the wrong rect and half the size. 

    _image = CGImageCreateWithImageInRect([wholeImage CGImage], imageToExtractFrame); 

    wholeImage = nil; 

    // have to specify the image's scale due to CGImage not taking the screen's scale into consideration. 

    image = [UIImage imageWithCGImage: _image scale: screenScale orientation: UIImageOrientationUp]; 

    CGImageRelease(_image); 

    return image; 
} 

내가이 내 문제에 난처한 상황에 빠진 사람을 도움이되기를 바랍니다. 내 발언을 자유롭게 개선하십시오.

감사합니다.