iOS哀掉日黑白化

因?yàn)樽罱霭У羧?code>App黑白化的需求君丁,需要依據(jù)下發(fā)的配置對(duì)APP的首頁(yè)或者整體進(jìn)行置為灰色,因此這里針對(duì)方案做一下總結(jié)砰蠢。

一. 方案一

最開(kāi)始想到的就是給App添加一層灰色濾鏡,將App所有的視圖通過(guò)濾鏡虱岂,都變?yōu)榛疑簿褪窃?code>window或者首頁(yè)的view上添加這樣一種灰色濾鏡效果菠红,使得整個(gè)App界面或者首頁(yè)變?yōu)榛疑?/p>


+ (void)addGreyFilterToView:(UIView *)view {
  UIView *coverView = [[UIView alloc] initWithFrame:view.bounds];
  coverView.userInteractionEnabled = NO;
  coverView.tag = kFJFGreyFilterTag;
  coverView.backgroundColor = [UIColor lightGrayColor];
  coverView.layer.compositingFilter = @"saturationBlendMode";
  coverView.layer.zPosition = FLT_MAX;
  [view addSubview:coverView];
}

+ (void)removeGreyFilterToView:(UIView *)view {
  UIView *greyView = [view viewWithTag:kFJFGreyFilterTag];
  [greyView removeFromSuperview];
}

我們可以通過(guò)addGreyFilterToView方法將灰色濾鏡放置到App的對(duì)應(yīng)的視圖上第岖,比如window或者首頁(yè)view上,這樣就可以保證對(duì)應(yīng)視圖试溯,及其所有子視圖都為灰色蔑滓。

如下是將addGreyFilterToView添加到App對(duì)應(yīng)的window上,來(lái)使得整個(gè)界面變化灰色遇绞。

展示效果:

grey_filter_view.gif

該方法的主要原理是設(shè)置一個(gè)淺灰色的lightGrayColor的顏色键袱,然后將該淺灰色的飽和度,應(yīng)用到將要顯示的視圖上摹闽,使得將要顯示的視圖蹄咖,顯示灰色。

飽和度是指色彩的鮮艷程度付鹿,也稱(chēng)色彩的純度澜汤。飽和度取決于該色中含色成分和消色成分(灰色)的比例蚜迅。含色成分越大,飽和度越大俊抵;消色成分越大谁不,飽和度越小。

但很可惜徽诲,這個(gè)方法在iOS12以下的系統(tǒng)刹帕,不起作用。即使是iOS12以上的系統(tǒng)也有部分會(huì)顯示直接的純灰色畫(huà)面
比如在我的12.5的系統(tǒng)的iPhone6上谎替,直接顯示灰色畫(huà)面:

IMG_0334.PNG
[圖片上傳中...(IMG_0334.PNG-5505ab-1656228410216-0)]

因此如果項(xiàng)目只需要適配iOS13以上的系統(tǒng)偷溺,該方法還是可行的,不然就需要做版本兼容院喜。

二.方案二

可以通過(guò)CAFilter這個(gè)私有類(lèi)亡蓉,設(shè)置一個(gè)濾鏡,先將要顯示的視圖轉(zhuǎn)為會(huì)單色調(diào)(即黑白色),然后再將整個(gè)視圖的背景顏色設(shè)置為灰色喷舀,來(lái)達(dá)到這樣的置位灰色效果砍濒。

// 灰度濾鏡
+ (NSArray *)greyFilterArray {
    //獲取RGBA顏色數(shù)值
    CGFloat r,g,b,a;
    [[UIColor lightGrayColor] getRed:&r green:&g blue:&b alpha:&a];
    //創(chuàng)建濾鏡
    id cls = NSClassFromString(@"CAFilter");
    id filter = [cls filterWithName:@"colorMonochrome"];
    //設(shè)置濾鏡參數(shù)
    [filter setValue:@[@(r),@(g),@(b),@(a)] forKey:@"inputColor"];
    [filter setValue:@(0) forKey:@"inputBias"];
    [filter setValue:@(1) forKey:@"inputAmount"];
    return [NSArray arrayWithObject:filter];
}

展示效果:

filter_grey_view.gif

該方法優(yōu)點(diǎn)是不受系統(tǒng)限制,但缺點(diǎn)就是展示效果不像第一種通過(guò)飽和度來(lái)調(diào)整的自然硫麻,感覺(jué)像真的蓋了一層灰色的蒙層到App上爸邢,而且因?yàn)槭褂玫乃接妙?lèi)CAFilter,具有風(fēng)險(xiǎn)性拿愧。

三. 方案三

  • 一開(kāi)始考慮能否參考安卓的思路杠河,遞歸去遍歷視圖及其相關(guān)子視圖,然后判斷視圖的類(lèi)型浇辜,對(duì)其進(jìn)行圖片券敌、顏色等進(jìn)行處理,但這里有個(gè)問(wèn)題就是如何確定遍歷的時(shí)機(jī)柳洋,一開(kāi)始是hookUIView相關(guān)的addSubview:等方法待诅,然后在添加子視圖的時(shí)候,去遍歷處理所有子視圖熊镣。
  • 但是比如說(shuō)UIImageView,添加到父視圖的時(shí)候卑雁,并沒(méi)有顯示圖片,只有網(wǎng)絡(luò)下載成功之后才設(shè)置圖片绪囱,因此你必須監(jiān)聽(tīng)UIImageView設(shè)置圖片的方法测蹲,同樣對(duì)應(yīng)UILabel等控件也是一樣,所以在添加子視圖的時(shí)候鬼吵,去遍歷處理所有子視圖明顯達(dá)不到要求扣甲。
  • 因此這里采取了hook的相關(guān)操作,對(duì)UIColor齿椅、UIImage文捶、UIImageView荷逞、WKWebView等進(jìn)行hook,然后再進(jìn)行處理粹排。

1. UIImage處理

  • A. 取出圖片像素的顏色值种远,對(duì)每一個(gè)顏色值依據(jù)灰度算法計(jì)算出原來(lái)色值的的灰度值,然后重新生成灰色的圖片顽耳。
// 轉(zhuǎn)化灰度圖片
- (UIImage *)fjf_convertToGrayImage {
    return [self fjf_convertToGrayImageWithRedRate:0.3 blueRate:0.59 greenRate:0.11];
}

// 轉(zhuǎn)化灰度圖片
- (UIImage *)fjf_convertToGrayImageWithRedRate:(CGFloat)redRate
                                     blueRate:(CGFloat)blueRate
                                    greenRate:(CGFloat)greenRate {
    const int RED = 1;
    const int GREEN = 2;
    const int BLUE = 3;
    
    // Create image rectangle with current image width/height
    CGRect imageRect = CGRectMake(0,0, self.size.width* self.scale, self.size.height* self.scale);
    
    int width = imageRect.size.width;
    int height = imageRect.size.height;
    
    // the pixels will be painted to this array
    uint32_t *pixels = (uint32_t*) malloc(width * height *sizeof(uint32_t));
    
    // clear the pixels so any transparency is preserved
    memset(pixels,0, width * height *sizeof(uint32_t));
    
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    
    // create a context with RGBA pixels
    CGContextRef context = CGBitmapContextCreate(pixels, width, height,8, width *sizeof(uint32_t), colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedLast);
    
    // paint the bitmap to our context which will fill in the pixels array
    CGContextDrawImage(context,CGRectMake(0,0, width, height), [self CGImage]);
    
    for(int y = 0; y < height; y++) {
        for(int x = 0; x < width; x++) {
            uint8_t *rgbaPixel = (uint8_t*) &pixels[y * width + x];
            
            // convert to grayscale using recommended method: http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale
            uint32_t gray = redRate * rgbaPixel[RED] + greenRate * rgbaPixel[GREEN] + blueRate * rgbaPixel[BLUE];
            
            // set the pixels to gray
            rgbaPixel[RED] = gray;
            rgbaPixel[GREEN] = gray;
            rgbaPixel[BLUE] = gray;
        }
    }
    
    // create a new CGImageRef from our context with the modified pixels
    CGImageRef imageRef = CGBitmapContextCreateImage(context);
    
    // we're done with the context, color space, and pixels
    CGContextRelease(context);
    CGColorSpaceRelease(colorSpace);
    free(pixels);
    
    // make a new UIImage to return
    UIImage *resultUIImage = [UIImage imageWithCGImage:imageRef scale:self.scale orientation:UIImageOrientationUp];
    
    // we're done with image now too
    CGImageRelease(imageRef);
    
    return resultUIImage;
}

  • 對(duì)UIImage相對(duì)應(yīng)的初始化方法進(jìn)行hook坠敷,因?yàn)轫?xiàng)目里面使用混編,所以有用到UIImage的類(lèi)方法進(jìn)行初始化射富,也有用到實(shí)例方法進(jìn)行初始化膝迎。

+ (void)fjf_startGreyStyle {
    //交換方法
    NSError *error = NULL;
    [UIImage fjf_swizzleMethod:@selector(initWithData:)
                   withMethod:@selector(fjf_initWithData:)
                          error:&error];

    [UIImage fjf_swizzleMethod:@selector(initWithData:scale:)
                   withMethod:@selector(fjf_initWithData:scale:)
                          error:&error];
    
    [UIImage fjf_swizzleMethod:@selector(initWithContentsOfFile:)
                   withMethod:@selector(fjf_initWithContentsOfFile:)
                          error:&error];
    
    [UIImage fjf_swizzleClassMethod:@selector(imageNamed:)
                   withClassMethod:@selector(fjf_imageNamed:)
                             error:&error];

    [UIImage fjf_swizzleClassMethod:@selector(imageNamed:inBundle:compatibleWithTraitCollection:)
                   withClassMethod:@selector(fjf_imageNamed:inBundle:compatibleWithTraitCollection:)
                             error:&error];
}

這里實(shí)例初始化方法,有一點(diǎn)需要注意胰耗,最后返回的時(shí)候必須調(diào)用實(shí)例對(duì)象的實(shí)例方法來(lái)返回一個(gè)UIImage對(duì)象限次。

+ (UIImage *)fjf_imageNamed:(NSString *)name {
    UIImage *image = [self fjf_imageNamed:name];
    return [UIImage fjf_converToGrayImageWithImage:image];
}

+ (nullable UIImage *)fjf_imageNamed:(NSString *)name inBundle:(nullable NSBundle *)bundle compatibleWithTraitCollection:(nullable UITraitCollection *)traitCollection {
    UIImage *image = [self fjf_imageNamed:name inBundle:bundle compatibleWithTraitCollection:traitCollection];
    return [UIImage fjf_converToGrayImageWithImage:image];
}

- (instancetype)fjf_initWithContentsOfFile:(NSString *)path {
    UIImage *greyImage = [[UIImage alloc] fjf_initWithContentsOfFile:path];
   greyImage = [UIImage fjf_converToGrayImageWithImage:greyImage];
    return [self initWithCGImage:greyImage.CGImage];
}

- (UIImage *)fjf_initWithData:(NSData *)data {
    UIImage *greyImage = [[UIImage alloc] fjf_initWithData:data];
    greyImage = [UIImage fjf_converToGrayImageWithImage:greyImage];
    return [self initWithCGImage:greyImage.CGImage];
}

- (UIImage *)fjf_initWithData:(NSData *)data scale:(CGFloat)scale {
    UIImage *greyImage = [[UIImage alloc] fjf_initWithData:data scale:scale];
    greyImage = [UIImage fjf_converToGrayImageWithImage:greyImage];
    return [self initWithCGImage:greyImage.CGImage];
}

2.UIImageView

UIImageView通過(guò)hook圖片的設(shè)置方法setImageinitWithCoder來(lái)對(duì)圖片進(jìn)行處理。

這里需要注意的就是對(duì)拉伸的圖片柴灯,動(dòng)效圖卖漫,還有xib上圖片的處理。

  • A. 如果設(shè)置的圖片是動(dòng)效圖赠群,比如gif圖羊始,可以通過(guò)SDImageCoderHelperframesFromAnimatedImage函數(shù)將gif解析獲取對(duì)應(yīng)的圖片數(shù)組,然后對(duì)圖片數(shù)組里面的每一張圖進(jìn)行灰度化查描,直到圖片數(shù)組所有圖片都灰度化完成突委,再將灰度的圖片數(shù)組合成動(dòng)效圖。

  • B. 如果是拉伸的圖片冬三,比如聊天消息的背景圖匀油,因?yàn)樵?code>UIImage的相關(guān)初始化方法中已經(jīng)處理過(guò),變成灰色的圖片勾笆,所以在UIImageViewsetImage方法里面不需要再對(duì)圖片進(jìn)行灰色處理敌蚜,否則就會(huì)失去拉伸的效果,這里可以通過(guò)判斷圖片是否為_UIResizableImage來(lái)判斷是否為拉伸圖片。

  • C.如果是普通圖片則進(jìn)行普通的灰度處理匠襟。

// 轉(zhuǎn)換為灰度圖標(biāo)
- (void)fjf_convertToGrayImageWithImage:(UIImage *)image {
    NSArray<SDImageFrame *> *animatedImageFrameArray = [SDImageCoderHelper framesFromAnimatedImage:image];
    if (animatedImageFrameArray.count > 1) {
        NSMutableArray<SDImageFrame *> *tmpThumbImageFrameMarray = [NSMutableArray array];
        [animatedImageFrameArray enumerateObjectsUsingBlock:^(SDImageFrame * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            UIImage *targetImage = [obj.image fjf_convertToGrayImage];
            SDImageFrame *thumbFrame = [SDImageFrame frameWithImage:targetImage duration:obj.duration];
            [tmpThumbImageFrameMarray addObject:thumbFrame];
        }];
        UIImage *greyAnimatedImage = [SDImageCoderHelper animatedImageWithFrames:tmpThumbImageFrameMarray];
        [self fjf_setImage:greyAnimatedImage];
    } else if([image isKindOfClass:NSClassFromString(@"_UIResizableImage")]){
        [self fjf_setImage:image];
    } else {
        UIImage *im = [image fjf_convertToGrayImage];
        [self fjf_setImage:im];
    }
}
  • D.如果是放在Xib上的圖片钝侠,因?yàn)?code>Xib經(jīng)過(guò)編譯會(huì)變成Nib该园,Nib存儲(chǔ)了Xib里面的各種信息的二進(jìn)制文件酸舍,Xcode上的Xib文件可以直接顯示圖片,是因?yàn)?code>Xcode支持訪問(wèn)項(xiàng)目中圖像和資源里初,所以是通過(guò)Xcode去讀取和顯示的啃勉,而實(shí)際App,是在調(diào)用[UINib nibWithNibName等方法的時(shí)候双妨,將Nib的數(shù)據(jù)以及關(guān)聯(lián)的資源讀取到內(nèi)存中,而Nib去相關(guān)聯(lián)的圖片資源的時(shí)候淮阐,走的是更底層的系統(tǒng)方法叮阅,而不是UIImage相關(guān)的圖片初始化方法,因此對(duì)于Xib上的圖片的灰度處理泣特,需要放在UIImageViewinitWithCoder方法上浩姥。
- (nullable instancetype)fjf_initWithCoder:(NSCoder *)coder {
   UIImageView *tmpImgageView = [self fjf_initWithCoder:coder];
    [self fjf_convertToGrayImageWithImage:tmpImgageView.image];
    return tmpImgageView;
}

3. UIColor

UIColor主要通過(guò)hook相關(guān)的顏色初始化方法,然后依據(jù)顏色的RGB值去算出對(duì)應(yīng)的灰度值状您,來(lái)顯示勒叠。

// 開(kāi)啟 黑白色
+ (void)fjf_startGreyStyle {
    NSError *error = NULL;

    [UIColor fjf_swizzleClassMethod:@selector(redColor)
                   withClassMethod:@selector(fjf_redColor)
                          error:&error];
    
    [UIColor fjf_swizzleClassMethod:@selector(greenColor)
                   withClassMethod:@selector(fjf_greenColor)
                             error:&error];
    
    [UIColor fjf_swizzleClassMethod:@selector(blueColor)
                   withClassMethod:@selector(fjf_blueColor)
                          error:&error];
    
    [UIColor fjf_swizzleClassMethod:@selector(cyanColor)
                   withClassMethod:@selector(fjf_cyanColor)
                          error:&error];
    
    [UIColor fjf_swizzleClassMethod:@selector(yellowColor)
                   withClassMethod:@selector(fjf_yellowColor)
                          error:&error];
    
    [UIColor fjf_swizzleClassMethod:@selector(magentaColor)
                   withClassMethod:@selector(fjf_magentaColor)
                          error:&error];
    
    [UIColor fjf_swizzleClassMethod:@selector(orangeColor)
                   withClassMethod:@selector(fjf_orangeColor)
                          error:&error];
    
    [UIColor fjf_swizzleClassMethod:@selector(purpleColor)
                   withClassMethod:@selector(fjf_purpleColor)
                          error:&error];
    
    [UIColor fjf_swizzleClassMethod:@selector(brownColor)
                   withClassMethod:@selector(fjf_brownColor)
                          error:&error];
    
    [UIColor fjf_swizzleClassMethod:@selector(systemBlueColor)
                   withClassMethod:@selector(fjf_systemBlueColor)
                          error:&error];
    
    [UIColor fjf_swizzleClassMethod:@selector(systemGreenColor)
                   withClassMethod:@selector(fjf_systemGreenColor)
                          error:&error];
    
    [UIColor fjf_swizzleClassMethod:@selector(colorWithRed:green:blue:alpha:)
                   withClassMethod:@selector(fjf_colorWithRed:green:blue:alpha:)
                          error:&error];

    [UIColor fjf_swizzleMethod:@selector(initWithRed:green:blue:alpha:)
                   withMethod:@selector(fjf_initWithRed:green:blue:alpha:)
                          error:&error];
}

4. WKWebView

WKWebView是通過(guò)hook初始化的initWithFrame:configuration:方法,進(jìn)行js腳本注入來(lái)實(shí)現(xiàn)灰色化.

- (instancetype)fjf_initWithFrame:(CGRect)frame configuration:(WKWebViewConfiguration *)configuration {
    // js腳本
    NSString *jScript = @"var filter = '-webkit-filter:grayscale(100%);-moz-filter:grayscale(100%); -ms-filter:grayscale(100%); -o-filter:grayscale(100%) filter:grayscale(100%);';document.getElementsByTagName('html')[0].style.filter = 'grayscale(100%)';";
    // 注入
    WKUserScript *wkUScript = [[WKUserScript alloc] initWithSource:jScript injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
                 
    WKUserContentController *wkUController = [[WKUserContentController alloc] init];
       [wkUController addUserScript:wkUScript];
    // 配置對(duì)象
    WKWebViewConfiguration *wkWebConfig = [[WKWebViewConfiguration alloc] init];
    wkWebConfig.userContentController = wkUController;
    configuration = wkWebConfig;
    WKWebView *webView = [self fjf_initWithFrame:frame configuration:configuration];
    return webView;
}

5. CAShapeLayer

CAShapeLayer主要是通過(guò)hooksetFillColor:setStrokeColor兩個(gè)方法來(lái)解決lottie動(dòng)畫(huà)相關(guān)的灰色膏孟。

+ (void)fjf_startGreyStyle {
    NSError *error = NULL;
    
    [CAShapeLayer fjf_swizzleMethod:@selector(setFillColor:)
                        withMethod:@selector(fjf_setFillColor:)
                             error:&error];
    [CAShapeLayer fjf_swizzleMethod:@selector(setStrokeColor:)
                        withMethod:@selector(fjf_setStrokeColor:)
                             error:&error];
}

- (void)fjf_setStrokeColor:(CGColorRef)color {
    UIColor *greyColor = [UIColor fjf_generateGrayColorWithOriginalColor:[UIColor colorWithCGColor:color]];
    [self fjf_setStrokeColor:greyColor.CGColor];
}

- (void)fjf_setFillColor:(CGColorRef)color {
    UIColor *greyColor = [UIColor fjf_generateGrayColorWithOriginalColor:[UIColor colorWithCGColor:color]];
    [self fjf_setFillColor:greyColor.CGColor];
}

6. NSData

之所以會(huì)用到NSData是因?yàn)轫?xiàng)目里面地圖需要保持原來(lái)的顏色眯分,而地圖相關(guān)的圖片加載是通過(guò)UIImageinitWithData方法,因此無(wú)法判斷圖片的來(lái)源是否為地圖的圖片柒桑,所以通過(guò)hookNSDatainitWithContentsOfURLinitWithContentsOfFile方法來(lái)依據(jù)加載路徑弊决,來(lái)對(duì)地圖相關(guān)的圖片設(shè)置標(biāo)志位fjf_isMapImageData是否為地圖圖片,如果是地圖圖片魁淳,在UIImageinitWithData取出該標(biāo)志位飘诗,判斷如果NSData是地圖圖片數(shù)據(jù),就保持原來(lái)顏色先改。

這里是自身項(xiàng)目需要所以單獨(dú)處理疚察。

7. UIViewController

因?yàn)楹诎咨梢灾婚_(kāi)啟在首頁(yè),其他界面要保持原來(lái)的顏色仇奶,所以需要首頁(yè)跳轉(zhuǎn)到其他頁(yè)面的時(shí)候需要做判斷貌嫡,來(lái)保證只有首頁(yè)會(huì)被置為灰色。

  • 這里對(duì)UIViewControllerinit该溯、viewWillAppear:進(jìn)行hook岛抄,在init方法中對(duì)當(dāng)前UIViewController類(lèi)型行判斷,如果是首頁(yè)的VC就置位灰色狈茉,如果是其他VC就保持原來(lái)邏輯夫椭。
  • 之所以是在UIViewControllerinit方法判斷,是因?yàn)橛行?code>vc會(huì)先出初始化一些子視圖氯庆,然后再調(diào)用UIViewControllerviewDidLoad,只有在init方法蹭秋,才能保證當(dāng)前vc上的所有子視圖都能保持原來(lái)顏色。
  • 然后再UIViewControllerviewWillAppear:方法判斷是否回到首頁(yè)堤撵,如果回到首頁(yè)仁讨,就遞歸遍歷首頁(yè)的View,對(duì)其進(jìn)行圖片实昨、顏色等進(jìn)行置灰處理洞豁,這樣做是為了避免,當(dāng)切到其他頁(yè)面的時(shí)候,首頁(yè)收到通知或者其他推送丈挟,更新了視圖刁卜,使得更新的視圖也能保持灰色。

四. 總結(jié)

Demo:https://github.com/fangjinfeng/MySampleCode

以上幾種方法各有優(yōu)劣曙咽,可以針對(duì)各自的需求進(jìn)行選擇蛔趴。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市例朱,隨后出現(xiàn)的幾起案子夺脾,更是在濱河造成了極大的恐慌,老刑警劉巖茉继,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咧叭,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡烁竭,警方通過(guò)查閱死者的電腦和手機(jī)菲茬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)派撕,“玉大人婉弹,你說(shuō)我怎么就攤上這事≈蘸穑” “怎么了镀赌?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)际跪。 經(jīng)常有香客問(wèn)我商佛,道長(zhǎng),這世上最難降的妖魔是什么姆打? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任良姆,我火速辦了婚禮,結(jié)果婚禮上幔戏,老公的妹妹穿的比我還像新娘玛追。我一直安慰自己,他們只是感情好闲延,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布痊剖。 她就那樣靜靜地躺著,像睡著了一般垒玲。 火紅的嫁衣襯著肌膚如雪陆馁。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天侍匙,我揣著相機(jī)與錄音氮惯,去河邊找鬼。 笑死想暗,一個(gè)胖子當(dāng)著我的面吹牛妇汗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播说莫,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼杨箭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了储狭?” 一聲冷哼從身側(cè)響起互婿,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎辽狈,沒(méi)想到半個(gè)月后慈参,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡刮萌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年驮配,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片着茸。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡壮锻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出涮阔,到底是詐尸還是另有隱情猜绣,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布敬特,位于F島的核電站掰邢,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏伟阔。R本人自食惡果不足惜尸变,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望减俏。 院中可真熱鬧召烂,春花似錦、人聲如沸娃承。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)历筝。三九已至酗昼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間梳猪,已是汗流浹背麻削。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工蒸痹, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人呛哟。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓叠荠,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親扫责。 傳聞我的和親對(duì)象是個(gè)殘疾皇子榛鼎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容