ImageIO

一、引言

ImageIO框架提供了读取与写入图片数据的基本方法,使用它可以直接获取到图片文件的内容数据,ImageIO框架中包含6个头文件,其中完成主要功能的是前两个头文件中定义的方法:

1.CGImageSource.h:负责读取图片数据。

2.CGImageDestination.h:负责写入图片数据。

3.CGImageMetadata.h:图片文件元数据类。

4.CGImageProperties:定义了框架中使用的字符串常量和宏。

5.ImageIOBase.h:预处理逻辑,无需关心。

二、CGImageSource详解

 CGImageSource类的主要作用是用来读取图片数据,在平时开发中,关于图片我们使用的最多的可能是UIImage类,UIImage是iOS系统UI系统中用于构建图像对象的类,但是其中只有图像数据,实际上一个图片文件中存储的除了图片数据外,还有一些地理位置、设备类型、时间等信息,除此之外,一个图片文件中可能存储的也不只一张图像(例如gif文件)。CGImageSource就是这样的一个抽象图片数据示例,从其中可以获取到我们所关心的所有数据。

读取图片文件数据,并将其展示在视图的简单代码示例如下:

//获取图片文件路径

NSString * path = [[NSBundle mainBundle]pathForResource:@"timg" ofType:@"jpeg"];

NSURL * url = [NSURL fileURLWithPath:path];

CGImageRef myImage = NULL;

CGImageSourceRef myImageSource;

//通过文件路径创建CGImageSource对象

myImageSource = CGImageSourceCreateWithURL((CFURLRef)url, NULL);

//获取第一张图片

myImage = CGImageSourceCreateImageAtIndex(myImageSource,0, NULL);

CFRelease(myImageSource);

UIImageView * image = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 200, 200)];

image.image = [UIImage imageWithCGImage:myImage];

[self.view addSubview:image];

上面的示例代码采用的是本地的一个素材文件,当然通过网络图片链接也是可以创建CGImageSource独享的。除了通过URL链接的方式创建对象,ImageIO框架中还提供了两种方法,解析如下:

//通过数据提供器创建CGImageSource对象

/*

CGDataProviderRef是CoreGraphics框架中的一个数据读取类,其也可以通过Data数据,URL和文件名来创建

*/

CGImageSourceRef __nullable CGImageSourceCreateWithDataProvider(CGDataProviderRef __nonnull provider, CFDictionaryRef __nullable options);

//通过Data数据创建CGImageSource对象

CGImageSourceRef __nullable CGImageSourceCreateWithData(CFDataRef __nonnull data, CFDictionaryRef __nullable options);

需要注意,上面所提到的所有创建CGImageSource的方法中都可以传入一个CFDictionaryRef类型的字典,可以配置的键值意义如下:

/*

设置一个预期的图片文件格式,需要设置为字符串类型的值

*/

const CFStringRef kCGImageSourceTypeIdentifierHint;

/*

设置是否以解码的方式读取图片数据 默认为kCFBooleanTrue

如果设置为true,在读取数据时就进行解码 如果为false 则在渲染时才进行解码

*/

const CFStringRef kCGImageSourceShouldCache;

/*

返回CGImage对象时是否允许使用浮点值 默认为kCFBooleanFalse

*/

const CFStringRef kCGImageSourceShouldAllowFloat;

/*

设置如果不存在缩略图则创建一个缩略图,缩略图的尺寸受开发者设置影响,如果不设置尺寸极限,则为图片本身大小

默认为kCFBooleanFalse

*/

const CFStringRef kCGImageSourceCreateThumbnailFromImageIfAbsent;

/*

设置是否创建缩略图,无论原图像有没有包含缩略图kCFBooleanFalse

*/

const CFStringRef kCGImageSourceCreateThumbnailFromImageAlways;

/*

设置缩略图的宽高尺寸 需要设置为CFNumber值

*/

const CFStringRef kCGImageSourceThumbnailMaxPixelSize;

/*

设置缩略图是否进行Transfrom变换

*/

const CFStringRef kCGImageSourceCreateThumbnailWithTransform;

CGImageSource类中其他方法解析如下:

//获取CGImageSource类在CoreFundation框架中的id

CFTypeID CGImageSourceGetTypeID (void);

//获取所支持的图片格式数组

CFArrayRef __nonnull CGImageSourceCopyTypeIdentifiers(void);

//获取CGImageSource对象的图片格式

CFStringRef __nullable CGImageSourceGetType(CGImageSourceRef __nonnull isrc);

//获取CGImageSource中的图片张数 不包括缩略图

size_t CGImageSourceGetCount(CGImageSourceRef __nonnull isrc);

//获取CGImageSource的文件信息

/*

字典参数可配置的键值对与创建CGImageSource所传参数意义一致

返回的字典中的键值意义后面介绍

*/

CFDictionaryRef __nullable CGImageSourceCopyProperties(CGImageSourceRef __nonnull isrc, CFDictionaryRef __nullable options);

//获取CGImageSource中某个图像的附加数据

/*

index参数设置获取第几张图像 options参数可配置的键值对与创建CGImageSource所传参数意义一致

返回的字典中的键值意义后面介绍

*/

CFDictionaryRef __nullable CGImageSourceCopyPropertiesAtIndex(CGImageSourceRef __nonnull isrc, size_t index, CFDictionaryRef __nullable options);

//获取图片的元数据信息 CGImageMetadataRef类是图像原数据的抽象

CGImageMetadataRef __nullable CGImageSourceCopyMetadataAtIndex (CGImageSourceRef __nonnull isrc, size_t index, CFDictionaryRef __nullable options);

//获取CGImageSource中的图片数据

CGImageRef __nullable CGImageSourceCreateImageAtIndex(CGImageSourceRef __nonnull isrc, size_t index, CFDictionaryRef __nullable options);

//删除一个指定索引图像的缓存

void CGImageSourceRemoveCacheAtIndex(CGImageSourceRef __nonnull isrc, size_t index);

//获取某一帧图片的缩略图

CGImageRef __nullable CGImageSourceCreateThumbnailAtIndex(CGImageSourceRef __nonnull isrc, size_t index, CFDictionaryRef __nullable options);

//创建一个空的CGImageSource容器,逐步加载大图片

CGImageSourceRef __nonnull CGImageSourceCreateIncremental(CFDictionaryRef __nullable options);

//使用新的数据更新CGImageSource容器

void CGImageSourceUpdateData(CGImageSourceRef __nonnull isrc, CFDataRef __nonnull data, bool final);

//更新数据提供器来填充CGImageSource容器

void CGImageSourceUpdateDataProvider(CGImageSourceRef __nonnull isrc, CGDataProviderRef __nonnull provider, bool final);

//获取当前CGImageSource的状态

/*

CGImageSourceStatus枚举意义:

typedef CF_ENUM(int32_t, CGImageSourceStatus) {

    kCGImageStatusUnexpectedEOF = -5, //文件结尾出错

    kCGImageStatusInvalidData = -4,  //数据无效

    kCGImageStatusUnknownType = -3,  //未知的图片类型

    kCGImageStatusReadingHeader = -2, //读标题过程中

    kCGImageStatusIncomplete = -1,    //操作不完整

    kCGImageStatusComplete = 0        //操作完整

};

*/

CGImageSourceStatus CGImageSourceGetStatus(CGImageSourceRef __nonnull isrc);

//同上,获取某一个图片的状态

CGImageSourceStatus CGImageSourceGetStatusAtIndex(CGImageSourceRef __nonnull isrc, size_t index);

三、CGImageDestination详解

CGImageSource是图片文件数据的抽象对象,而CGImageDestination的作用则是将抽象的图片数据写入指定的目标中。将图片写成文件示例如下:

//创建存储路径

NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);

NSString *newPath = [paths.firstObject stringByAppendingPathComponent:[NSString stringWithFormat:@"image.png"]];

CFURLRef URL =  CFURLCreateWithFileSystemPath (

                                  kCFAllocatorDefault,

                                  (CFStringRef)newPath,

                                  kCFURLPOSIXPathStyle,

                                  false);

//创建CGImageDestination对象

CGImageDestinationRef myImageDest = CGImageDestinationCreateWithURL(URL,CFSTR("public.png"), 1, NULL);

UIImage * image = [UIImage imageNamed:@"timg.jpeg"];

//写入图片

CGImageDestinationAddImage(myImageDest, image.CGImage, NULL);

CGImageDestinationFinalize(myImageDest);

CFRelease(myImageDest);

同样,除了可以直接将图片数据写入url外,也可以Data数据或数据消费器,方法如下:

//将图片数据写入数据消费者

CGImageDestinationRef __nullable CGImageDestinationCreateWithDataConsumer(CGDataConsumerRef __nonnull consumer, CFStringRef __nonnull type, size_t count, CFDictionaryRef __nullable options);

//将图片数据写入Data

CGImageDestinationRef __nullable CGImageDestinationCreateWithData(CFMutableDataRef __nonnull data, CFStringRef __nonnull type, size_t count, CFDictionaryRef __nullable options);

需要注意,上面方法的type参数设置写入数据的文件格式,必须为ImageIO框架所支持的格式,前面有方法可以获取所有支持的格式,还有一点,这3个写入方法的中options参数目前并没有什么作用,其是留给未来使用的,目前传入NULL即可。

CGImageDestination类中的其他方法解析如下:

//获取CGImageDestination的CFTypeID

CFTypeID CGImageDestinationGetTypeID(void);

//获取CGImageDestination所支持的图片文件类型

/*

目前支持如下:iOS10.1

(

    "public.jpeg",

    "public.png",

    "com.compuserve.gif",

    "public.tiff",

    "public.jpeg-2000",

    "com.microsoft.ico",

    "com.microsoft.bmp",

    "com.adobe.photoshop-image",

    "com.adobe.pdf",

    "com.truevision.tga-image",

    "com.ilm.openexr-image",

    "public.pbm",

    "public.pvr",

    "org.khronos.astc",

    "org.khronos.ktx",

    "com.microsoft.dds",

    "com.apple.rjpeg"

)

*/

CFArrayRef __nonnull CGImageDestinationCopyTypeIdentifiers(void);

//设置图片文件属性

/*

可以设置的键值对意义如下:

const CFStringRef kCGImageDestinationLossyCompressionQuality; //设置压缩质量 0-1之间的cfnumberref值

const CFStringRef kCGImageDestinationBackgroundColor;  //将图片数据写为无alpha通道时的默认背景色 cgcolor值

*/

void CGImageDestinationSetProperties(CGImageDestinationRef __nonnull idst, CFDictionaryRef __nullable properties);

//向CGImageDestination中添加一张图片 其中的option参数意义和上面一致,设置此图片的质量与无alpha默认背景色

void CGImageDestinationAddImage(CGImageDestinationRef __nonnull idst, CGImageRef __nonnull image, CFDictionaryRef __nullable properties);

//通过CGImageSource对象来向CGImageDestination中添加图片

void CGImageDestinationAddImageFromSource(CGImageDestinationRef __nonnull idst, CGImageSourceRef __nonnull isrc, size_t index, CFDictionaryRef __nullable properties);

//进行写入操作 执行此方法后 不可以在写入其他信息

bool CGImageDestinationFinalize(CGImageDestinationRef __nonnull idst);

//添加图片元信息

void CGImageDestinationAddImageAndMetadata(CGImageDestinationRef __nonnull idst, CGImageRef __nonnull image, CGImageMetadataRef __nullable metadata, CFDictionaryRef __nullable options);

//将CGImageSource信息拷贝进CGImageDestination

/*

options参数可以用来添加元信息

*/

bool CGImageDestinationCopyImageSource(CGImageDestinationRef __nonnull idst, CGImageSourceRef __nonnull isrc, CFDictionaryRef __nullable options, __nullable CFErrorRef * __nullable err);

上面列举的方法中,CGImageDestinationCopyImageSource()方法中的options参数可以添加一些图片的元信息,可以设置的键值对意义如下:

//设置元信息 需要设置为CGImageMetadataRef对象

const CFStringRef kCGImageDestinationMetadata;

//是否将CGImageSource的元信息信息合并操作 默认为kCFBooleanFalse

const CFStringRef kCGImageDestinationMergeMetadata;

//XMP数据是否不被写入 默认为kCFBooleanFalse

const CFStringRef kCGImageMetadataShouldExcludeXMP;

//GPS信息是否不被写入 默认为kCFBooleanFalse

const CFStringRef kCGImageMetadataShouldExcludeGPS;

//更新元数据的时间值 需要设置为CFStringRef或者CFDateRef

const CFStringRef kCGImageDestinationDateTime;

//更新元数据的方向值 需要设置为NSNumber1-8

const CFStringRef kCGImageDestinationOrientation;

四、关于CGImageMetadata

前面我们很多次提到元数据,CGImageMetadata类就是元数据的抽象,其中封装了一些方法供开发者读取或写入元数据信息。奇怪的是Apple的官方文档与API文档中并没有CGImageMetadata的介绍与解释,博客中本部分的内容,多出自我的理解,有疏漏和不对的地方,清楚的朋友可以指点与建议。

    前边介绍,CGImageSource中有获取图片元数据的方法,CGImageDestination中也有写入图片元数据的方法,元数据中抽象出的CGImageMetadataTag是对具体数据内容的封装。CGImageMetadata解析如下:

//获取CGImageMetadata类的CFTypeID

CFTypeID CGImageMetadataGetTypeID(void);

//创建一个空的可变的CGImageMetadata对象

CGMutableImageMetadataRef __nonnull CGImageMetadataCreateMutable(void);

//拷贝一个可变的CGImageMetadata对象

CGMutableImageMetadataRef __nullable CGImageMetadataCreateMutableCopy(CGImageMetadataRef __nonnull metadata);

//获取CGImageMetadataTag类的CFTypeID

CFTypeID CGImageMetadataTagGetTypeID(void);

//创建一个CGImageMetadataTag对象

/*

这个方法比较复杂

xmlns参数设置命名空间

prefix参数设置命名空间的缩写或前缀

name参数设置CGImageMetadataTag的名称

type参数设置CGImageMetadataTag对应值的类型

value参数设置CGImageMetadataTag的对应值

*/

CGImageMetadataTagRef __nullable CGImageMetadataTagCreate (CFStringRef __nonnull xmlns, CFStringRef __nullable prefix, CFStringRef __nonnull name, CGImageMetadataType type, CFTypeRef __nonnull value);

上面创建CGImageMetadataTag的方法中,xmlns设置命名空间,必须使用一个预定义的命名空间或者自定义的命名空间,对于自定义的命名空间,必须遵守Adobe的XMP规范。一些共用的命名空间定义如下:

//Exif命名空间

const CFStringRef  kCGImageMetadataNamespaceExif;

//ExifAux命名空间

const CFStringRef  kCGImageMetadataNamespaceExifAux;

//ExifEX命名空间

const CFStringRef  kCGImageMetadataNamespaceExifEX;

//DublineCore命名空间

const CFStringRef  kCGImageMetadataNamespaceDublinCore;

//IPTCCore命名空间

const CFStringRef  kCGImageMetadataNamespaceIPTCCore;

//Photoshop命名空间

const CFStringRef  kCGImageMetadataNamespacePhotoshop;

//TIFF命名空间

const CFStringRef  kCGImageMetadataNamespaceTIFF;

//XMPBasic命名空间

const CFStringRef  kCGImageMetadataNamespaceXMPBasic;

//XMPRights命名空间

const CFStringRef  kCGImageMetadataNamespaceXMPRights;

上面创建CGImageMetadataTag的方法中prefix设置命名空间缩写或前缀,同样一些公用的前缀定义如下:

//Exif命名空间前缀

const CFStringRef  kCGImageMetadataPrefixExif;

//ExifAux命名空间前缀

const CFStringRef  kCGImageMetadataPrefixExifAux;

//ExifEX命名空间前缀

const CFStringRef  kCGImageMetadataPrefixExifEX;

//DublinCore命名空间前缀

const CFStringRef  kCGImageMetadataPrefixDublinCore;

//IPCCore命名空间前缀

const CFStringRef  kCGImageMetadataPrefixIPTCCore;

//Photoshop命名空间前缀

const CFStringRef  kCGImageMetadataPrefixPhotoshop;

//TIFF命名空间前缀

const CFStringRef  kCGImageMetadataPrefixTIFF;

//XMPBasic命名空间前缀

const CFStringRef  kCGImageMetadataPrefixXMPBasic;

//XMPRights命名空间前缀

const CFStringRef  kCGImageMetadataPrefixXMPRights;

上面创建CGImageMetadataTag的方法中type设置对应值的类型,其是一个CGImageMetadataType类型的枚举,意义如下:

typedef CF_ENUM(int32_t, CGImageMetadataType) {

    //无效的数据类型

    kCGImageMetadataTypeInvalid = -1,

    //基本的CFType类型

    kCGImageMetadataTypeDefault = 0,

    //字符串类型

    kCGImageMetadataTypeString = 1,

    //无需集合类型

    kCGImageMetadataTypeArrayUnordered = 2,

    //有序集合类型

    kCGImageMetadataTypeArrayOrdered = 3,

    //有序阵列

    kCGImageMetadataTypeAlternateArray = 4,

    //特殊的数组 其中元素进行不同的本地化

    kCGImageMetadataTypeAlternateText = 5,

    //结构类型 如字典

    kCGImageMetadataTypeStructure = 6

};

获取到CGImageMetadataTag后,可以通过如下方法来获取其中封装的信息:

//获取标签的命名空间

CFStringRef __nullable CGImageMetadataTagCopyNamespace(CGImageMetadataTagRef __nonnull tag);

//获取标签的命名空间前缀

CFStringRef __nullable CGImageMetadataTagCopyPrefix(CGImageMetadataTagRef __nonnull tag);

//获取标签名称

CFStringRef __nullable CGImageMetadataTagCopyName(CGImageMetadataTagRef __nonnull tag);

//获取标签的值

CFTypeRef __nullable CGImageMetadataTagCopyValue(CGImageMetadataTagRef __nonnull tag);

//获取标签值的类型

CGImageMetadataType CGImageMetadataTagGetType(CGImageMetadataTagRef __nonnull tag);

//获取标签的Qualifier数组

CFArrayRef __nullable CGImageMetadataTagCopyQualifiers(CGImageMetadataTagRef __nonnull tag);

下面这些方法用于向CGImageMetadata中添加标签或者获取标签:

//获取CGImageMetadata中的所有标签

CFArrayRef __nullable CGImageMetadataCopyTags(CGImageMetadataRef __nonnull metadata);

//通过路径查找特殊的标签

CGImageMetadataTagRef __nullable CGImageMetadataCopyTagWithPath(CGImageMetadataRef __nonnull metadata, CGImageMetadataTagRef __nullable parent, CFStringRef __nonnull path);

//通过路径查找特殊标签的值

CFStringRef __nullable CGImageMetadataCopyStringValueWithPath(CGImageMetadataRef __nonnull metadata, CGImageMetadataTagRef __nullable parent, CFStringRef __nonnull path);

//为一个前缀注册一个命名空间

bool CGImageMetadataRegisterNamespaceForPrefix(CGMutableImageMetadataRef __nonnull metadata, CFStringRef __nonnull xmlns, CFStringRef __nonnull prefix, __nullable CFErrorRef * __nullable err);

//通过路径为CGImageMetadata设置标签

bool CGImageMetadataSetTagWithPath(CGMutableImageMetadataRef __nonnull metadata, CGImageMetadataTagRef __nullable parent, CFStringRef __nonnull path, CGImageMetadataTagRef __nonnull tag);

//通过路径为CGImageMetadata设置标签的值

bool CGImageMetadataSetValueWithPath(CGMutableImageMetadataRef __nonnull metadata, CGImageMetadataTagRef __nullable parent, CFStringRef __nonnull path, CFTypeRef __nonnull value);

//通过路径移除一个标签

bool CGImageMetadataRemoveTagWithPath(CGMutableImageMetadataRef __nonnull metadata,  CGImageMetadataTagRef __nullable parent, CFStringRef __nonnull path);

//对标签进行枚举

void CGImageMetadataEnumerateTagsUsingBlock(CGImageMetadataRef __nonnull metadata, CFStringRef __nullable rootPath, CFDictionaryRef __nullable options, CGImageMetadataTagBlock __nonnull block);

五、CGImageProperties中定义的字典意义

    前面提到的CGImageSourceCopyProperties方法与CGImageSourceCopyPropertiesAtIndex方法都会返回一个字典,字典中可能包含如下有意义的键:

//TIFF信息字典

const CFStringRef kCGImagePropertyTIFFDictionary;

/GIF信息字典

const CFStringRef kCGImagePropertyGIFDictionary;

//JFIF信息字典

const CFStringRef kCGImagePropertyJFIFDictionary;

//EXif信息字典

const CFStringRef kCGImagePropertyExifDictionary;

//PNG信息字典

const CFStringRef kCGImagePropertyPNGDictionary;

//IPTC信息字典

const CFStringRef kCGImagePropertyIPTCDictionary;

//GPS信息字典

const CFStringRef kCGImagePropertyGPSDictionary;

//原始信息字典

const CFStringRef kCGImagePropertyRawDictionary;

//CIFF信息字典

const CFStringRef kCGImagePropertyCIFFDictionary;

//佳能相机信息字典

const CFStringRef kCGImagePropertyMakerCanonDictionary;

//尼康相机信息字典

const CFStringRef kCGImagePropertyMakerNikonDictionary;

//柯尼卡相机信息字典

const CFStringRef kCGImagePropertyMakerMinoltaDictionary;

//富士相机信息字典

const CFStringRef kCGImagePropertyMakerFujiDictionary;

//奥林巴斯相机信息字典

const CFStringRef kCGImagePropertyMakerOlympusDictionary;

//宾得相机信息字典

const CFStringRef kCGImagePropertyMakerPentaxDictionary;

//对应Photoshop相片的信息字典

const CFStringRef kCGImageProperty8BIMDictionary;

//NDG信息字典

const CFStringRef kCGImagePropertyDNGDictionary ;

//ExifAux信息字典

const CFStringRef kCGImagePropertyExifAuxDictionary;

//OpenEXR信息字典

const CFStringRef kCGImagePropertyOpenEXRDictionary;

//Apple相机信息字典

const CFStringRef kCGImagePropertyMakerAppleDictionary ;

CGImageSourceCopyProperties方法返回的字典中还可能会有如下一个特殊的键:

//对应文件大小

const CFStringRef kCGImagePropertyFileSize;

CGImageSourceCopyPropertiesAtIndex方法中可能包含的特殊键:

//像素高度

const CFStringRef kCGImagePropertyPixelHeight;

//像素宽度

const CFStringRef kCGImagePropertyPixelWidth;

//DPI高度

const CFStringRef kCGImagePropertyDPIHeight;

//DPI宽度

const CFStringRef kCGImagePropertyDPIWidth;

//颜色位数

const CFStringRef kCGImagePropertyDepth;

//图片的显示方向

/*

对应Number值

*  1  =  左上到右下. 

*  2  =  右上到左下. 

*  3  =  右下到左上.

*  4  =  左下到右上. 

*  5  =  行列置换 左上到右下. 

*  6  =  行列置换 右上到左下. 

*  7  =  行列置换 右下到左上. 

*  8  =  行列置换 左下到右上.

*/

const CFStringRef kCGImagePropertyOrientation;

//颜色是否支持浮点数

const CFStringRef kCGImagePropertyIsFloat;

//图像是否包含像素样本

const CFStringRef kCGImagePropertyIsIndexed;

//图像是否包含alpha通道

const CFStringRef kCGImagePropertyHasAlpha;

//图像的颜色模式

const CFStringRef kCGImagePropertyColorModel;

//嵌入图片的ICC配置文件名称

const CFStringRef kCGImagePropertyProfileName;

kCGImagePropertyColorModel键可返回的值有如下几种定义:

//RBG模式

const CFStringRef kCGImagePropertyColorModelRGB;

//Gray模式

const CFStringRef kCGImagePropertyColorModelGray;

//CMYK模式

const CFStringRef kCGImagePropertyColorModelCMYK;

//Lab模式

const CFStringRef kCGImagePropertyColorModelLab;

kCGImagePropertyTIFFDictionary键可返回的值定义如下:

//图片数据压缩方案

const CFStringRef kCGImagePropertyTIFFCompression;

//图片数据的色彩空间

const CFStringRef kCGImagePropertyTIFFPhotometricInterpretation;

//文档名称

const CFStringRef kCGImagePropertyTIFFDocumentName;

//图片描述

const CFStringRef kCGImagePropertyTIFFImageDescription;

//相机设备名

const CFStringRef kCGImagePropertyTIFFMake;

//相机设备模式

const CFStringRef kCGImagePropertyTIFFModel;

//图片方向

const CFStringRef kCGImagePropertyTIFFOrientation;

//横向每个分辨位的像素数

const CFStringRef kCGImagePropertyTIFFXResolution;

//纵向每个分辨位的像素数

const CFStringRef kCGImagePropertyTIFFYResolution;

//分辨率单位

const CFStringRef kCGImagePropertyTIFFResolutionUnit;

//创建图像的软件名称和版本

const CFStringRef kCGImagePropertyTIFFSoftware;

//transform函数

const CFStringRef kCGImagePropertyTIFFTransferFunction;

//日期时间

const CFStringRef kCGImagePropertyTIFFDateTime;

//作者

const CFStringRef kCGImagePropertyTIFFArtist;

//创建图片的电脑系统

const CFStringRef kCGImagePropertyTIFFHostComputer;

//公司信息

const CFStringRef kCGImagePropertyTIFFCopyright;

//图片的白点

const CFStringRef kCGImagePropertyTIFFWhitePoint;

//图像的原色色度

const CFStringRef kCGImagePropertyTIFFPrimaryChromaticities;

//图片的瓦片宽度

const CFStringRef kCGImagePropertyTIFFTileWidth;

//图片的瓦片高度

const CFStringRef kCGImagePropertyTIFFTileLength;

kCGImagePropertyJFIFDictionary对应的字典中可能包含如下意义的键:

//JFIF版本

const CFStringRef kCGImagePropertyJFIFVersion;

//横向像素密度

const CFStringRef kCGImagePropertyJFIFXDensity;

//纵向像素密度

const CFStringRef kCGImagePropertyJFIFYDensity;

//像素密度单元

const CFStringRef kCGImagePropertyJFIFDensityUnit;

//是否是高质量图像版本

const CFStringRef kCGImagePropertyJFIFIsProgressive;

kCGImagePropertyExifDictionary对应的字典中可能包含如下意义的键 :

//曝光时间

const CFStringRef kCGImagePropertyExifExposureTime;

//ExifNumber

const CFStringRef kCGImagePropertyExifFNumber;

//曝光程序

const CFStringRef kCGImagePropertyExifExposureProgram;

//每个通道的光谱灵敏度

const CFStringRef kCGImagePropertyExifSpectralSensitivity;

//ISO速度等级

const CFStringRef kCGImagePropertyExifISOSpeedRatings;

//ExifOECF

const CFStringRef kCGImagePropertyExifOECF;

//灵敏类型

const CFStringRef kCGImagePropertyExifSensitivityType;

//输出灵敏标准

const CFStringRef kCGImagePropertyExifStandardOutputSensitivity;

//推荐曝光指数

const CFStringRef kCGImagePropertyExifRecommendedExposureIndex;

//ISO速率

const CFStringRef kCGImagePropertyExifISOSpeed;

const CFStringRef kCGImagePropertyExifISOSpeedLatitudeyyy;

const CFStringRef kCGImagePropertyExifISOSpeedLatitudezzz;

//Exif版本

const CFStringRef kCGImagePropertyExifVersion;

//原始日期时间

const CFStringRef kCGImagePropertyExifDateTimeOriginal;

//数字化日期时间

const CFStringRef kCGImagePropertyExifDateTimeDigitized;

//压缩配置

const CFStringRef kCGImagePropertyExifComponentsConfiguration;

//压缩模式像素位

const CFStringRef kCGImagePropertyExifCompressedBitsPerPixel;

//快门速度值

const CFStringRef kCGImagePropertyExifShutterSpeedValue;

//孔径值

const CFStringRef kCGImagePropertyExifApertureValue;

//亮度值

const CFStringRef kCGImagePropertyExifBrightnessValue;

//曝光偏差值

const CFStringRef kCGImagePropertyExifExposureBiasValue;

//最大光圈值

const CFStringRef kCGImagePropertyExifMaxApertureValue;

//距离

const CFStringRef kCGImagePropertyExifSubjectDistance;

//测光模式

const CFStringRef kCGImagePropertyExifMeteringMode;

//光源

const CFStringRef kCGImagePropertyExifLightSource;

//拍摄时的闪光状态

const CFStringRef kCGImagePropertyExifFlash;

//焦距

const CFStringRef kCGImagePropertyExifFocalLength;

//主体区域

const CFStringRef kCGImagePropertyExifSubjectArea;

//相机制造商指定的信息

const CFStringRef kCGImagePropertyExifMakerNote;

//用户信息

const CFStringRef kCGImagePropertyExifUserComment;

//日期和时间标记的秒分数

const CFStringRef kCGImagePropertyExifSubsecTime;

//原始时间

const CFStringRef kCGImagePropertyExifSubsecTimeOriginal;

//数字时间

const CFStringRef kCGImagePropertyExifSubsecTimeDigitized;

//FlashPix版本信息

const CFStringRef kCGImagePropertyExifFlashPixVersion;

//色彩空间

const CFStringRef kCGImagePropertyExifColorSpace;

//X方向像素

const CFStringRef kCGImagePropertyExifPixelXDimension;

//Y方向像素

const CFStringRef kCGImagePropertyExifPixelYDimension;

//与图像相关的声音文件

const CFStringRef kCGImagePropertyExifRelatedSoundFile;

//FlashEnergy

const CFStringRef kCGImagePropertyExifFlashEnergy;

//FrequencyResponse

const CFStringRef kCGImagePropertyExifSpatialFrequencyResponse;

//像素数目

const CFStringRef kCGImagePropertyExifFocalPlaneXResolution;

const CFStringRef kCGImagePropertyExifFocalPlaneYResolution;

const CFStringRef kCGImagePropertyExifFocalPlaneResolutionUnit;

//图像主体的位置

const CFStringRef kCGImagePropertyExifSubjectLocation;

//选择的曝光指数

const CFStringRef kCGImagePropertyExifExposureIndex;

//传感器类型

const CFStringRef kCGImagePropertyExifSensingMethod;

//图像文件源

const CFStringRef kCGImagePropertyExifFileSource;

//场景类型

const CFStringRef kCGImagePropertyExifSceneType;

//CFA模块

const CFStringRef kCGImagePropertyExifCFAPattern;

//对图像数据进行特殊渲染

const CFStringRef kCGImagePropertyExifCustomRendered;

//曝光模式设置

const CFStringRef kCGImagePropertyExifExposureMode;

//白平衡模式

const CFStringRef kCGImagePropertyExifWhiteBalance;

//数字变焦比

const CFStringRef kCGImagePropertyExifDigitalZoomRatio;

//35毫米胶片的等效焦距

const CFStringRef kCGImagePropertyExifFocalLenIn35mmFilm;

//场景捕捉类型(标准,景观,肖像,夜晚)

const CFStringRef kCGImagePropertyExifSceneCaptureType;

//图像增益

const CFStringRef kCGImagePropertyExifGainControl;

//图像对比度

const CFStringRef kCGImagePropertyExifContrast;

//图像饱和度

const CFStringRef kCGImagePropertyExifSaturation;

//图像锐度

const CFStringRef kCGImagePropertyExifSharpness;

//拍摄条件

const CFStringRef kCGImagePropertyExifDeviceSettingDescription;

//主体距离

const CFStringRef kCGImagePropertyExifSubjectDistRange;

//图像的唯一标识

const CFStringRef kCGImagePropertyExifImageUniqueID;

//相机所有者

const CFStringRef kCGImagePropertyExifCameraOwnerName;

//相机序列号

const CFStringRef kCGImagePropertyExifBodySerialNumber;

//透镜规格信息

const CFStringRef kCGImagePropertyExifLensSpecification;

//透镜制造商名称

const CFStringRef kCGImagePropertyExifLensMake;

//透镜模式

const CFStringRef kCGImagePropertyExifLensModel;

//透镜序列号

const CFStringRef kCGImagePropertyExifLensSerialNumber;

//伽马设置

const CFStringRef kCGImagePropertyExifGamma;

kCGImagePropertyExifAuxDictionary对应的字典中可能包含的键定义如下:

//镜头信息

const CFStringRef kCGImagePropertyExifAuxLensInfo;

//镜头模式

const CFStringRef kCGImagePropertyExifAuxLensModel;

//序列号

const CFStringRef kCGImagePropertyExifAuxSerialNumber;

//镜头ID

const CFStringRef kCGImagePropertyExifAuxLensID;

//镜头序列号

const CFStringRef kCGImagePropertyExifAuxLensSerialNumber;

//图片编号

const CFStringRef kCGImagePropertyExifAuxImageNumber;

//闪光补偿

const CFStringRef kCGImagePropertyExifAuxFlashCompensation;

//所有者名称

const CFStringRef kCGImagePropertyExifAuxOwnerName;

//固件信息

const CFStringRef kCGImagePropertyExifAuxFirmware;

kCGImagePropertyGIFDictionary对应的字典中可能包含的键定义如下:

//动画循环次数

const CFStringRef kCGImagePropertyGIFLoopCount;

//两帧之间的延时

const CFStringRef kCGImagePropertyGIFDelayTime;

//颜色Map

const CFStringRef kCGImagePropertyGIFImageColorMap;

const CFStringRef kCGImagePropertyGIFHasGlobalColorMap;

//两帧之间的延时

const CFStringRef kCGImagePropertyGIFUnclampedDelayTime;

kCGImagePropertyPNGDictionary对应的字典中可能包含的键定义如下:

//PNG伽马值

const CFStringRef kCGImagePropertyPNGGamma;

//混合类型

const CFStringRef kCGImagePropertyPNGInterlaceType;

//X方向像素数

const CFStringRef kCGImagePropertyPNGXPixelsPerMeter;

//Y方向像素数

const CFStringRef kCGImagePropertyPNGYPixelsPerMeter;

//RGB意图

const CFStringRef kCGImagePropertyPNGsRGBIntent;

//色度

const CFStringRef kCGImagePropertyPNGChromaticities;

//作者

const CFStringRef kCGImagePropertyPNGAuthor;

//公司

const CFStringRef kCGImagePropertyPNGCopyright;

//创建时间

const CFStringRef kCGImagePropertyPNGCreationTime;

//描述

const CFStringRef kCGImagePropertyPNGDescription;

//最后修改日期时间

const CFStringRef kCGImagePropertyPNGModificationTime;

//软件

const CFStringRef kCGImagePropertyPNGSoftware;

//标题

const CFStringRef kCGImagePropertyPNGTitle;

//动画循环次数

const CFStringRef kCGImagePropertyAPNGLoopCount;

//两帧之间的延时

const CFStringRef kCGImagePropertyAPNGDelayTime;

const CFStringRef kCGImagePropertyAPNGUnclampedDelayTime;

kCGImagePropertyGPSDictionary对应的字典中可能包含的键定义如下:

//GPS版本

const CFStringRef kCGImagePropertyGPSVersion;

//纬度是南纬或北纬

const CFStringRef kCGImagePropertyGPSLatitudeRef;

//纬度

const CFStringRef kCGImagePropertyGPSLatitude;

//经度是东经或西经

const CFStringRef kCGImagePropertyGPSLongitudeRef;

//经度

const CFStringRef kCGImagePropertyGPSLongitude;

//海拔标准

const CFStringRef kCGImagePropertyGPSAltitudeRef;

//海拔高度

const CFStringRef kCGImagePropertyGPSAltitude;

//时间戳

const CFStringRef kCGImagePropertyGPSTimeStamp;

//测量GPS的卫星

const CFStringRef kCGImagePropertyGPSSatellites;

//GPS状态

const CFStringRef kCGImagePropertyGPSStatus;

//测量模式

const CFStringRef kCGImagePropertyGPSMeasureMode;

//精度数据

const CFStringRef kCGImagePropertyGPSDOP;

//速度标准

const CFStringRef kCGImagePropertyGPSSpeedRef;

//速度

const CFStringRef kCGImagePropertyGPSSpeed;

//运动方向参考

const CFStringRef kCGImagePropertyGPSTrackRef;

//运动方向

const CFStringRef kCGImagePropertyGPSTrack;

//位置方向参考

const CFStringRef kCGImagePropertyGPSImgDirectionRef;

//位置方向

const CFStringRef kCGImagePropertyGPSImgDirection;

//地图测量数据

const CFStringRef kCGImagePropertyGPSMapDatum;

//地理纬度南纬或北纬

const CFStringRef kCGImagePropertyGPSDestLatitudeRef;

//地理纬度

const CFStringRef kCGImagePropertyGPSDestLatitude;

//地理经度 东经或西经

const CFStringRef kCGImagePropertyGPSDestLongitudeRef;

//地理经度

const CFStringRef kCGImagePropertyGPSDestLongitude;

//方位参照

const CFStringRef kCGImagePropertyGPSDestBearingRef;

//地理方位

const CFStringRef kCGImagePropertyGPSDestBearing;

//距离参照

const CFStringRef kCGImagePropertyGPSDestDistanceRef;

//距离

const CFStringRef kCGImagePropertyGPSDestDistance;

//查找地理位置的方法

const CFStringRef kCGImagePropertyGPSProcessingMethod;

//GPS地区名

const CFStringRef kCGImagePropertyGPSAreaInformation;

//日期时间

const CFStringRef kCGImagePropertyGPSDateStamp;

//校正信息

const CFStringRef kCGImagePropertyGPSDifferental;

//错误信息

const CFStringRef kCGImagePropertyGPSHPositioningError;

kCGImagePropertyIPTCDictionary对应的字典中可能包含的键定义如下:

//对象类型

const CFStringRef kCGImagePropertyIPTCObjectTypeReference;

//对象属性

const CFStringRef kCGImagePropertyIPTCObjectAttributeReference;

//对象名称

const CFStringRef kCGImagePropertyIPTCObjectName;

//编辑状态

const CFStringRef kCGImagePropertyIPTCEditStatus;

//更新状态

const CFStringRef kCGImagePropertyIPTCEditorialUpdate;

//紧急等级

const CFStringRef kCGImagePropertyIPTCUrgency;

//主体

const CFStringRef kCGImagePropertyIPTCSubjectReference;

//类别

const CFStringRef kCGImagePropertyIPTCCategory;

//补充类别

const CFStringRef kCGImagePropertyIPTCSupplementalCategory;

//Fixture标识

const CFStringRef kCGImagePropertyIPTCFixtureIdentifier;

//关键字

const CFStringRef kCGImagePropertyIPTCKeywords;

//内容定位码

const CFStringRef kCGImagePropertyIPTCContentLocationCode;

//内容位置名称

const CFStringRef kCGImagePropertyIPTCContentLocationName;

//图像使用的最早日期

const CFStringRef kCGImagePropertyIPTCReleaseDate;

//图像使用的最早时间

const CFStringRef kCGImagePropertyIPTCReleaseTime;

//最后一次使用日期

const CFStringRef kCGImagePropertyIPTCExpirationDate;

//最后一次使用时间

const CFStringRef kCGImagePropertyIPTCExpirationTime;

//图像使用的特别说明

const CFStringRef kCGImagePropertyIPTCSpecialInstructions;

//建议行为

const CFStringRef kCGImagePropertyIPTCActionAdvised;

//服务参考

const CFStringRef kCGImagePropertyIPTCReferenceService;

//日期参考

const CFStringRef kCGImagePropertyIPTCReferenceDate;

//参考码

const CFStringRef kCGImagePropertyIPTCReferenceNumber;

//创建日期

const CFStringRef kCGImagePropertyIPTCDateCreated;

//创建时间

const CFStringRef kCGImagePropertyIPTCTimeCreated;

//数字创建日期

const CFStringRef kCGImagePropertyIPTCDigitalCreationDate;

//数字创建时间

const CFStringRef kCGImagePropertyIPTCDigitalCreationTime;

//原始程序

const CFStringRef kCGImagePropertyIPTCOriginatingProgram;

//程序版本

const CFStringRef kCGImagePropertyIPTCProgramVersion;

图像的编辑周期(早晨,晚上或两者)。

const CFStringRef kCGImagePropertyIPTCObjectCycle;

//不想创建者名称

const CFStringRef kCGImagePropertyIPTCByline;

//图像创建标题

const CFStringRef kCGImagePropertyIPTCBylineTitle;

//城市信息

const CFStringRef kCGImagePropertyIPTCCity;

//城市内位置

const CFStringRef kCGImagePropertyIPTCSubLocation;

//省份

const CFStringRef kCGImagePropertyIPTCProvinceState;

//国家编码

const CFStringRef kCGImagePropertyIPTCCountryPrimaryLocationCode;

//国家名称

const CFStringRef kCGImagePropertyIPTCCountryPrimaryLocationName;

//OriginalTransmission参考

const CFStringRef kCGImagePropertyIPTCOriginalTransmissionReference;

//图像内容摘要

const CFStringRef kCGImagePropertyIPTCHeadline;

//提供图像服务的名称

const CFStringRef kCGImagePropertyIPTCCredit;

//图像源

const CFStringRef kCGImagePropertyIPTCSource;

//公司提示

const CFStringRef kCGImagePropertyIPTCCopyrightNotice;

//联系人

const CFStringRef kCGImagePropertyIPTCContact;

//描述

const CFStringRef kCGImagePropertyIPTCCaptionAbstract;

//图像编辑者

const CFStringRef kCGImagePropertyIPTCWriterEditor;

//图像类型

const CFStringRef kCGImagePropertyIPTCImageType;

//方向信息

const CFStringRef kCGImagePropertyIPTCImageOrientation;

//语言信息

const CFStringRef kCGImagePropertyIPTCLanguageIdentifier;

//星级

const CFStringRef kCGImagePropertyIPTCStarRating;

//联系人详细信息

const CFStringRef kCGImagePropertyIPTCCreatorContactInfo;

//图像使用权限

const CFStringRef kCGImagePropertyIPTCRightsUsageTerms;

//场景代码

const CFStringRef kCGImagePropertyIPTCScene;

上面的kCGImagePropertyIPTCCreatorContactInfo对应的字典中键的定义如下:

//联系人城市

const CFStringRef kCGImagePropertyIPTCContactInfoCity;

//联系人国家

const CFStringRef kCGImagePropertyIPTCContactInfoCountry;

//联系人地址

const CFStringRef kCGImagePropertyIPTCContactInfoAddress;

//邮编

const CFStringRef kCGImagePropertyIPTCContactInfoPostalCode;

//省份

const CFStringRef kCGImagePropertyIPTCContactInfoStateProvince;

//电子邮件

const CFStringRef kCGImagePropertyIPTCContactInfoEmails;

//电话

const CFStringRef kCGImagePropertyIPTCContactInfoPhones;

//网址

const CFStringRef kCGImagePropertyIPTCContactInfoWebURLs;

kCGImageProperty8BIMDictionary对应的字典中可能包含的键定义如下:

//Photoshop文件的图层名

const CFStringRef  kCGImageProperty8BIMLayerNames;

//版本

const CFStringRef  kCGImageProperty8BIMVersion;

kCGImagePropertyDNGDictionary对应的字典中可能包含的键定义如下:

//DNG版本

const CFStringRef  kCGImagePropertyDNGVersion;

//兼容的最老版本

const CFStringRef  kCGImagePropertyDNGBackwardVersion;

//摄像机模型

const CFStringRef  kCGImagePropertyDNGUniqueCameraModel;

const CFStringRef  kCGImagePropertyDNGLocalizedCameraModel;

//相机序列码

const CFStringRef  kCGImagePropertyDNGCameraSerialNumber;

//镜头信息

const CFStringRef  kCGImagePropertyDNGLensInfo;

//黑度等级

const CFStringRef  kCGImagePropertyDNGBlackLevel;

//白度等级

const CFStringRef  kCGImagePropertyDNGWhiteLevel;

const CFStringRef  kCGImagePropertyDNGCalibrationIlluminant1;

const CFStringRef  kCGImagePropertyDNGCalibrationIlluminant2;

const CFStringRef  kCGImagePropertyDNGColorMatrix1;

const CFStringRef  kCGImagePropertyDNGColorMatrix2;

const CFStringRef  kCGImagePropertyDNGCameraCalibration1;

const CFStringRef  kCGImagePropertyDNGCameraCalibration2;

const CFStringRef  kCGImagePropertyDNGAsShotNeutral;

const CFStringRef  kCGImagePropertyDNGAsShotWhiteXY;

const CFStringRef  kCGImagePropertyDNGBaselineExposure;

const CFStringRef  kCGImagePropertyDNGBaselineNoise;

const CFStringRef  kCGImagePropertyDNGBaselineSharpness;

const CFStringRef  kCGImagePropertyDNGPrivateData;

const CFStringRef  kCGImagePropertyDNGCameraCalibrationSignature;

const CFStringRef  kCGImagePropertyDNGProfileCalibrationSignature;

const CFStringRef  kCGImagePropertyDNGNoiseProfile;

const CFStringRef  kCGImagePropertyDNGWarpRectilinear;

const CFStringRef  kCGImagePropertyDNGWarpFisheye;

const CFStringRef  kCGImagePropertyDNGFixVignetteRadial;

kCGImagePropertyCIFFDictionary对应的字典中可能包含的键定义如下:

//相机信息

const CFStringRef  kCGImagePropertyCIFFDescription;

//固件版本

const CFStringRef  kCGImagePropertyCIFFFirmware;

//所有者名称

const CFStringRef  kCGImagePropertyCIFFOwnerName;

//图片名

const CFStringRef  kCGImagePropertyCIFFImageName;

//图片文件名

const CFStringRef  kCGImagePropertyCIFFImageFileName;

//曝光方式

const CFStringRef  kCGImagePropertyCIFFReleaseMethod;

//曝光时间

const CFStringRef  kCGImagePropertyCIFFReleaseTiming;

//RecordID

const CFStringRef  kCGImagePropertyCIFFRecordID;

//曝光时间

const CFStringRef  kCGImagePropertyCIFFSelfTimingTime;

//相机序列号

const CFStringRef  kCGImagePropertyCIFFCameraSerialNumber;

//图片编码

const CFStringRef  kCGImagePropertyCIFFImageSerialNumber;

//驱动模式

const CFStringRef  kCGImagePropertyCIFFContinuousDrive);

//焦点模式

const CFStringRef  kCGImagePropertyCIFFFocusMode;

//测量模式

const CFStringRef  kCGImagePropertyCIFFMeteringMode;

//曝光模式

const CFStringRef  kCGImagePropertyCIFFShootingMode;

//透镜模式

const CFStringRef  kCGImagePropertyCIFFLensModel;

//最长镜头长度

const CFStringRef  kCGImagePropertyCIFFLensMaxMM;

//最短镜头长度

const CFStringRef  kCGImagePropertyCIFFLensMinMM;

//白平衡等级

const CFStringRef  kCGImagePropertyCIFFWhiteBalanceIndex;

//曝光补偿

const CFStringRef  kCGImagePropertyCIFFFlashExposureComp;

//实测曝光值

const CFStringRef  kCGImagePropertyCIFFMeasuredEV);

六、ImageIO框架在实际开发中的几个应用

1.显示特殊格式的图片

    在平时开发中,我们通常使用UIImage来读取图片,UIImage支持的图片包括png与jpg等,但是类似windows系统的ico图标,UIImage默认是无法显示的,可以通过ImageIO框架来在iOS系统中使用ico图标,示例如下:

NSString * path = [[NSBundle mainBundle]pathForResource:@"image" ofType:@"ico"];

    NSURL * url = [NSURL fileURLWithPath:path];

    CGImageRef myImage = NULL;

    CGImageSourceRef myImageSource;

    CFDictionaryRef myOptions = NULL;

    myImageSource = CGImageSourceCreateWithURL((CFURLRef)url, NULL);

    myImage = CGImageSourceCreateImageAtIndex(myImageSource,

                                              0,

                                              NULL);

    CFRelease(myImageSource);

    UIImageView * image = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 200, 200)];

    image.image = [UIImage imageWithCGImage:myImage];

2.读取数码相机拍摄图片的地理位置、时间等信息

3.对相册中图片的地理位置,时间等信息进行自定义修改。

4.将自定义格式的图片数据写入本地文件。

5.展示GIF动图 详情见博客:https://my.oschina.net/u/2340880/blog/608560

6.渐进渲染大图

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容