2011-08-13 15 views
5

मैं अपने टेबल व्यू में छवियों को लोड करने के लिए SDWebImage का उपयोग कर रहा हूं। मैं अपनी तालिका में छवियों का आकार बदलना चाहता हूं और गोल कोनों को देखना चाहता हूं। ऐसा करने के लिए मुझे UIImage+Resize and UIImage+RoundedCorner मिला। दोनों पुस्तकालय बहुत अलग काम करते हैं लेकिन मैं उन्हें गठबंधन करने के लिए abl नहीं किया गया है। मैं छवि एसडीवेब इमेज रिटर्न के कोनों का आकार बदल सकता हूं और गोल कर सकता हूं लेकिन मुझे यह काफी संसाधन होने के लिए मिला है और इसलिए मैं उन्हें कैश में सहेजने से पहले छवियों का आकार बदलना चाहता हूं। जब पहली बार नेट से एक छवि लोड की जाती है तो इसे कैश में सहेजने से पहले दिखाया जाता है इसलिए मैं पहली बार लोड होने पर छवि का आकार बदलना चाहूंगा।UIImage + RoundedCorner SDWebImage

मैं ऐसा करने में सक्षम नहीं हूं क्योंकि मैं यह नहीं समझ सकता कि एसडीवेब इमेज की किस विधि में छवि का उपयोग करने के लिए। मुझे बस एसडीवेब इमेज में सही यूआईएममेज पर कॉल करना है।

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

किसी को भी मुझे बता सकते हैं जहां SDWebImage में मैं कोड के इस टुकड़े जगह चाहिए छवि कैश में सहेजा जा रहा से पहले चालाकी और जब यह इंटरनेट से भरी हुई है एक चालाकी छवि छवि को देखने के लिए भेज दिया है करने के लिए और कैश नहीं?

उत्तर

2

मैंने इसे समझ लिया। तीसरी विधि आप नीचे दिए गए कोड का उपयोग कर 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; 

:

आप SDImageCache.m में निम्न विधियों में छवि हेरफेर करना चाहिए। यह किया जाना चाहिए यदि toDisk सच है।

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

क्रैश नहीं करेंगे तो आपको अपने डेटा NULL है जब आप इसे बचाने की कोशिश 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; 
     } 

और वैश्विक funtion इस तरह छवि को मापना:

 + (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; 

मैंने ऐसा किया था फिनिशलांचिंगविथऑप्शन।

ध्यान रखें कि यह दृष्टिकोण छवि के मूल आकार पर छवि के सीमाओं के साथ क्लिप करता है। यदि आपकी छवि की सीमाएं आपके दृश्य की सीमाओं (पहलू भरने आदि) के बाहर प्रस्तुत की जा रही हैं, तो आप गोलाकार कोनों को नहीं देख पाएंगे।

यह दृष्टिकोण छवि को क्लिप करने से हर बार क्लिपिंग करने से अधिक प्रदर्शनकारी होता है, लेकिन उपर्युक्त नुकसान से अवगत रहें।