iOS COLOR

iOS中的颜色有UIColor、CGColor、CIColor三种,下面对三种颜色分别进行说明:

一、常用的UIColor

UIColor是UIKit中存储颜色信息的一个重要的类,一个UIColor对象包含了颜色和透明度的值,它的颜色空间已经针对IOS进行了优化。UIColor包含了一些类方法用于创建一些最常见的颜色,如白色,黑色,红色,透明色等,这些颜色的色彩空间也不尽相同(白色和黑色是kCGColorSpaceDeviceGray,红色的色彩空间是kCGColorSpaceDeviceRGB)。

此外UIColor还有两个重要的属性:一个是CGColor,一个是CIColor(5.0之后添加)。这两个属性就可以把UIColor,CGColor,CIColor三个对象联系起来了。

常用的设置颜色方法:

+ (UIColor *)colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha;//指定RGB,参数是:红、绿、黄、透明度,范围是0-1

+ (UIColor *)colorWithHue:(CGFloat)hue saturation:(CGFloat)saturation brightness:(CGFloat)brightness alpha:(CGFloat)alpha;//指定HSB,参数是:色调(hue),饱和的(saturation),亮度(brightness)

//当前的颜色改变透明度后的颜色:

UIColor *color = [UIColor redColor];

UIColor *cl = [color colorWithAlphaComponent:0.5f];

//自定义255的颜色值,将255转成0-1

CGFloat R  = (CGFloat) 225/255.0;

CGFloat G = (CGFloat) 66/255.0;

CGFloat B = (CGFloat) 88/255.0;

CGFloat alpha = (CGFloat) 1.0;

UIColor *myColorRGB = [ UIColor colorWithRed: R  green: G  blue: B  alpha: alpha  ];

self.tableView.backgroundColor = myColorRGB;


UIColor常用方法列表:

// Convenience methods for creating autoreleased colors

+ (UIColor *)colorWithWhite:(CGFloat)white alpha:(CGFloat)alpha;

+ (UIColor *)colorWithHue:(CGFloat)hue saturation:(CGFloat)saturation brightness:(CGFloat)brightness alpha:(CGFloat)alpha;

+ (UIColor *)colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha;

+ (UIColor *)colorWithCGColor:(CGColorRef)cgColor;

+ (UIColor *)colorWithPatternImage:(UIImage *)image;

+ (UIColor *)colorWithCIColor:(CIColor *)ciColor NS_AVAILABLE_IOS(5_0);


// Initializers for creating non-autoreleased colors

- (UIColor *)initWithWhite:(CGFloat)white alpha:(CGFloat)alpha;

- (UIColor *)initWithHue:(CGFloat)hue saturation:(CGFloat)saturation brightness:(CGFloat)brightness alpha:(CGFloat)alpha;

- (UIColor *)initWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha;

- (UIColor *)initWithCGColor:(CGColorRef)cgColor;

- (UIColor *)initWithPatternImage:(UIImage*)image;

- (UIColor *)initWithCIColor:(CIColor *)ciColor NS_AVAILABLE_IOS(5_0);


// Some convenience methods to create colors.  These colors will be as calibrated as possible.

// These colors are cached.

+ (UIColor *)blackColor;      // 0.0 white

+ (UIColor *)darkGrayColor;   // 0.333 white

+ (UIColor *)lightGrayColor;  // 0.667 white

+ (UIColor *)whiteColor;      // 1.0 white

+ (UIColor *)grayColor;       // 0.5 white

+ (UIColor *)redColor;        // 1.0, 0.0, 0.0 RGB

+ (UIColor *)greenColor;      // 0.0, 1.0, 0.0 RGB

+ (UIColor *)blueColor;       // 0.0, 0.0, 1.0 RGB

+ (UIColor *)cyanColor;       // 0.0, 1.0, 1.0 RGB

+ (UIColor *)yellowColor;     // 1.0, 1.0, 0.0 RGB

+ (UIColor *)magentaColor;    // 1.0, 0.0, 1.0 RGB

+ (UIColor *)orangeColor;     // 1.0, 0.5, 0.0 RGB

+ (UIColor *)purpleColor;     // 0.5, 0.0, 0.5 RGB

+ (UIColor *)brownColor;      // 0.6, 0.4, 0.2 RGB

+ (UIColor *)clearColor;      // 0.0 white, 0.0 alpha



二、Core Gaphics框架中的CGColor

CGColor主要用于CoreGaphics框架之中,CGColor其实是个结构体,而我们通常在使用的CGColor的时候使用的是它的引用类型CGColorRef。CGColor主要由CGColorSapce和Color Components两个部分组成,同样的颜色组成,如果颜色空间不同的话,解析出来的结果可能会有所不同。这就像我们在处理图片数据的时候,如果把RGBA格式当成BGRA格式处理的结果可想而知。在Quartz 2D中CGColor常用来设置context的填充颜色,设置透明度等。

用法:

1、如何创建一个CGColor,最常用的函数是CGColorCreate,该函数有两个参数:

1) colorspace,指定CGColor对应的颜色空间,Quartz就会retain该对象,因此调用完之后你就可以安全的释放该对象。

2) components,一个CGFloat的数组,该数组的元素个数是指定色彩空间包含的颜色分量数n,加上对应的alpha值。

该函数该返回一个新创建的CGColorRef,当我们不再使用该对象的时候使用CGColorRelease函数释放该对象。


通过Core Library的文档,我们知道创建颜色有这么几个方法:

CGColorCreate

CGColorCreateCopy

CGColorCreateGenericGray

CGColorCreateGenericRGB

CGColorCreateGenericCMYK

CGColorCreateCopyWithAlpha

CGColorCreateWithPattern

再来看一下CGColorCreate:

CGColorRef CGColorCreate (

CGColorSpaceRef colorspace,

const CGFloat components[]

);


我们通过CGColorCreate就可以创建颜色。既然我们要用RGB表示颜色,那么colorspace这个参数我们就可以使用CGColorSpaceCreateDeviceRGB()。


2、获取CGColor的数据

在我们创建的时候传入两个重要的参数进去,当我们获取到了CGColorRef以后当然就可以拿到对应的ColorSpace以及Components。

1) 获取ColorSpace

通过CGColorGetColorSpace函数我们可以获取到当前CGColorRef对应的ColorSpace,该函数只接受一个参数就是你要获取ColorSpace的CGColorRef。下面请看一个简单的例子:

CGColorRef cgColor = [UIColor redColor].CGColor;

CGColorSpaceRef colorSpace = CGColorGetColorSpace(cgColor);

NSLog(@"color space: %@", colorSpace);


2) 获取Color Components

要获取到CGColorRef对应的颜色值,我们需要用到CGColorGetNumberOfComponents和CGColorGetComponents两个函数。我们先来看看两个函数的函数原型:


size_t CGColorGetNumberOfComponents (

CGColorRef color

);

const CGFloat * CGColorGetComponents (

CGColorRef color

);

第一个函数是获得CGColorRef的中包含的颜色组成部分的个数,第二个函数就是获取实际的颜色组成部分的数组,下面看一个小例子:

NSUInteger num = CGColorGetNumberOfComponents(cgColor);

const CGFloat *colorComponents = CGColorGetComponents(cgColor);

for (int i = 0; i < num; ++i) {

NSLog(@"color components %d: %f", i, colorComponents[i]);

//red is componentColors[0];

//green is componentColors[1];

//blue is componentColors[2];

//alpha is componentColors[3];

}

这个colorComponents参数是一个数组,带有4个数值:

float color[]={红色分量, 绿色分量, 蓝色分量, alpha分量};

这4个数值都是0-1区间,0表示黑(不发光),数字越大这种颜色的光线越强,alpha分量表示透明度。比如{1.0, 0, 0,1.0}就是纯红色而且完全不透明。


三、Core Image框架中的CIColor

CIColor主要是用于和Core Image框架中其他类,比如CIFilter,CIContext以及CIImage。今天我们主要关心的颜色值部分,CIColor中颜色值的范围是0.0-1.0之间,0.0代表该颜色分量为最小值,1.0代表改颜色分量为最大值。其中alpha值的范围也是0.0到1.0之间,0.0代表全透明,1.0代表完全不透明,同时CIColor的颜色分量通常都是没有乘以alpha值。

我们可以使用initWithCGColor:函数,通过CGColor创建一个CIColor。其中传入的CGColorRef对象可以使任何任何颜色空间,但是Core Image框架会在传入filter kernel之前把所有的颜色空间转换到core image工作颜色空间。core image工作颜色空间使用三个颜色分量加上一个alpha分量组成(其实就是kCGColorSpaceDeviceRGB),后面的例子中我们验证这一点。


常用方法列表:

/* Create a new color object. */

+ (CIColor *)colorWithCGColor:(CGColorRef)c;

/* Create a new color object.

It's created using the GenericRGB color space. To create a CIColor with a different color space, use +colorWithCGColor:. */

+ (CIColor *)colorWithRed:(CGFloat)r green:(CGFloat)g blue:(CGFloat)b alpha:(CGFloat)a;

+ (CIColor *)colorWithRed:(CGFloat)r green:(CGFloat)g blue:(CGFloat)b;

/* Create a new color object, 'representation' should be a string in one of

* the formats returned by the stringRepresentation method. */

+ (CIColor *)colorWithString:(NSString *)representation;

/* Initializer. */

- (id)initWithCGColor:(CGColorRef)c;


/* Return the number of color components (including alpha). */

- (size_t)numberOfComponents;


/* Return the color components (including alpha). */

- (const CGFloat *)components;


/* Return the alpha value of the color. */

- (CGFloat)alpha;


/* Return the color space object associated with the color. */

- (CGColorSpaceRef)colorSpace;


/* Return the (unpremultiplied) red, green or blue components of the color. */

- (CGFloat)red;

- (CGFloat)green;

- (CGFloat)blue;


/* Returns a formatted string with the components of the color. */

- (NSString *)stringRepresentation;


四、UIColor,CGColor,CIColor的区别和联系

1、UIColor的两个属性CGColor,CIColor

UIColor的CGColor总是有效的,不管它是通过CGColor,CIColor,还是其他方法创建的,CGColor属性都总是有效的;但是CIColor属性就不总是有效的,只有当UIColor是通过CIColor创建的时候,他才是有效的,否则访问该属性将会抛出异常,下面是例子:


// test init uicolor with CGColor

UIColor *color = [UIColor colorWithCGColor:[UIColor whiteColor].CGColor];

// CGColor property is always valid

NSLog(@"CGColor from UIColor %@", color.CGColor);


// don't use CIColor property

// This property throws an exception if the color object was not initialized with a Core Image color.

NSLog(@"CIColor from UIColor %@", color.CIColor);   // crush


2、UIColor使用CGColor初始化

当UIColor使用CGColor初始化的时候,所有CGColorRef包含的信息,都会被原封不动的保留,其中就包括Color space,而且通过下面的小例子我们还可以看到如果使用CGColor初始化UIColor的时候,UIColor其实是直接保留了一份这个CGColorRef对象。例子如下:


// test kCGColorSpaceDeviceCMYK

CGColorSpaceRef cmykSpace = CGColorSpaceCreateDeviceCMYK();

CGFloat cmykValue[] = {1, 1, 0, 0, 1};      // blue

CGColorRef colorCMYK = CGColorCreate(cmykSpace, cmykValue);

CGColorSpaceRelease(cmykSpace);

NSLog(@"colorCMYK: %@", colorCMYK);

// color with CGColor, uicolor will just retain it

UIColor *color = [UIColor colorWithCGColor:colorCMYK];

NSLog(@"CGColor from UIColor: %@", color.CGColor);

3、UIColor使用CIColor初始化

下面我们讨论一下当使用CIColor来初始化一个UIColor的时候,再去访问UIColor的CGColor属性的时候,我们会发现CGColor的color Space和设置CIColor的color space的是不完全一样的,在这个过程中CIColor会为我们做一个转换。下面我们分别看看使用kCGColorSpaceDeviceGray,kCGColorSpaceDeviceRGB,kCGColorSpaceDeviceCMYK三种颜色空间来初始化一个CIColor的时候,再去使用该CIColor去初始化一个UIColor,然后在去访问其CIColor属,CGColor属性,查看颜色空间并打印颜色信息。

使用kCGColorSpaceDeviceGray初始化CIColor

// test kCGColorSpaceDeviceGray

NSLog(@"CGColor white color:%@", [UIColor whiteColor].CGColor);

CIColor *ciColor = [CIColor colorWithCGColor:[UIColor whiteColor].CGColor];

NSLog(@"cicolor: %@", ciColor);

NSLog(@"cicolor colorspace: %@", ciColor.colorSpace);

color = [UIColor colorWithCIColor:ciColor];

NSLog(@"color %@", color);

// Core Image converts all color spaces to the Core Image working color

// space before it passes the color space to the filter kernel.

// kCGColorSpaceDeviceGray ---> kCGColorSpaceDeviceRGB

NSLog(@"cicolor from UIColor: %@", color.CIColor);

NSLog(@"cicolor's colorspace: %@", color.CIColor.colorSpace);

NSLog(@"color's CGColor: %@", color.CGColor);


通过运行程序,我们看出来,如果使用一个kCGColorSpaceDeviceGray的颜色空间的CGColor来初始化CIColor的时候,我们可以看到CIColor的色彩空间一直是kCGColorSpaceDeviceGray,通过访问UIColor的CIColor属性,我们可以看到其颜色空间仍然是kCGColorSpaceDeviceGray,但是当访问UIColor的CGColor属性的时候,通过打印可以发现其色彩空间已经转变成了kCGColorSpaceDeviceRGB空间了,而颜色值也正确的从原来的颜色空间转换到了新的颜色空间。

使用kCGColorSpaceDeviceRGB初始化CIColor

//test kCGColorSpaceDeviceRGB

NSLog(@"CGColor red color:%@", [UIColor redColor].CGColor);

CIColor *ciColor = [CIColor colorWithCGColor:[UIColor redColor].CGColor];

NSLog(@"cicolor: %@", ciColor);

NSLog(@"cicolor colorspace: %@", ciColor.colorSpace);

UIColor *color = [UIColor colorWithCIColor:ciColor];

NSLog(@"color %@", color);

NSLog(@"cicolor from UIColor: %@", color.CIColor);

NSLog(@"cicolor's colorspace: %@", color.CIColor.colorSpace);

NSLog(@"color's CGColor: %@", color.CGColor);


整个过程中CIColor,以及通过UIColor的CGColor和CIColor属性访问到的值,打印出来我们可以发现它们都是kCGColorSpaceDeviceRGB空间的。


4、使用kCGColorSpaceDeviceCMYK初始化CIColor

// test kCGColorSpaceDeviceCMYK

CGColorSpaceRef cmykSpace = CGColorSpaceCreateDeviceCMYK();

NSLog(@"Components number: %zu", CGColorSpaceGetNumberOfComponents(cmykSpace));

CGFloat cmykValue[] = {1, 1, 0, 0, 1};      // blue

CGColorRef colorCMYK = CGColorCreate(cmykSpace, cmykValue);

CGColorSpaceRelease(cmykSpace);

NSLog(@"colorCMYK: %@", colorCMYK);

ciColor = [CIColor colorWithCGColor:colorCMYK];

NSLog(@"cicolor: %@", ciColor);     // in fact,the color value of CIColor has converted to RGB Colorspace

NSLog(@"cicolor colorspace: %@", ciColor.colorSpace);

color = [UIColor colorWithCIColor:ciColor];

NSLog(@"UIColor with CIColor: %@", color);

NSLog(@"cicolor from UIColor: %@", color.CIColor);

NSLog(@"cicolor's colorspace: %@", color.CIColor.colorSpace);

// when UIColor init with CIColor, UIColor's CGColor will convert other colorspace to kCGColorSpaceDeviceRGB

NSLog(@"cgcolor from UIColor: %@", color.CGColor);


整个过程中,我们通过运行同样可以发现,当我们用一个CMYK颜色空间的CGColor来初始化CIColor的时候,CIColor的颜色空间依然是CMYK,但是颜色值已经转换成RGB的颜色值。当使用该CIColor创建一个UIColor的时候,我们再通过CIColor和CGColor属性打印信息的时候,我们会发现CIColor的色彩空间依然是CMYK,但是CGColor打印所得到的信息说明它已经被转换成RGB空间了。



扩展:


常用宏

#define RGBA_COLOR(R, G, B, A) [UIColor colorWithRed:((R) / 255.0f) green:((G) / 255.0f) blue:((B) / 255.0f) alpha:A]

#define RGB_COLOR(R, G, B) [UIColor colorWithRed:((R) / 255.0f) green:((G) / 255.0f) blue:((B) / 255.0f) alpha:1.0f]

//16进制颜色

#define UIColorFromHex(hex) [UIColor colorWithRed:((float)((hex & 0xFF0000) >> 16))/255.0 green:((float)((hex & 0xFF00) >> 8))/255.0 blue:((float)(hex & 0xFF))/255.0 alpha:1.0]


iOS获取图片UIImage颜色均值AverageColor

- (UIColor *)averageColorForImage:(UIImage*)image {

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

unsigned char rgba[4];

CGContextRef context = CGBitmapContextCreate(rgba, 1, 1, 8, 4, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);

CGContextDrawImage(context, CGRectMake(0, 0, 1, 1), image.CGImage);

CGColorSpaceRelease(colorSpace);

CGContextRelease(context);

if(rgba[3] > 0) {

CGFloat alpha = ((CGFloat)rgba[3])/255.0;

CGFloat multiplier = alpha/255.0;

return [UIColor colorWithRed:((CGFloat)rgba[0])*multiplier

green:((CGFloat)rgba[1])*multiplier

blue:((CGFloat)rgba[2])*multiplier

alpha:alpha];

}

else {

return [UIColor colorWithRed:((CGFloat)rgba[0])/255.0

green:((CGFloat)rgba[1])/255.0

blue:((CGFloat)rgba[2])/255.0

alpha:((CGFloat)rgba[3])/255.0];

}

}


使用颜色创建图片:

+ (UIImage *) createImageWithColor: (UIColor *) color

{

CGRect rect=CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);

UIGraphicsBeginImageContext(rect.size);

CGContextRef context = UIGraphicsGetCurrentContext();

CGContextSetFillColorWithColor(context, [color CGColor]);

CGContextFillRect(context, rect);

UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

return theImage;

}


获取颜色透明度:


- (CGFloat) alphaForColor:(UIColor*)color {

CGFloat r, g, b, a, w, h, s, l;

BOOL compatible = [color getWhite:&w alpha:&a];

if (compatible) {

return a;

} else {

compatible = [color getRed:&r green:&g blue:&b alpha:&a];

if (compatible) {

return a;

} else {

[color getHue:&h saturation:&s brightness:&l alpha:&a];

return a;

}

}

}


判断颜色深浅:


-(BOOL)isDarkColor:(UIColor *)newColor{

if ([self alphaForColor: newColor]<10e-5) {

return YES;

}

const CGFloat *componentColors = CGColorGetComponents(newColor.CGColor);

CGFloat colorBrightness = ((componentColors[0] * 299) + (componentColors[1] * 587) + (componentColors[2] * 114)) / 1000;

if (colorBrightness < 0.5){

NSLog(@"Color is dark");

return YES;

}

else{

NSLog(@"Color is light");

return NO;

}

}


取得图片某一像素点的颜色值:

- (UIColor*) getPixelColorAtLocation:(CGPoint)point inImage:(UIImage *)image {

UIColor* color = nil;

CGImageRef inImage = image.CGImage;

CGContextRef cgctx = [self createARGBBitmapContextFromImage:

inImage];

if (cgctx == NULL) {

return nil; /* error */

}

size_t w = CGImageGetWidth(inImage);

size_t h = CGImageGetHeight(inImage);

CGRect rect = {{0,0},{w,h}};

CGContextDrawImage(cgctx, rect, inImage);

unsigned char* data = CGBitmapContextGetData (cgctx);

if (data != NULL) {

int offset = 4*((w*round(point.y))+round(point.x));

int alpha =  data[offset];

int red = data[offset+1];

int green = data[offset+2];

int blue = data[offset+3];

color = [UIColor colorWithRed:(red/255.0f) green:(green/255.0f) blue:

(blue/255.0f) alpha:(alpha/255.0f)];

}

CGContextRelease(cgctx);

if (data) {

free(data);

}

return color;

}

- (CGContextRef) createARGBBitmapContextFromImage:(CGImageRef) inImage {

CGContextRef context = NULL;

CGColorSpaceRef colorSpace;

void *bitmapData;

int bitmapByteCount;

int bitmapBytesPerRow;

size_t pixelsWide = CGImageGetWidth(inImage);

size_t pixelsHigh = CGImageGetHeight(inImage);

bitmapBytesPerRow = (pixelsWide * 4);

bitmapByteCount = (bitmapBytesPerRow * pixelsHigh);

colorSpace = CGColorSpaceCreateDeviceRGB();

if (colorSpace == NULL){

fprintf(stderr, "Error allocating color space\n");

return NULL;

}

bitmapData = malloc( bitmapByteCount );

if (bitmapData == NULL){

fprintf (stderr, "Memory not allocated!");

CGColorSpaceRelease( colorSpace );

return NULL;

}

context = CGBitmapContextCreate (bitmapData,pixelsWide,pixelsHigh,8,bitmapBytesPerRow,colorSpace,kCGImageAlphaPremultipliedFirst);

if (context == NULL){

free (bitmapData);

fprintf (stderr, "Context not created!");

}

CGColorSpaceRelease( colorSpace );

return context;

}


如何判断两个颜色是否相等

前面提到一点,不管UIColor使用CIColor,CGColor还是其他方式初始化的,其CGColor属性都是可用的。CoreGraphics中提供一个方法可以判断两个CGColor是否相等,因此我们可以通过判断两个UIColor是否相等,下面是看一个简单的例子:

// judge two CGColor is equal

if (CGColorEqualToColor([UIColor whiteColor].CGColor, [UIColor colorWithRed:1 green:1 blue:1 alpha:1].CGColor)) {

NSLog(@"The two CGColor is equal!");

}

else {

NSLog(@"The two CGColor is not equal!");

}

if (CGColorEqualToColor([UIColor colorWithRed:1 green:1 blue:1 alpha:1].CGColor, [UIColor colorWithRed:1 green:1 blue:1 alpha:1].CGColor)) {

NSLog(@"The two CGColor is equal!");

}

else {

NSLog(@"The two CGColor is not equal!");

}

例子中第一部分是判断两个白色的UIColor是否相等,虽然都是白色,但是颜色空间是不一样的,通过运行我们可以发现,打印出“The two CGColor is not equal!”。例子的第二部分简单的创建了两个RGB空间的UIColor,运行程序可以看出,这两种颜色是相同的。

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

推荐阅读更多精彩内容