zoukankan      html  css  js  c++  java
  • 图片编码简介

    数据在网络中是以二进制流的形式传播的,那么我们该如何把那些1和0解析成我们需要的数据格式呢?当文件都使用二进制流作为传输时,需要制定一套规范,用来区分该文件到底是什么类型的。 文件头有很多个,我们在这里就介绍一些主流的且跟图片相关的文件头。

    JPEG (jpg),文件头:FFD8FFE1
    PNG (png),文件头:89504E47
    GIF (gif),文件头:47494638
    TIFF tif;tiff 0x49492A00
    TIFF tif;tiff 0x4D4D002A
    RAR Archive (rar),文件头:52617221
    WebP : 524946462A73010057454250 

    可以看出来我们通过每个文件头的第一个字节就能判断出是什么类型。但是值得注意的是52开头的。这个要做特别的判断。

    我们如何获取NSData中的第一个字节呢?如下:

     uint8_t c;
    [data getBytes:&c length:1];
    

     代码实现如下:

    1.定义图片类型的type值
    typedef NS_ENUM(NSInteger, SDImageFormat) {
        SDImageFormatUndefined = -1,
        SDImageFormatJPEG = 0,
        SDImageFormatPNG,
        SDImageFormatGIF,
        SDImageFormatTIFF,
        SDImageFormatWebP
    };
    

     2.代码实现

    + (SDImageFormat)sd_imageFormatForImageData:(nullable NSData *)data {
        if (!data) {
            return SDImageFormatUndefined;
        }
        
        //获得NSData中的第一个字节
        uint8_t c;
        [data getBytes:&c length:1];
        switch (c) {
            case 0xFF:
                return SDImageFormatJPEG;
            case 0x89:
                return SDImageFormatPNG;
            case 0x47:
                return SDImageFormatGIF;
            case 0x49:
            case 0x4D:
                return SDImageFormatTIFF;
            case 0x52:
                // R as RIFF for WEBP
                if (data.length < 12) {
                    return SDImageFormatUndefined;
                }
                
                NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0, 12)] encoding:NSASCIIStringEncoding];
                if ([testString hasPrefix:@"RIFF"] && [testString hasSuffix:@"WEBP"]) {
                    return SDImageFormatWebP;
                }
        }
        return SDImageFormatUndefined;
    }
    

     参考文献:SDWebImage 以及http://www.jianshu.com/p/471469ad9af1

  • 相关阅读:
    NSIS使用WinVer.nsh头文件判断操作系统版本
    批处理bat命令--获取当前盘符和当前目录和上级目录
    官方 NSIS 插件全集简单介绍
    js 的基础知识变量
    js stringObject的indexOf方法
    js 作为属性的变量
    js 不可变的原始值和可变的对象引用
    jquery完善的处理机制
    jquery对象和DOM对象的相互转换
    CSS3 animation-fill-mode 属性
  • 原文地址:https://www.cnblogs.com/lyz0925/p/7235073.html
Copyright © 2011-2022 走看看