UIImage + RoundedCorner с SDWebImage - PullRequest
       19

UIImage + RoundedCorner с SDWebImage

5 голосов
/ 13 августа 2011

Я использую SDWebImage для загрузки изображений в мое табличное представление.Я хотел бы, чтобы изображения в моем виде таблицы были изменены и иметь закругленные углы.Я нашел UIImage + Resize и UIImage + RoundedCorner , чтобы сделать это.Обе библиотеки прекрасно работают по отдельности, но я не смог их объединить.Я мог бы изменить размер и закруглить углы изображения, возвращаемого SDWebImage, но я обнаружил, что это достаточно ресурсоемкий, и поэтому я хотел бы изменить размеры изображений перед сохранением их в кэш.Когда изображение загружается из сети в первый раз, оно, вероятно, отображается перед сохранением в кэш, поэтому я также хотел бы изменить размер изображения при первой загрузке.

Я не былв состоянии сделать это, так как я не могу понять, в каком методе SDWebImage манипулировать изображением. Все, что мне нужно, это вызвать следующее в правом UIImage в SDWebImage.

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

Может кто-нибудь сказать мне, где в SDWebImageЯ должен поместить этот фрагмент кода, чтобы манипулировать изображением перед его сохранением в кэш, и отправлять манипулированное изображение в представление изображений при загрузке из Интернета, а не в кеш?

Ответы [ 5 ]

7 голосов
/ 16 апреля 2012

Для части изменения размера изображения у меня нет хорошего ответа.

Для функции закругления углов, вы полностью идете по неверному пути, это то, что я пытаюсь сделать раньше ...попытайтесь изменить размер и округлить каждое изображение и сохранить его на диск ...... слишком сложно, слишком много дел ...

правильный и простой способ - установить URmageView cornerRadius вашей таблицыячейка:

cell.imageView.layer.cornerRadius = 8;
cell.imageView.layer.masksToBounds = YES;
2 голосов
/ 15 августа 2011

Я понял это.

Вы должны манипулировать изображением в 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;

В третьем методе вы должны не забыть преобразовать ваш UIImage в NSData, используя код ниже. Это должно быть сделано, если toDisk истинно.

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

При использовании if (croppedRoundedImageData) data = croppedRoundedImageData; ваше приложение не будет падать, если ваши данные NULL при попытке сохранить его.

В SDWebImageDownloader.m вы должны добавить свой код для манипулирования в - (void)connectionDidFinishLoading:(NSURLConnection *)aConnection Это используется для первой загрузки изображения (когда не в кеше)

1 голос
/ 02 декабря 2014

Вам нужен протокол 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;

}

Youможет сказать sharedManager использовать ваш делегат следующим образом.

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

Я сделал это в didFinishLaunchingWithOptions.

Имейте в виду, что этот подход обрезает границы изображения в его исходном размере.Если границы вашего изображения визуализируются вне границ вашего вида (аспектное заполнение и т. Д.), Вы не увидите закругленные углы.

Этот подход более эффективен, чем обрезка изображения при каждом его рендеринге., но помните о вышеуказанном недостатке.

0 голосов
/ 12 ноября 2014

Я использую фреймворк 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;
      }

и глобальная функция для масштабирования изображения следующим образом:

      + (UIImage*)imageWithImage:(UIImage*)image scaledToSize:(CGSize)newSize;
      {   
          UIGraphicsBeginImageContext(newSize);
          [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
          UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
          UIGraphicsEndImageContext();
          return newImage;
      }
0 голосов
/ 28 января 2012

Это отличная находка, но я обнаружил, что, добавив код манипуляции с изображениями в SDWebImageDownloader.m, он создает эскизы для всех изображений, используя SDWebImage. Я создал экземпляр SDWebImageManager и использовал метод:

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

для создания изображений, единственная проблема в том, что изображения появляются в разное время. Я пытаюсь найти способ правильно связать их с действием.

Тем не менее, отличный ответ.

...