2012-08-31 10 views
8

Wie kann ich die Größe von Bildern ändern, skalieren und zuschneiden, die von der URL stammen, bevor Sie sie zwischenspeichern? Ich habe versucht, dies mit dem folgenden Code zu erreichen.SDWebImage Ändern der Größe/Skalierung/Zuschneiden von Bildern aus der URL vor dem Zwischenspeichern

[cell.profilePicture setImageWithURL:[NSURL URLWithString:[rowData objectForKey:@"pictureUrl"]] placeholderImage:nil]; 
cell.profilePicture.image = [self imageByScalingAndCroppingForSize:CGSizeMake(cell.profilePicture.frame.size.width, cell.profilePicture.frame.size.height) image:cell.profilePicture.image]; 

Dies führte zu einem seltsamen Ergebnis. Zuerst wird eine nicht skalierte/skalierte/beschnittene Version angezeigt. Aber wenn ich nach unten scrolle und dann zurück gehe, wird eine skalierte/skalierte/beschnittene Version angezeigt. Ich weiß, dass dieser Code zuerst Bilder zwischenspeichert und sie skaliert/skaliert/zuschneidet. Aber ich konnte keine bessere Lösung finden. Ich denke, es sollte etwas geben, das das Herunterladen von Bildern ermöglicht, um die Größe/Skalierung/Zuschneiden und Zwischenspeichern unabhängig voneinander zu ändern. Irgendwelche Ideen?

Vielen Dank.

Antwort

13

Ich habe die Lösung selbst gefunden.

Statt

[cell.profilePicture setImageWithURL:[NSURL URLWithString:[rowData objectForKey:@"pictureUrl"]] placeholderImage:nil]; 

welche Downloads und speichert Bilder automatisch, verwenden Sie diese

SDWebImageManager *manager = [SDWebImageManager sharedManager]; 
[manager downloadWithURL:url delegate:self options:0 success:^(UIImage *image) 
{ 
    cell.profilePicture.image = [self imageByScalingAndCroppingForSize:CGSizeMake(cell.profilePicture.frame.size.width, cell.profilePicture.frame.size.height) image:image]; 
} failure:nil]; 

nicht

#import <SDWebImage/UIImageView+WebCache.h> 
@interface YourViewController : UIViewController <SDWebImageManagerDelegate> 
+0

Sukhrob, ich habe eine Alternative zu dieser Antwort hinzugefügt. Ich habe SDWebImage modifiziert, um dies zu tun. – Tony

+8

Diese Größe wird vor dem Caching nicht geändert. Die Größe ändert sich ** jedesmal ** wenn das Bild heruntergeladen wird oder heruntergeladen wird. Der Completion-Block wird ** nach ** Caching genannt. Das beantwortet deine Frage nicht. [This does.] (Http://stackoverflow.com/questions/12928103/sdwebimage-process-images-before-caching) –

1

Das war ein großartiges Beispiel enthalten Vergessen, wie man implementieren Sie mit SDWebImageManagerDelegate. http://worl.co/

#import <Foundation/Foundation.h> 
#import <SDWebImage/SDWebImageManager.h> 

@interface ImageLoader : NSObject <SDWebImageManagerDelegate> 
+ (instancetype)sharedImageLoader; 
@end 

@implementation ImageLoader 

+ (instancetype)sharedImageLoader 
{ 
    static ImageLoader* loader = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     loader = [[ImageLoader alloc] init]; 
    }); 

    return loader; 
} 

- (UIImage *)imageManager:(SDWebImageManager *)imageManager 
transformDownloadedImage:(UIImage *)image 
       withURL:(NSURL *)imageURL 
{ 
    // Place your image size here 
    CGFloat width = 50.0f; 
    CGFloat height = 50.0f; 
    CGSize imageSize = CGSizeMake(width, height); 

    UIGraphicsBeginImageContext(imageSize); 
    [image drawInRect:CGRectMake(0, 0, width, height)]; 
    image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return image; 
} 

@end 

Then just add the delegate where needed. 

[SDWebImageManager sharedManager].delegate = [ImageLoader sharedImageLoader]; 
3

Wenn Sie Skala wollenUIImage, versuchen auf diese Weise:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

     SDWebImageManager *manager = [SDWebImageManager sharedManager]; 
     [manager downloadImageWithURL:[NSURL URLWithString:yourPhotoURL] 
           options:SDWebImageRefreshCached 
          progress:nil 
          completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { 
       CGSize size = CGSizeMake(50,50);//width,height 
       imageView.image = [self imageWithImage:image scaledToSize:size]; 
      }]; 
    } 
- (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize{ 
    UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0); 
    [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)]; 
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return newImage; 
} 

imageWithImage Methode Quelle: The simplest way to resize an UIImage?

0

Wenn jemand sucht swift-3-Version

self.postImage.sd_setImage(with: URL(string: image)!, placeholderImage: UIImage(named: "image_placeholder"),options: SDWebImageOptions(rawValue: 0), 
     completed: { (image, error, cacheType, imageURL) in 
     //Scale or do what ever you want to do to the image   
     let newImage = self.scaleImage(image: image!, view: self.postImage) 
     self.postImage.image = newImage 
    }) 


func scaleImage(image:UIImage, view:UIImageView) -> UIImage { 

     let oldWidth = image.size.width 
     let oldHeight = image.size.height 

     var scaleFactor:CGFloat 
     var newHeight:CGFloat 
     var newWidth:CGFloat 
     let viewWidth:CGFloat = view.width 

     if oldWidth > oldHeight { 

      scaleFactor = oldHeight/oldWidth 
      newHeight = viewWidth * scaleFactor 
      newWidth = viewWidth 
     } else { 

      scaleFactor = oldHeight/oldWidth 
      newHeight = viewWidth * scaleFactor 
      newWidth = viewWidth 
     } 

     UIGraphicsBeginImageContext(CGSize(width:newWidth, height:newHeight)) 
     image.draw(in: CGRect(x:0, y:0, width:newWidth, height:newHeight)) 
     let newImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return newImage! 

    } 

`

+0

können Sie Funktion in scaleImage teilen? –

+0

@TranTrungHieu Überprüfen Sie die aktualisierte Antwort. – Chrishan

Verwandte Themen