iOS之图片截取

在项目中有的时候需要用截取图片的功能,有的时候还需要将特定的视图进行截取,所以就写了这个demo。
1.从相册中进行选择一张图片,然后将这张图片进行裁剪,然后将图片展示。这有点类似于上传头像时首先要编辑图片的流程。
2.在图片进行编辑的时候,将截取的图片的视图进行处理。

一、选择图片

点击进入到相册中,选择图片。

- (void)selectedImageAction:(UIButton *)btn {
   UIImagePickerController *picker = [[UIImagePickerController alloc] init];
   picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
   picker.delegate = self;
   [self presentViewController:picker animated:YES completion:nil];
}

#pragma mark - UIImagePickerControllerDelegate
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {
   [picker dismissViewControllerAnimated:YES completion:nil];
   UIImage *image = info[UIImagePickerControllerOriginalImage];
   WJEditPhotoVC *editPhotoVC = [[WJEditPhotoVC alloc] init];
   editPhotoVC.selectedImage = image;
   // block回调将编辑好的图片展示到UIImageView上去。
   __weak typeof(self) weakSelf = self;
   editPhotoVC.block = ^(UIImage *image) {
       weakSelf.imageView.image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
       weakSelf.imageView.contentMode = UIViewContentModeScaleAspectFill;
   };
   [self presentViewController:editPhotoVC animated:YES completion:nil];
}

二、展示编辑图片

思路:
截取图片,底层放一个底层的UIImageView(backgroundImageView),然后再在上面放置一层蒙层(coveredView)。作用就是单纯的展示这个图片。然后在蒙层上再放置一个UIImageView,他的作用就是被截取,然后回调回之前的页面进行展示的图片。需要处理的页面也是这个最后一个UIImagView(editImageView)。

Simulator Screen Shot - iPhone 8 - 2017-11-28 at 22.37.59.png

UI界面的搭建


- (void)setUpUI {
    
    UIImageView *backgroundImageView = [[UIImageView alloc] initWithFrame:self.view.frame];
    backgroundImageView.image = self.selectedImage;
    backgroundImageView.userInteractionEnabled = YES;
    [backgroundImageView setContentScaleFactor:[[UIScreen mainScreen] scale]];
    backgroundImageView.contentMode =  UIViewContentModeScaleAspectFit;
    backgroundImageView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    backgroundImageView.clipsToBounds = YES;
    [self.view addSubview:backgroundImageView];
    UIView *coveredView = [[UIView alloc] initWithFrame:self.view.frame];
    coveredView.userInteractionEnabled = YES;
    coveredView.backgroundColor = [UIColor blackColor];
    coveredView.alpha = 0.6;
    [backgroundImageView addSubview:coveredView];

    // 剪切的imageView
    UIImageView *editImageView = [[UIImageView alloc] initWithFrame:self.view.frame];
    editImageView.image = self.selectedImage;
    [coveredView addSubview:editImageView];
    editImageView.userInteractionEnabled = YES;
    [editImageView setContentScaleFactor:[[UIScreen mainScreen] scale]];
    editImageView.contentMode =  UIViewContentModeScaleAspectFit;
    editImageView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    editImageView.clipsToBounds = YES;
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panInPicture:)];
    [editImageView addGestureRecognizer:pan];
    self.editImageView = editImageView;
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    [button setTitle:@"重置" forState:UIControlStateNormal];
    button.frame = CGRectMake(50, 50, 50, 30);
    [button addTarget:self action:@selector(cancelAction:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];
    [self.view bringSubviewToFront:button];
    UIButton *sureButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [sureButton setTitle:@"确定" forState:UIControlStateNormal];
    sureButton.frame = CGRectMake(300, 50, 50, 30);
    [sureButton addTarget:self action:@selector(sureAction:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:sureButton];
    [self.view bringSubviewToFront:sureButton];
    
    UIButton *reSelectImageButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [reSelectImageButton setTitle:@"重选" forState:UIControlStateNormal];
    reSelectImageButton.frame = CGRectMake(175, 50, 50, 30);
    [reSelectImageButton addTarget:self action:@selector(reSelectedImageAction:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:reSelectImageButton];
    [self.view bringSubviewToFront:reSelectImageButton];
    
    // 图片左下角的展示截取图片的视图
    UIImageView *lookOutImageView = [[UIImageView alloc] initWithFrame:CGRectMake(300, 600, 50, 50)];
//    lookOutImageView.contentMode = UIViewContentModeScaleAspectFit;
    lookOutImageView.backgroundColor = [UIColor cyanColor];
    [lookOutImageView setContentScaleFactor:[[UIScreen mainScreen] scale]];
    lookOutImageView.contentMode =  UIViewContentModeScaleAspectFill;
    lookOutImageView.autoresizingMask = UIViewAutoresizingFlexibleHeight;
    lookOutImageView.clipsToBounds = YES;
    [self.view addSubview:lookOutImageView];
    [self.view bringSubviewToFront:lookOutImageView];
    self.lookOutImageView = lookOutImageView;
}

按钮的点击事件:


- (void)reSelectedImageAction:(UIButton *)btn {
    [self dismissViewControllerAnimated:YES completion:nil];
}

- (void)cancelAction:(UIButton *)btn {
    self.editImageView.frame = self.view.frame;
    self.editImageView.image = self.selectedImage;
}

- (void)sureAction:(UIButton *)btn {
    self.block(self.neweditImage);
    [self dismissViewControllerAnimated:YES completion:nil];
}

在图片被截取后,editImageView的尺寸大小实际上是发生变化了的。所以在重置按钮的点击后,editImageView的frame需要和self.view的大小一致,图片也是需要进行使用之前的图片。同理在截取后,重新截取的时候,也是需要进行以上的操作。

要使用截取操作,就是需要用到手势了,所以在editImageView上添加了UIPanGestureRecognizer手势,要想手势起作用,就需要父视图的交互是可以用的。


// 在storyBoard中拖入的一个手势
- (void)panInPicture:(UIPanGestureRecognizer *)pan {
    
    CGPoint currentPoint = [pan locationInView:self.view];
    // 1判断手势状态
    if (pan.state == UIGestureRecognizerStateBegan) {
        // 获取当前点
        self.startPoint = currentPoint;
    } else if (pan.state == UIGestureRecognizerStateChanged) {
        // 移除遮盖
        [self.coverView removeFromSuperview];
        CGFloat x = self.startPoint.x;
        CGFloat y = self.startPoint.y;
        CGFloat width = currentPoint.x - self.startPoint.x;
        CGFloat height = currentPoint.y - self.startPoint.y;
        // 主要是避免从左下想右上方向上的截取造成的rect值无实际意义。
        if (width < 0) {
            width = -width;
            x = x - width;
        }
        if (height < 0) {
            height = -height;
            y = y - height;
        }
        CGRect rect = CGRectMake(x, y, width, height);
        // 添加一个view
        self.coverView.frame = rect;
        [self.editImageView addSubview:_coverView]; // 解决下次进行裁剪的时候没有coverview的覆盖
        self.coverRect = rect;
    } else if (pan.state == UIGestureRecognizerStateEnded) {
        NSLog(@"coverView:%@ - coverRect:%@",NSStringFromCGRect(self.coverView.frame), NSStringFromCGRect(self.coverRect));
        [self.coverView removeFromSuperview];
        UIImageView *resultImageView = self.editImageView;
        UIImage *resultImage = [self editImageFromView:resultImageView];
        // 超过遮盖以外的内容裁剪掉
        UIGraphicsBeginImageContextWithOptions(self.editImageView.bounds.size, NO, [UIScreen mainScreen].scale);
        // 设置一个裁剪区域
        UIBezierPath *clipPath = [UIBezierPath bezierPathWithRect:self.coverView.frame];
        [clipPath addClip];
        // 移除遮盖
        // 进行渲染
        CGContextRef ctx = UIGraphicsGetCurrentContext();
        [self.editImageView.layer renderInContext:ctx];
        // 生成一张图片
        UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        self.editImageView.image = newImage;
        NSLog(@"coverView:%@ - coverRect:%@",NSStringFromCGRect(self.coverView.frame), NSStringFromCGRect(self.coverRect));
        
        self.neweditImage = resultImage;
        self.lookOutImageView.image = resultImage;
        
    }
}

完成了截取图片的展示,还差一步就是展示需要使用的图片。也就是说截取的视图并不是我们需要的,因为图片大小和位置都是有偏差的,展示在视图上是有误差的,所以我们要进行处理,这部分的内容。

- (UIImage *)editImageFromView:(UIView *)theView {
    //截取全屏
    UIGraphicsBeginImageContext(theView.bounds.size);
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    //截取所需区域
    CGRect captureRect = self.coverRect;
    CGImageRef sourceImageRef = [image CGImage];
    CGImageRef newImageRef = CGImageCreateWithImageInRect(sourceImageRef, captureRect);
    UIImage *newImage = [UIImage imageWithCGImage:newImageRef];
    return newImage;
}

附相关的完整代码:

WJSelectedImageVC.h


#import <UIKit/UIKit.h>

@interface WJSelectedImageVC : UIViewController


@end

WJSelectedImageVC.m


//  修改截取从相册中选取的图片或者是摄像头拍摄的图片

#import "WJSelectedImageVC.h"
#import "WJEditPhotoVC.h"

@interface WJSelectedImageVC () <UIImagePickerControllerDelegate, UINavigationControllerDelegate>

@property (nonatomic, strong) UIImageView *imageView;

@end

@implementation WJSelectedImageVC

- (void)viewDidLoad {
    [super viewDidLoad];
    [self setUpUI];
}


- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    self.imageView.image = nil;
}


- (void)setUpUI {
    self.title = @"截取图片";
    self.view.backgroundColor = [UIColor whiteColor];
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(50, 100, 100, 100)];
    imageView.backgroundColor = [UIColor cyanColor];
    [imageView setContentScaleFactor:[[UIScreen mainScreen] scale]];
    imageView.contentMode =  UIViewContentModeScaleAspectFill;
    imageView.autoresizingMask = UIViewAutoresizingFlexibleHeight;
    imageView.clipsToBounds = YES;
    [self.view addSubview:imageView];
    self.imageView = imageView;
    
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    [button setTitle:@"选择图片" forState:UIControlStateNormal];
    button.frame = CGRectMake(80, 300, 80, 30);
    [button setBackgroundColor:[UIColor orangeColor]];
    [button addTarget:self action:@selector(selectedImageAction:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];
}

- (void)selectedImageAction:(UIButton *)btn {
    UIImagePickerController *picker = [[UIImagePickerController alloc] init];
    picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    picker.delegate = self;
    [self presentViewController:picker animated:YES completion:nil];
}

#pragma mark - UIImagePickerControllerDelegate
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {
    [picker dismissViewControllerAnimated:YES completion:nil];
    UIImage *image = info[UIImagePickerControllerOriginalImage];
    WJEditPhotoVC *editPhotoVC = [[WJEditPhotoVC alloc] init];
    editPhotoVC.selectedImage = image;
    __weak typeof(self) weakSelf = self;
    editPhotoVC.block = ^(UIImage *image) {
        weakSelf.imageView.image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
        weakSelf.imageView.contentMode = UIViewContentModeScaleAspectFill;
    };
    [self presentViewController:editPhotoVC animated:YES completion:nil];
}


@end

WJEditPhotoVC.h


#import <UIKit/UIKit.h>

typedef void(^WJEditPhotoBlock)(UIImage *image);

@interface WJEditPhotoVC : UIViewController

@property (nonatomic, strong) UIImage *selectedImage;

@property (nonatomic, strong) WJEditPhotoBlock block;

@end

WJEditPhotoVC.m

//  编辑图片

#import "WJEditPhotoVC.h"

@interface WJEditPhotoVC ()

// 开始手指的点
/* startPoint*/
@property (nonatomic, assign) CGPoint startPoint;

@property (nonatomic, strong) UIImageView *editImageView;

/** coverView*/
@property (nonatomic, strong) UIView *coverView;

@property (nonatomic, strong) UIImage *neweditImage;

@property (nonatomic, strong) UIImageView *lookOutImageView;

@property (nonatomic, assign) CGRect coverRect;

@end

@implementation WJEditPhotoVC

- (void)viewDidLoad {
    [super viewDidLoad];
    [self setUpUI];
}

- (void)setUpUI {
    
    UIImageView *backgroundImageView = [[UIImageView alloc] initWithFrame:self.view.frame];
    backgroundImageView.image = self.selectedImage;
    backgroundImageView.userInteractionEnabled = YES;
    [backgroundImageView setContentScaleFactor:[[UIScreen mainScreen] scale]];
    backgroundImageView.contentMode =  UIViewContentModeScaleAspectFit;
    backgroundImageView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    backgroundImageView.clipsToBounds = YES;
    [self.view addSubview:backgroundImageView];
    UIView *coveredView = [[UIView alloc] initWithFrame:self.view.frame];
    coveredView.userInteractionEnabled = YES;
    coveredView.backgroundColor = [UIColor blackColor];
    coveredView.alpha = 0.6;
    [backgroundImageView addSubview:coveredView];

    // 剪切的imageView
    UIImageView *editImageView = [[UIImageView alloc] initWithFrame:self.view.frame];
    editImageView.image = self.selectedImage;
    [coveredView addSubview:editImageView];
    editImageView.userInteractionEnabled = YES;
    [editImageView setContentScaleFactor:[[UIScreen mainScreen] scale]];
    editImageView.contentMode =  UIViewContentModeScaleAspectFit;
    editImageView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    editImageView.clipsToBounds = YES;
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panInPicture:)];
    [editImageView addGestureRecognizer:pan];
    self.editImageView = editImageView;
   
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    [button setTitle:@"重置" forState:UIControlStateNormal];
    button.frame = CGRectMake(50, 50, 50, 30);
    [button addTarget:self action:@selector(cancelAction:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];
    [self.view bringSubviewToFront:button];
    UIButton *sureButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [sureButton setTitle:@"确定" forState:UIControlStateNormal];
    sureButton.frame = CGRectMake(300, 50, 50, 30);
    [sureButton addTarget:self action:@selector(sureAction:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:sureButton];
    [self.view bringSubviewToFront:sureButton];
    
    UIButton *reSelectImageButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [reSelectImageButton setTitle:@"重选" forState:UIControlStateNormal];
    reSelectImageButton.frame = CGRectMake(175, 50, 50, 30);
    [reSelectImageButton addTarget:self action:@selector(reSelectedImageAction:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:reSelectImageButton];
    [self.view bringSubviewToFront:reSelectImageButton];
    
    
    UIImageView *lookOutImageView = [[UIImageView alloc] initWithFrame:CGRectMake(300, 600, 50, 50)];
//    lookOutImageView.contentMode = UIViewContentModeScaleAspectFit;
    lookOutImageView.backgroundColor = [UIColor cyanColor];
    [lookOutImageView setContentScaleFactor:[[UIScreen mainScreen] scale]];
    lookOutImageView.contentMode =  UIViewContentModeScaleAspectFill;
    lookOutImageView.autoresizingMask = UIViewAutoresizingFlexibleHeight;
    lookOutImageView.clipsToBounds = YES;
    [self.view addSubview:lookOutImageView];
    [self.view bringSubviewToFront:lookOutImageView];
    self.lookOutImageView = lookOutImageView;
}


- (UIView *)coverView {
    if (!_coverView) {
        _coverView = [[UIView alloc] init];
        _coverView.backgroundColor = [UIColor darkGrayColor];
        _coverView.alpha = 0.6;
    }
    return _coverView;
}


- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    self.editImageView.frame = self.view.frame;
    self.editImageView.image = self.selectedImage;
}


// 在storyBoard中拖入的一个手势
- (void)panInPicture:(UIPanGestureRecognizer *)pan {
    
    CGPoint currentPoint = [pan locationInView:self.view];
    // 1判断手势状态
    if (pan.state == UIGestureRecognizerStateBegan) {
        // 获取当前点
        self.startPoint = currentPoint;
    } else if (pan.state == UIGestureRecognizerStateChanged) {
        // 移除遮盖
        [self.coverView removeFromSuperview];
        CGFloat x = self.startPoint.x;
        CGFloat y = self.startPoint.y;
        CGFloat width = currentPoint.x - self.startPoint.x;
        CGFloat height = currentPoint.y - self.startPoint.y;
        if (width < 0) {
            width = -width;
            x = x - width;
        }
        if (height < 0) {
            height = -height;
            y = y - height;
        }
        CGRect rect = CGRectMake(x, y, width, height);
        // 添加一个view
        self.coverView.frame = rect;
        [self.editImageView addSubview:_coverView]; // 解决下次进行裁剪的时候没有coverview的覆盖
        self.coverRect = rect;
    } else if (pan.state == UIGestureRecognizerStateEnded) {
        NSLog(@"coverView:%@ - coverRect:%@",NSStringFromCGRect(self.coverView.frame), NSStringFromCGRect(self.coverRect));
        [self.coverView removeFromSuperview];
        UIImageView *resultImageView = self.editImageView;
        UIImage *resultImage = [self editImageFromView:resultImageView];
        // 超过遮盖以外的内容裁剪掉
        UIGraphicsBeginImageContextWithOptions(self.editImageView.bounds.size, NO, [UIScreen mainScreen].scale);
        // 设置一个裁剪区域
        UIBezierPath *clipPath = [UIBezierPath bezierPathWithRect:self.coverView.frame];
        [clipPath addClip];
        // 移除遮盖
        // 进行渲染
        CGContextRef ctx = UIGraphicsGetCurrentContext();
        [self.editImageView.layer renderInContext:ctx];
        // 生成一张图片
        UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        self.editImageView.image = newImage;
        NSLog(@"coverView:%@ - coverRect:%@",NSStringFromCGRect(self.coverView.frame), NSStringFromCGRect(self.coverRect));
        
        self.neweditImage = resultImage;
        self.lookOutImageView.image = resultImage;
        
    }
}


- (UIImage *)editImageFromView:(UIView *)theView {
    
    //截取全屏
    UIGraphicsBeginImageContext(theView.bounds.size);
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    //截取所需区域
    CGRect captureRect = self.coverRect;
    CGImageRef sourceImageRef = [image CGImage];
    CGImageRef newImageRef = CGImageCreateWithImageInRect(sourceImageRef, captureRect);
    UIImage *newImage = [UIImage imageWithCGImage:newImageRef];
    return newImage;
}


- (void)reSelectedImageAction:(UIButton *)btn {
    [self dismissViewControllerAnimated:YES completion:nil];
}

- (void)cancelAction:(UIButton *)btn {
    self.editImageView.frame = self.view.frame;
    self.editImageView.image = self.selectedImage;
}

- (void)sureAction:(UIButton *)btn {
    self.block(self.neweditImage);
    [self dismissViewControllerAnimated:YES completion:nil];
}

@end

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

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,112评论 4 61
  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一种新的协议。它实...
    香橙柚子阅读 23,887评论 8 183
  • 《你从来不曾走远》(外一首) 分手的时候, 你没有流泪, 我没有挥手, 你踏上开往北上广的列车, 我返回坐到合欢树...
    不语不问阅读 346评论 2 3
  • 我原以为 作词:徐誉滕 作曲:徐誉滕 演唱:徐誉滕 点上一根烟 看窗外孤单的路灯 照着曾经牵手走过的路 在喧闹的街...
    RainyCai阅读 685评论 0 1
  • 记录下这段文字,是在一个阳光明媚,刚刚看完《根鸟》小睡一会儿的午后。 《根鸟》,讲述的是一个男孩——根鸟——不断西...
    YangDuck_大可阅读 4,067评论 18 14