2011-08-13 10 views
5

Używam SDWebImage do ładowania obrazów do mojego widoku tabeli. Chciałbym, aby obrazy w moim widoku tabeli były skalowane i miały zaokrąglone rogi. W tym celu znalazłem UIImage+Resize and UIImage+RoundedCorner. Obie biblioteki działają świetnie, ale nie łączyłem ich. Mógłbym zmienić rozmiar i zaokrąglić rogi obrazu. SDWebImage powraca, ale stwierdziłem, że jest to dość ciężki zasób i dlatego chciałbym zmienić rozmiar obrazów przed zapisaniem ich w pamięci podręcznej. Gdy obraz jest ładowany z sieci po raz pierwszy, prawdopodobnie jest wyświetlany przed zapisaniem w pamięci podręcznej, dlatego też chciałbym zmienić rozmiar obrazu po jego załadowaniu po raz pierwszy.UIImage + RoundedCorner z SDWebImage

Nie byłem w stanie tego zrobić, ponieważ nie mogę ustalić, która metoda SDWebImage może manipulować obrazem. Wszystko, czego potrzebuję, to wywołać poniższy kod na właściwej UIImage w SDWebImage.

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

Czy ktoś może mi powiedzieć, gdzie w SDWebImage należy umieścić ten kawałek kodu, aby mieć obraz manipulowane przed zapisywane w pamięci podręcznej i mają manipulować obraz wysyłany do widoku obrazu, gdy jest ładowane z internetu i nie pamięci podręcznej?

Odpowiedz

2

Wymyśliłem to.

należy manipulować obraz w następujących metod 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; 

W trzeciej metodzie należy pamiętać, aby przekonwertować UIImage do NSData stosując poniższy kod. Należy to zrobić, jeśli toDisk jest prawdziwe.

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

Korzystanie if (croppedRoundedImageData) data = croppedRoundedImageData; aplikację nie padnie, jeśli dane są NULL podczas próby, aby go zapisać.

W SDWebImageDownloader.m trzeba dodać kod do manipulowania w - (void)connectionDidFinishLoading:(NSURLConnection *)aConnection Służy do pierwszego obciążenia obrazu (gdy nie jest w pamięci podręcznej)

0

To jest wielki znaleźć, ale uważam, że przez dodanie swojej kod do manipulacji obrazem w SDWebImageDownloader.m tworzy miniatury wszystkich obrazów za pomocą SDWebImage. Co zrobiłem było utworzyć instancję SDWebImageManager i stosowane metody:

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

do tworzenia obrazów, jedynym problemem jest to, ponieważ obrazy są w różnych momentach staram się znaleźć sposób, by połączyć je odpowiednio ze związkiem akcja.

Niemniej jednak, wspaniała odpowiedź.

6

Dla części z obrazem zmiany rozmiaru nie mam dobrej odpowiedzi.

Dla funkcji zaokrąglonych narożników całkowicie zmierzasz w niewłaściwy sposób, staram się to zrobić wcześniej ... spróbuj zmienić rozmiar i zaokrąglij każdy obraz i zapisz go na dysku ...... też złożony, zbyt wiele rzeczy do zrobienia ...

prawidłowe i prostym sposobem jest ustawienie UIImageView cornerRadius twojej komórce tabeli:

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

Szybki i łatwy sposób, ale wpływa na wydajność. Renderowanie obrazów ze ściętymi narożnikami jest lepsze pod względem wydajności wyświetlania tabel – gavrix

0

Im przy SDWebImage ramy, które nie daje mi możliwość modyfikowania plików, ale mam globalną funkcję jak to:

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

i globalny funtion skalować obraz tak:

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

Protokół SDWebImageManagerDelegate jest tym, czego szukasz.

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

I wdrożone metody musimy w mojej klasie 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; 

} 

Możesz poinformować sharedManager, aby użył Twojego delegata w ten sposób.

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

Zrobiłem to w didFinishLaunchingWithOptions.

Należy pamiętać, że podejście to jest nakładane wzdłuż obramowania obrazu w jego naturalnym rozmiarze. Jeśli granice twojego obrazu są renderowane poza granicami twojego widoku (wypełnienie obrazu, itp.), Nie zobaczysz zaokrąglonych narożników.

Takie podejście jest bardziej wydajne niż obcinanie obrazu za każdym razem, gdy jest renderowane, ale należy pamiętać o powyższej wadzie.