【问题标题】:resize sdwebImage swift快速调整 sdwebImage 的大小
【发布时间】:2021-01-30 20:53:54
【问题描述】:

您好,我正在使用 sdwebImage 在我的应用程序上显示图像。我这里有一个代码来调整图像的大小

func resizeImage(image: UIImage, newWidth: CGFloat) -> UIImage {

    let scale = newWidth / image.size.width
    let newHeight = image.size.height * scale
    UIGraphicsBeginImageContext(CGSizeMake(newWidth, newHeight))
    image.drawInRect(CGRectMake(0, 0, newWidth, newHeight))
    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return newImage
}

问题是上述函数接受 UIImage 作为参数,sdwebimage 接受 URL。如何在 sdwebimage 中调用上述 resize 函数。或者简而言之,如何在此处调整通过 sdwebImage 呈现的图像的大小

   cell.profileImageView.sd_setImageWithURL(UIImage().absoluteURL(profileImageUrl as! String), placeholderImage: UIImage.init(named: "default-profile-icon")?.circle!, completed: completionBlock)

【问题讨论】:

  • sdwebimage 接受 URL,但据我所知您在该 imageview 中应用没有问题
  • 对不起这是什么意思。对不起,我没有找到你
  • 据我所知,您的代码是正确的,怀疑您在哪里调用 resizeImage 方法
  • 是的,这就是我要问的。在哪里调用调整大小的图像?
  • 库不支持调整图像大小的好方法。回调在主线程上执行,您不想在那里调整图像大小,实现的缓存也意味着每次请求加载时都需要调整大小操作。您必须增强库以支持调整大小,IMO 更好的选择之一是实现您自己的调整大小类别,类似于库提供的加载类别。

标签: ios swift image-resizing sdwebimage


【解决方案1】:

喜欢

cell.profileImageView.sd_setImageWithURL(
    NSURL(string: profileImageUrl as! String),
    placeholderImage: UIImage.init(named: "default-profile-icon"),
    options: nil,
    progress: nil,
    completed: { (image: UIImage?, error: NSError?, cacheType: SDImageCacheType!, imageURL: NSURL?) in

        guard let image = image else { return }
        print("Image arrived!")
        cell.profileImageView.image = resizeImage(image, newWidth: 200)
    }
)

【讨论】:

  • 块内调用resize方法
  • 你的问题是否解决,如果我的回答没有用,一旦我删除我的答案就回复
  • 随着您的解决方案调整大小的图像将设置为图像视图。但在 chache 中存在实际大小的图像,因此仍有可能出现内存问题。解决方案是图像下载器委托并返回调整大小的图像,如@Evgeny Karev 解决方案
【解决方案2】:

SDWebImage 通过其SDWebImageManagerDelegate 协议直接支持图像处理。您可以使用imageManager:transformDownloadedImage:withURL: 方法对下载的图像进行转换。

您可以像这样设置图像管理器委托:

SDWebImageManager.sharedManager.delegate = self;

【讨论】:

  • 能否请您写完整的代码或编辑我的代码。
【解决方案3】:

使用共享的 SDWebImageManager 不是一个好主意。部分进程可以在这段时间内下载图片。

我的 swift 3 示例在类中使用自定义 SDWebImageManager 和自定义 SDWebImageManagerDelegate 调整大小。

import SDWebImage

class ImageResizer: NSObject, SDWebImageManagerDelegate {
    private func resizeImage(_ image: UIImage, newHeight: CGFloat) -> UIImage {
        let scale = newHeight / image.size.height
        let newWidth = image.size.width * scale

        UIGraphicsBeginImageContextWithOptions(CGSize(width: newWidth, height: newHeight), false, 0)
        image.draw(in: CGRect(x: 0, y: 0, width: newWidth, height: newHeight))
        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return newImage!
    }

    public func imageManager(_ imageManager: SDWebImageManager, transformDownloadedImage image: UIImage?, with imageURL: URL?) -> UIImage? {
        guard let _image = image else {
            return nil
        }

        return resizeImage(_image, newHeight: 20)
    }
}


class BasicTrainView: XibView {
    static let imageManager: SDWebImageManager = SDWebImageManager()
    static let imageResizer = ImageResizer()

    func xxx() {
        BasicTrainView.imageManager.delegate = BasicTrainView.imageResizer
        BasicTrainView.imageManager.loadImage(with: logoURL, options: [], progress: nil) { (image, _, error, sdImageCacheType, _, url) -> Void in
            guard let _image = image else {
                self.carrierLogoImageView.image = nil
                return
            }

            self.carrierLogoImageView.image = _image
        }
    }
}

【讨论】:

    【解决方案4】:

    SDWebImage 已内置此功能。这是如何使用它

    let imageSize = cell.fanartImageView.bounds.size * UIScreen.main.scale
    
    let transformer = SDImageResizingTransformer(size: imageSize, scaleMode: .fill)
    
    cell.fanartImageView.sd_setImage(with: url, placeholderImage: image,
                                    options: SDWebImageOptions(rawValue: 0),
                                    context: [.imageTransformer: transformer],
                                    progress: nil) { (image, error, cache, url) in
        if error != nil {
            // handle error
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-29
      • 1970-01-01
      • 2019-01-20
      • 2012-08-09
      相关资源
      最近更新 更多