2011-08-13 20 views
5

Estoy usando SDWebImage para cargar imágenes en mi vista de tabla. Me gustaría que las imágenes de mi vista de tabla se redimensionen y tengan esquinas redondeadas. Encontré UIImage+Resize and UIImage+RoundedCorner para hacer esto. Ambas bibliotecas funcionan muy bien por separado, pero no he podido combinarlas. Pude redimensionar y redondear las esquinas de la imagen que SDWebImage devuelve, pero he encontrado que esto es bastante pesado y, por lo tanto, me gustaría que las imágenes cambien de tamaño antes de guardarlas en la caché. Cuando una imagen se carga desde la red por primera vez, probablemente se muestre antes de guardarla en la memoria caché, por lo que también me gustaría cambiar el tamaño de la imagen cuando se cargue por primera vez.UIImage + RoundedCorner con SDWebImage

No he podido hacer esto ya que no puedo averiguar en qué método de SDWebImage manipular la imagen. Todo lo que necesito es llamar al siguiente sobre el UIImage correcto en SDWebImage.

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

¿Puede alguien decirme donde en SDWebImage debería colocar esta pieza de código para tener la imagen manipulada antes de ser guardado en la memoria caché y tienen una imagen manipulada enviada a la vista de la imagen cuando se carga a través de Internet y no el caché?

Respuesta

2

Me di cuenta de esto.

Debe manipular la imagen en los métodos siguientes en 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; 

En el tercer método se debe recordar para convertir su UIImage a NSData utilizando el código de abajo. Esto debe hacerse si toDisk es verdadero.

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

Usando if (croppedRoundedImageData) data = croppedRoundedImageData; su aplicación no se bloqueará si sus datos están NULL cuando intenta guardarlo.

En SDWebImageDownloader.m debe agregar el código para manipular en - (void)connectionDidFinishLoading:(NSURLConnection *)aConnection Esto se utiliza para la primera carga de la imagen (cuando no está en caché)

0

Este es un gran hallazgo, pero me parece que añadiendo su código de manipulación de imagen en SDWebImageDownloader.m hace miniaturas para todas las imágenes usando SDWebImage. Lo que hice fue crear una instancia SDWebImageManager y se utiliza el método:

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

para crear las imágenes, el único problema es debido a que las imágenes vienen en diferentes momentos estoy tratando de encontrar una manera de vincular de manera adecuada con una acción.

Excelente respuesta, no obstante.

6

Para cambiar el tamaño de la imagen, no tengo una buena respuesta.

Para la función de esquinas redondeadas, va completamente al revés, esto es lo que trato de hacer antes ... intentar cambiar el tamaño y redondear cada imagen y guardarla en el disco ...... también complejo, demasiadas cosas que hacer ...

la forma correcta y simple es fijar la UIImageView CornerRadius de su celda de la tabla:

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

Manera rápida y fácil, pero afecta el rendimiento. Renderizar imágenes con esquinas cortadas es mejor en términos de rendimiento de la tabla – gavrix

0

Im usando marco SDWebImage la que no me da la posibilidad de modificar los archivos, pero no tengo una función global como esto:

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

el andfuntion mundial a escala de la imagen como esta:

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

El protocolo SDWebImageManagerDelegate es lo que estás buscando.

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

que implementa el método que necesitamos en mi clase 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; 

} 

Puede decirle al sharedManager que use su delegado de esta manera.

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

Hice esto en didFinishLaunchingWithOptions.

Tenga en cuenta que este enfoque se ajusta a lo largo de los límites de la imagen en su tamaño original. Si los límites de su imagen se representan fuera de los límites de su vista (aspecto-relleno, etc.), no verá las esquinas redondeadas.

Este enfoque es más eficaz que recortar la imagen cada vez que se procesa, pero tenga en cuenta la desventaja anterior.