2012-08-31 15 views
8

¿Cómo puedo cambiar el tamaño, escalar y recortar las imágenes procedentes de la url antes de almacenarlas en la memoria caché? Traté de lograr esto con el siguiente código.SDWebImage redimensionar/escalar/recortar las imágenes procedentes de la url antes de almacenarlas en caché

[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]; 

Esto produjo un resultado extraño. Primero, muestra una versión no redimensionada/escalada/recortada. Pero, cuando me desplazo hacia abajo y luego hacia atrás, muestra una versión de tamaño/escala/recortada. Sé que este código primero almacena en caché las imágenes y las cambia de tamaño/escala/cosecha. Pero no pude encontrar una mejor solución. Creo que debería haber algo que permita descargar imágenes para cambiar el tamaño/escalar/recortar y almacenar en caché de forma independiente. ¿Algunas ideas?

Gracias.

Respuesta

13

Descubrí la solución por mi cuenta.

En lugar de

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

que descarga y almacena en caché las imágenes automáticamente, utilice este

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]; 

No se olvide de incluir

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

Sukhrob, he agregado una alternativa a esta respuesta. Modifiqué SDWebImage para hacer esto. – Tony

+8

Esto no cambia de tamaño antes del almacenamiento en caché. Cambia el tamaño ** cada vez ** que se obtiene la imagen, ya sea descargada o desde la memoria caché. El bloque de finalización se llama ** después de ** almacenar en caché. Eso no responde tu pregunta. [Esto sí.] (Http://stackoverflow.com/questions/12928103/sdwebimage-process-images-before-caching) –

1

Este fue un gran ejemplo de cómo implementar al usar 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

Si desea escalaUIImage, trate de esta manera: fuente

- (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 método: The simplest way to resize an UIImage?

0

Si alguien está buscando Swift-3 versión

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

¿puedes compartir la función en scaleImage? –

+0

@TranTrungHieu Compruebe la respuesta actualizada. – Chrishan

Cuestiones relacionadas