图片编码简介

数据在网络中是以二进制流的形式传播的,那么我们该如何把那些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

时间: 2024-10-09 03:17:19

图片编码简介的相关文章

Base64编码简介

  基本概念 Base64这个术语最初是在"MIME内容传输编码规范"中提出的.Base64不是一种加密算法,虽然编码后的字符串看起来有点加密的赶脚.它实际上是一种"二进制到文本"的编码方法,它能够将给定的任意二进制数据转换(映射)为ASCII字符串的形式,以便在只支持文本的环境中也能够顺利地传输二进制数据.例如支持MIME的电子邮件应用,或需要在XML中存储复杂数据(例如图片)时. 要实现Base64,首先需要选取适当的64个字符组成字符集.一条通用的原则是从某种

BMP、GIF、JPEG、PNG以及其他图片格式简介

BMP格式 BMP是英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式,能够被多种Windows应用程序所支持.随着Windows操作系统的流行与丰富的Windows应用程序的开发,BMP位图格式理所当然地被广泛应用.这种格式的特点是包含的图像信息较丰富,几乎不进行压缩,但由此导致了它与生俱生来的缺点--占用磁盘空间过大.所以,目前BMP在单机上比较流行. GIF格式 GIF是英文Graphics Interchange Format(图形交换格式)的缩写.顾名思义,

使用ffmpeg将图片编码为x264视频文件

ffmpeg开源库,实现将bmp格式的图片编码成x264文件.参考资料:http://blog.csdn.net/eightdegree/article/details/7425635#reply 自己根据博客的代码,vs2010搭建的测试环境.资源下载 具体代码: #define _AFXDLL #include<afxwin.h> #ifdef __cplusplus extern "C" { #endif #include <libavcodec/avcodec

Radix-64编码简介

本文介绍Radix-64编码,PGP和S/MIME均使用了Radix-64编码技术,rfc4880的Chap 6有关于Radix-64的详细描述. Radix-64编码基于Base64编码技术,由两部分构成.分别是Base64编码的二进制数据和一个校验和.这里使用的Base64编码格式与rfc2045中的MIME Base64编码格式相同.关于Base64的介绍参考这里.校验和是使用相同的Base64格式转换后的24-bit长度的循环冗余校验(CRC),校验和使用"="作为前缀. 由于

opencv python图片编码解码

cv2.imdecode()函数从指定的内存缓存中读取数据,并把数据转换(解码)成图像格式;主要用于从网络传输数据中恢复出图像.cv2.imencode()函数是将图片格式转换(编码)成流数据,赋值到内存缓存中;主要用于图像数据格式的压缩,方便网络传输. imdecode()使用 从网络读取图像数据并转换成图片格式: # -*- coding: utf-8 -*- import numpy as np import urllib import cv2 url = 'https://www.bai

Base64图片编码优化

通过对图片进行base64编码,将base64(或其他数据)内嵌在image标签的属性当中(或者CSS中或JavaScript中),可以实现将图片直接嵌入代码中的目的,如此一来,可以减少HTTP请求,这对于提升Web性能很有好处.对于较小的图片,采用这样处理是非常实用的,但是IE6/7不能支持这种方法,因此可以在IE6/7中采用传统的方法,而在其他浏览器中使用这样的方法来进行全面的兼容.

Android图片编码机制深度解析(Bitmap,Skia,libJpeg)

问题 工作中遇到了Android中有关图片压缩保存的问题,发现这个问题还挺深,而且网上资料比较有限,因此自己深入研究了一下,算是把这个问题自顶至下全部搞懂了,在此记录. 相关的几个问题如下: 1.Android系统是如何编码压缩保存图片的? 2.Skia库起到的作用? 3.libJpeg库起到的作用? 4.能不能自己调用Skia或libJpeg? 解答 一谈到Android上的图片压缩保存,基本都会想到android.graphics.Bitmap这个类,它提供了一个非常方便(事实上也只有这一个

Android个人中心的头像上传,图片编码及截取

首先需要有网络权限,然后我们这里匹配的网络请求是之前封装好的Okhttp,Okhttp的下载地址 非常的简单方便,直接复制进去,依赖一下包,然后调用方法即可. 这里是把图片转换成Base64.decode(imageString, Base64.DEFAULT); 转成Base64编码上传.具体内容也不少,需要完全整明白,还是要花点时间慢慢看的. 先看看简单的效果图: 那么万事具备,只欠东风了.直接上代码: public class MainActivity extends AppCompatA

android 开发 对图片编码,并生成gif图片

demo场景: 将2张静态的png格式图片组合生成一个gif图片,间隔500毫秒,关键类:AnimatedGifEncoder 如需要解析gif获取每帧的图片,可参考上一篇博客:<android 开发 解码gif图片,获取每帧bitmap> 使用方法: /** * 生成gif图片 */ void makeGif() { String path = Environment.getExternalStorageDirectory().getAbsolutePath() +"/data/d