2011-08-13 16 views
5

私はSDWebImageを使用して画像をテーブルビューに読み込みます。私はテーブルビューの画像のサイズを変更し、角を丸くしたいと思います。これを行うにはUIImage+Resize and UIImage+RoundedCornerが見つかりました。両方の図書館は別々に素晴らしい作品ですが、私はそれらを結合するためにablにされていません。 SDWebImageが返すイメージのコーナーをサイズ変更して丸めることができましたが、これはかなり重いリソースであることがわかりました。したがって、イメージをキャッシュに保存する前にサイズを変更したいと思います。 初めてネットから画像を読み込むときに、キャッシュに保存する前に表示されることがあるため、初めて画像を読み込んだときに画像のサイズを変更したいと考えています。UIImage + SDWebImageのRoundedCorner

SDWebImageの画像を操作する方法がわからないため、これを行うことができませんでした。必要なのは、SDWebImageの右のUIImageで以下を呼び出すことです。それは、インターネットからロードされたときにSDWebImageに私はキャッシュに保存される前に操作された画像を持っているし、イメージビューに送信された操作された画像を持っているために、コードのこの部分を置く場所

UIImage *image = [image thumbnailImage:50 transparentBorder:0 cornerRadius:5 interpolationQuality:kCGInterpolationHigh]; 

誰も教えてもらえますし、キャッシュではない?

答えて

2

私はこれを理解しました。

あなたはSDImageCache.mで、以下の方法で画像を操作する必要があります:あなたは以下のコードを使用したNSDataにあなたのUIImageに変換するために覚えておく必要があります第三の方法で

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; 

。これは、toDiskがtrueの場合に実行する必要があります。あなたはそれを保存しようとすると、あなたのデータがNULLであればクラッシュしませんif (croppedRoundedImageData) data = croppedRoundedImageData;あなたのアプリを使用して

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

。 (ないときは、キャッシュ内の)SDWebImageDownloader.mで

あなたはこれが画像の最初のロードに使用されて- (void)connectionDidFinishLoading:(NSURLConnection *)aConnectionで操作する

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; 

} 

sharedManagerに、このような代理人を使用するように指示できます。

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

私はこれをdidFinishLaunchingWithOptionsで行いました。

このアプローチでは、イメージの境界に沿ってネイティブサイズでクリップします。イメージの境界がビューの範囲外(アスペクト・フィルなど)でレンダリングされている場合は、丸いコーナーは表示されません。

この方法は、画像がレンダリングされるたびにクリッピングするよりも効果的ですが、上記の欠点に注意してください。

関連する問題