怎样支持 WEBP 格式的图片

如果接收到 WEBP 格式的图片,融云的图片浏览器无法显示的时候,需要按如下操作进行
发布时间: 2018-06-14 16:56

回答:

如果支持 WEBP 格式的图片浏览

如果发现收到了 WEBP 格式的图片无法浏览的时候,需要按照如下方式支持。

  1. 创建一个 NSObject的分类 

  2. 添加这个名字的方法(+ (UIImage )rc_imageWithWebP:(NSData )data;)

例如

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface NSObject (RCWebp)
+ (UIImage *)rc_imageWithWebP:(NSData *)data;
@end

3..m 中的方法实现

#import "NSObject+RCWebp.h"
#import <WebP/decode.h>
#import <WebP/encode.h>
static void FreeImageData(void *info, const void *data, size_t size)
{
    free((void *)data);
}
@implementation NSObject (RCWebp)
+(UIImage *)rc_imageWithWebP:(NSData *)data{
    NSLog(@"app 来处理 webp 格式的图片");
    if (data == nil) {
        return nil;
    }
    return [UIImage rc_imageWithWebPData:data error:nil];
}
+ (UIImage *)rc_imageWithWebPData:(NSData *)data error:(NSError **)error
{
    WebPDecoderConfig config;
    if (!WebPInitDecoderConfig(&config)) {
        return nil;
    }

    if (WebPGetFeatures(data.bytes, data.length, &config.input) != VP8_STATUS_OK) {
        return nil;
    }

    config.output.colorspace = config.input.has_alpha ? MODE_rgbA : MODE_RGB;
    config.options.use_threads = 1;

    // Decode the WebP image data into a RGBA value array.
    if (WebPDecode(data.bytes, data.length, &config) != VP8_STATUS_OK) {
        return nil;
    }

    int width = config.input.width;
    int height = config.input.height;
    if (config.options.use_scaling) {
        width = config.options.scaled_width;
        height = config.options.scaled_height;
    }

    // Construct a UIImage from the decoded RGBA value array.
    CGDataProviderRef provider =
    CGDataProviderCreateWithData(NULL, config.output.u.RGBA.rgba, config.output.u.RGBA.size, FreeImageData);
    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
    CGBitmapInfo bitmapInfo = config.input.has_alpha ? kCGBitmapByteOrder32Big | kCGImageAlphaPremultipliedLast : 0;
    size_t components = config.input.has_alpha ? 4 : 3;
    CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;
    CGImageRef imageRef = CGImageCreate(width, height, 8, components * 8, components * width, colorSpaceRef, bitmapInfo,
                                        provider, NULL, NO, renderingIntent);

    CGColorSpaceRelease(colorSpaceRef);
    CGDataProviderRelease(provider);

    UIImage *image = [[UIImage alloc] initWithCGImage:imageRef];
    CGImageRelease(imageRef);

    return image;
}
@end

4.需要导入 WebP.framework ,可自行去网上下载