2012-08-07 9 views
0

경계선이있는 UIImage를 성공적으로 다시 그리지 만 테두리 + 그림자는 다시 그리지 못했습니다. 아래의 코드는 이미지를 흰색 테두리로 성공적으로 그립니다. 그러나 테두리 아래에 그림자를 포함하는 방법을 알아낼 수 없습니다. 도움이 대단히 감사합니다!UIImage에 테두리 및 그림자 그리기

- (UIImage *)generatePhotoFrameWithImage:(UIImage *)image { 
CGSize newSize = CGSizeMake(image.size.width + 50, image.size.height + 60); 
UIGraphicsBeginImageContext(newSize); 
CGRect rect = CGRectMake(25, 35, image.size.width, image.size.height); 
[image drawInRect:rect blendMode:kCGBlendModeNormal alpha:1.0]; 

CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextSetRGBStrokeColor(context, 1.0, 1.0, 1.0, 1.0); 
CGContextStrokeRectWithWidth(context, CGRectMake(25, 35, image.size.width, image.size.height), 50); 

//CGContextSetShadowWithColor(context, CGSizeMake(0, -60), 5, [UIColor blackColor].CGColor); 

UIImage *result = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

return result; } 

추 신 : 전체 이미지 품질을 유지해야하기 때문에 UIImageView를 사용하지 않습니다.

+0

'UIImageView'는 어떤 점에서 이미지 품질을 잃게됩니까? –

+0

그림자/테두리를 적용한 후 이미지를 파일로 출력 할 수 있어야했습니다. UIImageView를 PNG/BMP로 렌더링 할 수 있지만 UIImageView의 크기 만 나오게됩니다. – thedeveloper3124

답변

9

국경을 그 으려면 먼저 CGContextSetShadowWithColor으로 전화해야 테두리가 그림자가됩니다.

경계선을 사용하여 이미지에 그림자를 넣지 않으려면 이미지와 테두리를 모두 그릴 투명도 레이어를 설정해야합니다. Quartz 2D Programming Guide에서 투명 필름 레이어에 대해 읽을 수 있습니다.

이미지 품질을 유지하려면 UIGraphicsBeginImageContextWithOptions을 사용하고 원본 이미지의 크기를 전달해야합니다.

- (UIImage *)generatePhotoFrameWithImage:(UIImage *)image { 
    CGSize newSize = CGSizeMake(image.size.width + 50, image.size.height + 60); 
    CGRect rect = CGRectMake(25, 35, image.size.width, image.size.height); 

    UIGraphicsBeginImageContextWithOptions(newSize, NO, image.scale); { 
     CGContextRef context = UIGraphicsGetCurrentContext(); 

     CGContextBeginTransparencyLayer(context, NULL); { 
      [image drawInRect:rect blendMode:kCGBlendModeNormal alpha:1.0]; 

      CGContextSetRGBStrokeColor(context, 1.0, 1.0, 1.0, 1.0); 
      CGContextSetShadowWithColor(context, CGSizeMake(0, 5), 5, [UIColor blackColor].CGColor); 
      CGContextStrokeRectWithWidth(context, CGRectMake(25, 35, image.size.width, image.size.height), 50); 
     } CGContextEndTransparencyLayer(context); 
    } 
    UIImage *result = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return result; 
} 
+2

들여 쓰기 스타일을 좋아합니다! +1 –

4

나에게 올바른 방향을 알려 주셔서 감사합니다. 이것은 이미지 주위에 흰색 테두리를 그리고 마지막으로 테두리 바깥쪽에 밝은 회색 그림자를 그려주는 최종 코드입니다.

- (UIImage *)generatePhotoStackWithImage:(UIImage *)image { 
CGSize newSize = CGSizeMake(image.size.width + 70, image.size.height + 70); 
CGRect rect = CGRectMake(25, 25, image.size.width, image.size.height); 

UIGraphicsBeginImageContextWithOptions(newSize, NO, image.scale); { 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    //Shadow 
    CGContextSetShadowWithColor(context, CGSizeMake(0, 0), 10, [UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:0.5f].CGColor); 

    CGContextBeginTransparencyLayer (context, NULL); 
    //Draw 
    [image drawInRect:rect blendMode:kCGBlendModeNormal alpha:1.0]; 
    CGContextSetRGBStrokeColor(context, 1.0, 1.0, 1.0, 1.0); 
    CGContextStrokeRectWithWidth(context, rect, 40); 
    CGContextEndTransparencyLayer(context); 
} 
UIImage *result = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

return result; 
} 
+1

당신은 그의 대답을 받아 들여야합니다. ;) – Baub