【问题标题】:SDWebImage resizing/scaling/cropping images coming from url before caching themSDWebImage 在缓存之前调整来自 url 的图像大小/缩放/裁剪图像
【发布时间】:2012-08-31 07:03:13
【问题描述】:

如何在缓存来自 url 的图像之前调整大小、缩放和裁剪图像。我尝试使用以下代码来实现这一点。

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

这产生了一个奇怪的结果。首先,它显示了一个未调整大小/缩放/裁剪的版本。但是,当我向下滚动然后返回时,它会显示一个调整大小/缩放/裁剪的版本。我知道这段代码首先缓存图像并调整大小/缩放/裁剪它们。但是,我想不出更好的解决方案。我认为应该有一些东西可以下载图像以便独立调整大小/缩放/裁剪和缓存。有什么想法吗?

谢谢。

【问题讨论】:

    标签: objective-c ios5 sdwebimage


    【解决方案1】:

    我自己想出了解决办法。

    而不是

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

    自动下载和缓存图片,使用这个

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

    别忘了包含

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

    【讨论】:

    • Sukhrob,我已经为这个答案添加了一个替代方案。为了做到这一点,我修改了 SDWebImage。
    • 这不会在缓存之前调整大小。它会调整每次图像的大小,无论是下载的还是从缓存中提取的。完成块被称为 after 缓存。那不能回答你的问题。 This does.
    【解决方案2】:

    如果你想缩放 UIImage,试试这个方法:

     - (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方法来源:The simplest way to resize an UIImage?

    【讨论】:

      【解决方案3】:

      这是一个很好的例子,说明如何使用 SDWebImageManagerDelegate 实现。

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

      【讨论】:

        【解决方案4】:

        如果有人在寻找 swift-3 版本

            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!
        
            }
        

        `

        【讨论】:

        • 可以分享scaleImage中的函数吗?
        猜你喜欢
        • 2012-08-09
        • 1970-01-01
        • 2011-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多