【问题标题】:How to load a webp image with SDWebImage?如何使用 SDWebImage 加载 webp 图像?
【发布时间】:2013-08-03 11:11:36
【问题描述】:

我正在使用SDWebImage 在我的 iOS 应用中加载图像,现在我想使用 webp 格式。

这是我的第一次尝试:

NSURL *url = [NSURL URLWithString:@"http://www.gstatic.com/webp/gallery/2.webp"];

[self.imageView setImageWithURL:url
               placeholderImage:nil
                        options:SDWebImageProgressiveDownload
 completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) {

     if (error) {

         UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Error" message:error.localizedDescription delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];

         [av show];
     }
 }];

如果图像是 jpeg(我尝试过),它会完美运行,但使用 webp 则不会。 我第一次调用此代码时,错误是:

Downloaded image has 0 pixels

然后错误转为:

The operation couldn't be completed. (NSURLErrorDomain error -1100.)

怎么了?

【问题讨论】:

    标签: ios sdwebimage webp


    【解决方案1】:

    实际上上面的代码应该可以工作,但是库中默认禁用了 webp 支持。

    在 sdwebimage 目标的预处理器宏中添加 SD_WEBP=1(在构建设置中)将启用 webp 支持

    【讨论】:

    • 你能否发布一个源代码如何在ios中使用webp图像而无需花费太多时间来加载它们
    • 正确答案,但如果你没有安装 webp 子模块,那么它会给你一个错误消息,所以在设置预处理器宏之前安装 pod "SDWebImage/WebP"。
    【解决方案2】:

    添加

    pod 'SDWebImage/WebP'
    

    进入您的 podfile,然后点击 pod install。 Cocoapods 也会处理预处理器标志。

    来自 SDWebImage github page

    现在有 3 个子规范可用:Core、MapKit 和 WebP(这意味着 您只能安装一些 SDWebImage 模块。默认情况下,您 只需获取 Core,因此如果您需要 WebP,则需要指定它)。

    【讨论】:

      【解决方案3】:

      我搜索了很多帖子,最终导致了这里。 这是我在github中询问后的解决方案。

      https://github.com/rs/SDWebImage/issues/1122

      步骤:

      1: Clone 并添加 WebP.framework

      使用git clone --recursive https://github.com/rs/SDWebImage.git克隆存储库

      SDWebImageWebP.framework 的完整文件夹添加到您的项目中。

      2:在Build Settings -- Preprocessor Macros 中添加SD_WEBP=1

      ps:如果使用CocoaPods,我不知道如何将WebP.framework添加到SDWebImage中,所以我选择将文件添加到我的项目中。

      【讨论】:

        【解决方案4】:

        Swift 5 和 Xcode 11

        在 podfile 中使用 pod

        pod 'SDWebImageWebPCoder'
        

        导入此库

        import SDWebImageWebPCoder
        

        在 AppDelegate 'didFinishLaunchingWithOptions' 下使用此代码

        let WebPCoder = SDImageWebPCoder.shared
        SDImageCodersManager.shared.addCoder(WebPCoder)
        

        在 ViewController 'viewDidLoad' 下使用此代码

        @IBOutlet weak var imageView: UIImageView!
        override func viewDidLoad() {
            super.viewDidLoad()
        
            //load from server
            let onlineFileUrl = URL(string: "http://www.gstatic.com/webp/gallery/2.webp")
             //load from project directory
                let loaclFileUrl = Bundle.main.url(forResource: "2", withExtension: "webp")
            DispatchQueue.main.async {
                self.imageView.sd_setImage(with: onlineFileUrl)
            }
        
        }
        

        【讨论】:

        • 好像通过bundle找不到webp文件。有什么想法吗?
        • 其实问题是通过手动添加webp文件到bundle中解决的。可以做项目->捆绑阶段->复制捆绑资源
        【解决方案5】:

        Objective-C

        在 podfile 中使用 pod

        pod 'SDWebImageWebPCoder'
        

        导入此库

        #import <SDWebImageWebPCoder.h>
        

        在 AppDelegate 'didFinishLaunchingWithOptions' 下使用此代码

        SDImageWebPCoder *WebPCoder = [SDImageWebPCoder sharedCoder];
        [[SDImageCodersManager  sharedManager] addCoder:WebPCoder];
        

        下载图片

        [self.yourImage sd_setImageWithURL:[NSURL URLWithString:@"your_url_webp" placeholderImage:[UIImage imageNamed:@"placeholder"]];
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-05
          • 2021-01-05
          • 1970-01-01
          • 1970-01-01
          • 2020-04-30
          • 2015-05-06
          相关资源
          最近更新 更多