10

キャッシュする前に、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];

これは奇妙な結果を生み出しました。まず、サイズ変更/スケーリング/トリミングされていないバージョンが表示されます。しかし、下にスクロールしてから戻ると、サイズ変更/拡大縮小/トリミングされたバージョンが表示されます。このコードは最初に画像をキャッシュし、サイズ変更/拡大縮小/トリミングすることを知っています。しかし、私はより良い解決策を思い付くことができませんでした。サイズ変更/拡大縮小/切り抜きとキャッシュを個別に行うために、画像のダウンロードを可能にする何かがあるはずだと思います。何か案は?

ありがとうございました。

4

4 に答える 4

13

私は自分で解決策を見つけました。

それ以外の

[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>
于 2012-09-02T13:56:53.287 に答える
4

スケーリング する場合は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メソッドソース:UIImageのサイズを変更する最も簡単な方法は?

于 2016-03-02T23:26:15.013 に答える
2

これは、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];
于 2015-10-06T16:57:35.980 に答える
0

誰かが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!

    }

`

于 2017-09-05T07:36:58.220 に答える