2011-08-13 3 views
5

SDWebImage을 사용하여 이미지를 내 테이블보기에로드하고 있습니다. 테이블보기의 이미지를 크기를 조정하고 둥근 모서리를 갖게하고 싶습니다. 이 작업을 수행하려면 UIImage+Resize and UIImage+RoundedCorner이 필요합니다. 두 라이브러리는 별개로 훌륭하게 작동하지만 나는 그들을 결합하기 위해 abl되지 않았습니다. 크기를 조정할 수 있고 SDWebImage 이미지의 모서리를 둥글게 만들 수는 있지만 꽤 무거운 자원이므로 캐시에 저장하기 전에 크기가 조정 된 이미지를 갖고 싶습니다. 처음으로 이미지가 넷에서로드 될 때 캐시에 저장되기 전에 표시 될 것이므로 처음으로 이미지를로드 할 때 이미지의 크기를 조정하고 싶습니다.SDWebImage가 포함 된 UIImage + RoundedCorner

내가 SDWebImage의 이미지를 조작하는 방법을 알아낼 수 없어이 작업을 수행 할 수 없었습니다. 필요한 것은 SDWebImage의 오른쪽 UIImage에서 다음을 호출하는 것입니다.

UIImage *image = [image thumbnailImage:50 transparentBorder:0 cornerRadius:5 interpolationQuality:kCGInterpolationHigh]; 
SDWebImage에서 나는 이미지가 캐시에 저장되기 전에 조작과는 인터넷에서로드 될 때 조작 된 이미지가 이미지보기로 보낸이 코드의 조각을 배치해야하는 위치

사람이 말해 줄 수 및 캐시가 아닌가?

답변

2

나는 이것을 알아 냈다.

당신은 SDImageCache.m에서 다음과 같은 방법으로 이미지를 조작해야합니다

1. - (void)storeImage:(UIImage *)image forKey:(NSString *)key; 
2. - (void)storeImage:(UIImage *)image forKey:(NSString *)key toDisk:(BOOL)toDisk; 
3. - (void)storeImage:(UIImage *)image imageData:(NSData *)data forKey:(NSString *)key toDisk:(BOOL)toDisk; 

를 아래의 코드를 사용을 NSData에있는 UIImage을 변환하는 것을 기억해야하는 세 번째 방법. toDisk이 참일 경우이 작업을 수행해야합니다. 당신이 그것을 저장하려고하면 데이터가 NULL 경우 충돌하지 않습니다 if (croppedRoundedImageData) data = croppedRoundedImageData; 귀하의 응용 프로그램을 사용

NSData *croppedRoundedImageData = UIImageJPEGRepresentation(croppedRoundedImage, 1.0); 
if (croppedRoundedImageData) data = croppedRoundedImageData; 

. 당신이 - (void)connectionDidFinishLoading:(NSURLConnection *)aConnection이을에 조작하기위한 코드를 추가해야합니다 SDWebImageDownloader.m에서

은 (하지 않을 때 캐시)

0

이 위대한 발견되는 이미지의 첫 번째로드에 사용됩니다,하지만 난에 의해 당신을 추가하는 것을 발견 SDWebImageDownloader.m의 이미지 조작 코드. SDWebImage를 사용하여 모든 이미지에 대한 축소판을 만듭니다. 내가 한 것은 SDWebImageManager 인스턴스를 생성했다 및 방법 사용 : 이미지가 내가 제대로을 연결하는 방법을 찾기 위해 노력하고있어 다른 시간에 와서 때문에

- (void) webImageManager:(SDWebImageManager *)imageManager didFinishWithImage:(UIImage *)image; 

는 이미지를 만들 수를, 유일한 문제는 동작.

그럼에도 불구하고 훌륭한 답변입니다.

6

크기 조정 이미지 부분에 대해서는 좋은 답변이 없습니다.

둥근 모서리 기능의 경우 완전히 잘못된 방향으로 가고 있습니다. 이것은 이전에 시도한 것입니다. 모든 이미지의 크기를 조정하고 디스크에 저장하려고 시도하십시오 ....... 복잡하고, 할 일이 너무 많아 ...

정확하고 간단한 방법은 테이블 셀의 UIImageView에 CornerRadius를 설정하는 것입니다 :

cell.imageView.layer.cornerRadius = 8; 
cell.imageView..layer.masksToBounds = YES; 
+1

빠르고 쉬운 방법이지만 성능에 영향을줍니다. 모서리가 잘린 이미지를 렌더링하면 테이블 뷰 성능이 향상됩니다. – gavrix

0

임 나에게 파일을 수정할 수있는 기능을 제공하지 않습니다 SDWebImage 프레임 워크를 사용하지만 난 전역 함수와 같은이 이 :

 + (UIImage*)circleImageWithImage:(UIImage*)image 
     { 
      UIImageView* imageView = [[UIImageView alloc] initWithImage:image]; 
      CALayer *layer = [imageView layer]; 
      [layer setMasksToBounds:YES]; 
      [layer setCornerRadius:imageView.frame.size.width/2]; 

      UIGraphicsBeginImageContext(image.size); 
      [layer renderInContext:UIGraphicsGetCurrentContext()]; 
      UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
      UIGraphicsEndImageContext(); 
      return newImage; 
     } 

및 글로벌 연료 소모량은 다음과 같이 이미지의 크기를 조절하기 :

 + (UIImage*)imageWithImage:(UIImage*)image scaledToSize:(CGSize)newSize; 
     { 
      UIGraphicsBeginImageContext(newSize); 
      [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)]; 
      UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); 
      UIGraphicsEndImageContext(); 
      return newImage; 
     } 
1

SDWebImageManagerDelegate 프로토콜이 당신이 찾고있는 프로토콜입니다.

https://github.com/rs/SDWebImage/blob/master/SDWebImage/SDWebImageManager.h#LC96

나는 우리가 내 AppDelegate에 클래스에 필요한 방법을 구현했습니다.

#pragma mark - SDWebImageManagerDelegate 

-(UIImage*) imageManager:(SDWebImageManager *)imageManager transformDownloadedImage:(UIImage *)image withURL:(NSURL *)imageURL{ 

    UIGraphicsBeginImageContextWithOptions(image.size, NO, [UIScreen mainScreen].scale); 

    CGRect box = CGRectMake(0, 0, image.size.width, image.size.height); 
    // Add a clip before drawing anything, in the shape of an rounded rect 
    [[UIBezierPath bezierPathWithRoundedRect:box 
           cornerRadius:15.f] addClip]; 
    // Draw your image 
    [image drawInRect:box]; 

    // Get the image, here setting the UIImageView image 
    UIImage* ret = UIGraphicsGetImageFromCurrentImageContext(); 

    // Lets forget about that we were drawing 
    UIGraphicsEndImageContext(); 
    return ret; 

} 

공유 관리자에게 이와 같이 위임자를 사용하도록 알릴 수 있습니다.

SDWebImageManager* imageManager = [SDWebImageManager sharedManager]; 
imageManager.delegate = self; 

나는 이것을 FinishedLaunchingWithOptions에서 수행했다.

이 방법은 이미지의 경계를 따라 네이티브 크기로 자릅니다. 이미지의 범위가 뷰의 경계 (애스펙트 - 채우기 등) 밖에서 렌더링되는 경우 둥근 모서리가 보이지 않습니다.

이 방법은 이미지가 렌더링 될 때마다 클리핑하는 것보다 효과적이지만 위의 단점을 알고 있어야합니다.