2013-12-09 4 views
2

UIBezierPath을 사용하여 UIImage을 불규칙한 모양으로 자르려고합니다. 이 의도 한대로 작동레이어 마스크를 적용한 후 내 이미지의 크기가 줄어 듭니다.

- (void)maskImageView:(UIImageView *)image 
{ 
    UIBezierPath *path = [self getPath]; 
    CGRect rect = CGRectZero; 
    rect.size = image.image.size; 
    CAShapeLayer *shapeLayer = [CAShapeLayer layer]; 
    shapeLayer.frame = CGRectMake(0, 0,image.frame.size.width, image.frame.size.height); 
    shapeLayer.path = path.CGPath; 
    shapeLayer.fillColor = [[UIColor whiteColor] CGColor]; 
    shapeLayer.backgroundColor = [[UIColor clearColor] CGColor]; 
    [image.layer setMask:shapeLayer]; 
} 

내가 올바르게 마스크 UIImageView를 얻을 : 이 내가 관심 해요 UIImage 포함 UIImageView 마스크 방법이다. 그러나 나는 다른 이미지 위에 그릴 수 있도록 밑바닥 UIImage을 얻고 싶습니다. 이것은 내가 얼마나입니다 UIImage :

-(UIImage *)getCroppedImageForView:(UIImageView *)view{ 
    CGSize size = view.layer.bounds.size; 
    UIGraphicsBeginImageContext(size); 
    [view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return image; 
} 
내가 다음 이미지를 그려 카메라 롤에 저장

: 나는 저장된 이미지를 볼 때

-(UIImage *)drawImage:(UIImage*)image 
{ 
    UIGraphicsBeginImageContext(image.size); 
    [image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)]; 
    UIImage *finalImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    UIImageWriteToSavedPhotosAlbum(finalImage, nil, nil, nil); 
    return finalImage; 
} 

나는 그것이보다 작은 것을 알 수 있습니다 이미지 가장자리 주위에 UIBezierPath을 그렸지만 원본 사진 (실제로는 자르지 않음). 동일한 방법을 사용하여 다른 이미지를 그리고 저장하고 그들은 올바르게 나온다. 그래서 나는 문제가 getCroppedImageForView 메쏘드에 있다고 확신한다. 누구나 올바른 방향으로 나를 가리킬 수 있습니까?

EDIT

이미지는 크기가 아이폰 5 때문에 기기의 카메라를 사용하여 캡처되어 이미지를 포함 UIImageView의 3264 × 2448 크기는 : 320x568 및 contentModeUIViewContentModeScaleAspectFit이다. 내가 원하는 것은 전체 크기 (3264x2448)의 자른 이미지를 가져 와서 다른 이미지 (같은 크기) 위에 그립니다.

답변

1

생각의 몇 가지 : 당신은 이미지보기 320x568 점이라고하지만 이미지 자체는 3264 × 2448 픽셀 있습니다

  1. . 주요 관찰 결과 UIGraphicsBeginImageContext... 함수는 UIImageView을 렌더링하여 UIImage을 생성하므로 결과 이미지의 크기는 UIKit 컨트롤의 크기와 연결되며 실제 원본 크기와 거의 관계가 없을 수 있습니다. UIImage

  2. getCroppedImageForView에는 장치의 scale은 고려하지 않았습니다. 특히 망막 해상도 (320x568 픽셀의 이미지 생성)는 처리하지 않는 것이 좋습니다. 일반적으로 다음과 같이 할 거라고 : 마지막 옵션 0UIGraphicsBeginImageContextWithOptions을 사용하여

    - (UIImage *)imageForView:(UIView *)view 
    { 
        UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, 0); 
        [view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
        UIGraphicsEndImageContext(); 
        return image; 
    } 
    

    를, 디바이스의 규모를 반영하고, 망막 화면에는 640x1136 픽셀 이미지를 생성합니다.

  3. maskImageView에 대한 약간의 단순화 : 기본적으로 계층을 추가 할 때, 그것은 이미지 뷰와 동일한 프레임을 사용합니다, 그래서 당신은 산출 전부 frame 변수의 설정을 제거 할 수 있습니다 :

    - (void)maskImageView:(UIImageView *)imageView 
    { 
        UIBezierPath *path = [self getPath]; 
        CAShapeLayer *shapeLayer = [CAShapeLayer layer]; 
        shapeLayer.path = path.CGPath; 
        shapeLayer.fillColor = [[UIColor whiteColor] CGColor]; 
        shapeLayer.backgroundColor = [[UIColor clearColor] CGColor]; 
        [imageView.layer setMask:shapeLayer]; 
    } 
    
  4. drawImage에서 이미지를 다시 렌더링 할 필요가 없습니다. 이미 image입니다.그러니 그냥 사용 UIImage 직접 그 :

    - (void)writeToSavedPhotosAlbum:(UIImage*)image 
    { 
        UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil); 
    } 
    

    하지만 당신이 정말로 이미지를 다시 렌더링하기를 원한다면, 당신은 여분의 해상도를 즐기고, 내가 위의 점 2에 도시 같은 UIGraphicsBeginImageContextWithOptions 구문을 사용하십시오 그 망막 장치 제공합니다.

위의 변경으로 인해 이미지의 크기가 조금 더 커지지 만 원래 이미지의 3268x2448 픽셀보다 훨씬 작습니다. 당신이 정말로 3268x2448 픽셀 최종 이미지를 만들려면, 나 밖으로 뛰어 두 가지 옵션이 있습니다 :

  1. 하나의 옵션은 이미지보다 정확하게 (또는 이미지와 같은 크기로 볼 수 있도록하는 것입니다, 같은 크기를 화면 크기로 나눈 값). 이 이미지 뷰를 스크롤 뷰에 배치하고 줌 눈금을 적절하게 설정할 수 있습니다.

  2. 다른 옵션은 이미지 렌더링을 위해 UIKit을 포기하고 코어 이미지 (코드의 주요 리팩토링)로 이동하는 것입니다.

그런데 큰 이미지는 훨씬 느리고 많은 메모리를 소비합니다. 압축되지 않은 내부 크기는 각각 30MB를 초과합니다.

+0

감사합니다. 나는 당신의 제안에 따라 약간의 코드를 변경했다. 나는 여전히 전체 크기 자른 이미지를 얻을 수 없다. (좀 더 자세한 내용이있는 편집 된 질문을 참조하십시오.) – Gad

+0

@ G.M 아주 좋습니다. 나는 당신이 다루고있는 이미지의 크기에 대한 정보를 주어 내 대답을 분명히했습니다. – Rob

+0

고마워요. 나는 제대로 작동하려면 어떻게해야하는지 이해합니다. – Gad

관련 문제