iOS中獲取系統(tǒng)相冊(cè)中的圖片

一、獲取單張圖片

1博秫、利用UIImagePickerController可以從系統(tǒng)自帶的App中獲得圖片
2潦牛、設(shè)置代理,遵守代理協(xié)議

@interface ViewController () <UIImagePickerControllerDelegate,UINavigationControllerDelegate>

3挡育、實(shí)現(xiàn)代理方法didFinishPickingMediaWithInfo

二巴碗、獲取多張圖片

思路:
1、導(dǎo)入頭文件#import <Photos/Photos.h>
2即寒、PHAsset:一個(gè)資源橡淆,比如一張圖片或者一段視頻
3、PHAssetCollection:一個(gè)相簿
4母赵、PHImageManager 圖片管理者逸爵,是單例,發(fā)送請(qǐng)求才能從asset獲取圖片
5凹嘲、PHImageRequestOptions圖片請(qǐng)求選項(xiàng)
6师倔、注意:這個(gè)類是iOS8開始推廣,iOS9開始廢棄之前的方法
系統(tǒng)適配iOS8之前周蹭,用下面的這個(gè)庫里面的API

#import <AssetsLibrary/AssetsLibrary.h>

獲取資源

照片庫中有兩種資源可供獲惹魉摇:PHAsset和PHCollection,前者代表圖像或視頻對(duì)象谷醉,后者是前者的集合或者自身類型的集合致稀。PHCollection是一個(gè)基類,有PHAssetCollection和PHCollectionList兩個(gè)子類俱尼,分別代表Photos里面的相冊(cè)和文件夾抖单。PHCollectionList里面可嵌套PHAssetCollection和自身類型,還支持多重嵌套。獲取PHAsset以及PHAssetCollection的過程類似于CoreData矛绘,如下所示耍休,只能通過類方法來返回PHFetchResult,遍歷返回結(jié)果來獲取需要的資源货矮。

Paste_Image.png
Paste_Image.png

注意羊精,PHAsset、PHAssetCollection和PHCollectionList都是輕量級(jí)的不可變對(duì)象囚玫,使用這些類時(shí)并沒有將其代表的圖像或視頻或者集合載入內(nèi)存中喧锦,要使用其代表的圖像或視頻,需要通過PHImageManager類來請(qǐng)求抓督。

請(qǐng)求圖像

關(guān)于PHImageManager類燃少,

- requestImageForAsset:targetSize:contentMode:options:resultHandler:

你不應(yīng)該生成該類的實(shí)例,而是應(yīng)該使用該類的提供的單例對(duì)象铃在,該方法提供指定的尺寸的圖像阵具,與ALAssetLibrary庫相比,沒有了方便的縮略圖提供定铜,但是ALAssetLibrary庫提供的縮略圖往往尺寸太小而且質(zhì)量很低阳液,用在TableView上還行。
該方法在默認(rèn)情況下是異步執(zhí)行的揣炕,而且Photos庫可能會(huì)很多次執(zhí)行resultHandler塊帘皿,因?yàn)閷?duì)于制定的尺寸,Photos可能會(huì)提供底質(zhì)量的圖像已供臨時(shí)顯示祝沸,隨后會(huì)將指定尺寸的圖像返回矮烹,如果指定尺寸的高質(zhì)量的圖像有緩存越庇,那么直接提供高質(zhì)量的圖像罩锐,而這些行為,可以通過options參數(shù)來定制卤唉。

PHImageRequestOptions類用于定制請(qǐng)求涩惑,上面的方法返回指定尺寸的圖像,如果你僅僅指定必要的參數(shù)而沒有對(duì)options進(jìn)行配置的話桑驱,返回的圖像尺寸將會(huì)是原始圖像的尺寸竭恬,或者你指定的尺寸很小,這時(shí)候會(huì)按照你的要求來返回接近改尺寸的圖像熬的。
PHImageRequestOptions有以下幾個(gè)重要的屬性:

synchronous:指定請(qǐng)求是否同步執(zhí)行
resizeMode:對(duì)請(qǐng)求的圖像怎樣縮放痊硕。有三種選擇:none,不縮放;Fast,盡快的提供接近或者稍微大于要求的尺寸,Exact,精準(zhǔn)的提供要求的尺寸押框。
deliveryModel:圖像質(zhì)量岔绸,有三中值:Opportunistic,在速度與質(zhì)量中均衡,HighQualityFormat,不管花費(fèi)多長的時(shí)間盒揉,提供高質(zhì)量的圖像晋被;FastFormat,以最快的速度提供好的質(zhì)量刚盈。這個(gè)屬性只有在synchronous為true時(shí)有效羡洛。
normalizedCropRect:用于對(duì)原始尺寸的圖像進(jìn)行裁剪,基于比例坐標(biāo)藕漱,只在resizeMode為Exact時(shí)有效

resizeMode默認(rèn)是None欲侮,這也造成了返回圖像尺寸與要求尺寸不符,這點(diǎn)需要注意肋联。這個(gè)要返回一個(gè)指定尺寸的圖像要避免兩層陷阱:一定要指定options參數(shù)锈麸,resizeMode不能為None。

除了必要的請(qǐng)求圖像或是視頻的功能外牺蹄,PHImageManager添加了兩大功能:
1忘伞、緩存圖像,由于其之類PHCachingImageManager實(shí)現(xiàn)沙兰,緩存效率和空間管理能滿足大部分場(chǎng)景的需求氓奈;
2、裁剪圖像鼎天,這個(gè)功能很久以前就有強(qiáng)烈的需求舀奶。

localldentifier vs URL

Photos框架推出時(shí),和原來的照片庫AssetLibrary框架之間還有些交互斋射,PHAsset類的+ fetchAssetWithALAssetURLs:options: 和PHAssetCollection類的+ fetchAssetCollectionsWithALAssetGroupURLs:options:可以利用原來的AssetsLibrary提供的URL進(jìn)行轉(zhuǎn)化育勺,而在iOS9 中,原來的照片框架AssertLibrary已經(jīng)被廢棄了罗岖,官方要淡化照片庫中URL的概念涧至,改之使用一個(gè)標(biāo)識(shí)符唯一代表一個(gè)資源,Photos框架中的根類PHObject只有一個(gè)公開接口localIdentifier,AssetsLibrary框架中無論是Asset還是AssetGroup的URL也是唯一標(biāo)識(shí)符桑包,而且同時(shí)還是動(dòng)態(tài)變化的南蓬,每次啟動(dòng)應(yīng)用后獲取的URL和上一次是不一樣的,而且AssetGroup有一個(gè)PersistentID與PHObject的localidentifier 類似哑了,但獲取比較麻煩赘方。
localIdentifier屬性帶來的最大好處就是PHObject類實(shí)現(xiàn)了NSCopying協(xié)議,可以直接使用localIdentifier屬性對(duì)PHObject以及子類對(duì)象進(jìn)行對(duì)比是否同一個(gè)對(duì)象弱左。

獲取指定類型相冊(cè)

通過PHAssetCollection的以下方法來獲取指定的相冊(cè):

func fetchAssetCollectionsWithType(_ type: PHAssetCollectionType, subtype subtype: PHAssetCollectionSubtype, options options: PHFetchOptions?) -> PHFetchResult

這個(gè)方法需要至少指定兩個(gè)參數(shù):

enum PHAssetCollectionType : Int { 
case Album //從 iTunes 同步來的相冊(cè)窄陡,以及用戶在 Photos 中自己建立的相冊(cè) 
case SmartAlbum //經(jīng)由相機(jī)得來的相冊(cè) 
case Moment //Photos 為我們自動(dòng)生成的時(shí)間分組的相冊(cè)}

enum PHAssetCollectionSubtype : Int { 
case AlbumRegular //用戶在 Photos 中創(chuàng)建的相冊(cè),也就是我所謂的邏輯相冊(cè) 
case AlbumSyncedEvent //使用 iTunes 從 Photos 照片庫或者 iPhoto 照片庫同步過來的事件拆火。然而跳夭,在iTunes 12 以及iOS 9.0 beta4上鳖悠,選用該類型沒法獲取同步的事件相冊(cè),而必須使用AlbumSyncedAlbum优妙。 
case AlbumSyncedFaces //使用 iTunes 從 Photos 照片庫或者 iPhoto 照片庫同步的人物相冊(cè)乘综。
 case AlbumSyncedAlbum //做了 AlbumSyncedEvent 應(yīng)該做的事 
case AlbumImported //從相機(jī)或是外部存儲(chǔ)導(dǎo)入的相冊(cè),完全沒有這方面的使用經(jīng)驗(yàn)套硼,沒法驗(yàn)證卡辰。 
case AlbumMyPhotoStream //用戶的 iCloud 照片流
 case AlbumCloudShared //用戶使用 iCloud 共享的相冊(cè) 
case SmartAlbumGeneric //文檔解釋為非特殊類型的相冊(cè),主要包括從 iPhoto 同步過來的相冊(cè)邪意。由于本人的 iPhoto 已被 Photos 替代九妈,無法驗(yàn)證。不過雾鬼,在我的 iPad mini 上是無法獲取的萌朱,而下面類型的相冊(cè),盡管沒有包含照片或視頻策菜,但能夠獲取到晶疼。 case SmartAlbumPanoramas //相機(jī)拍攝的全景照片 
case SmartAlbumVideos //相機(jī)拍攝的視頻 
case SmartAlbumFavorites //收藏文件夾 
case SmartAlbumTimelapses //延時(shí)視頻文件夾,同時(shí)也會(huì)出現(xiàn)在視頻文件夾中 
case SmartAlbumAllHidden //包含隱藏照片或視頻的文件夾 
case SmartAlbumRecentlyAdded //相機(jī)近期拍攝的照片或視頻 
case SmartAlbumBursts //連拍模式拍攝的照片又憨,在 iPad mini 上按住快門不放就可以了翠霍,但是照片依然沒有存放在這個(gè)文件夾下,而是在相機(jī)相冊(cè)里蠢莺。 
case SmartAlbumSlomoVideos //Slomo 是 slow motion 的縮寫寒匙,高速攝影慢動(dòng)作解析,在該模式下躏将,iOS 設(shè)備以120幀拍攝锄弱。不過我的 iPad mini 不支持,沒法驗(yàn)證祸憋。 case SmartAlbumUserLibrary //這個(gè)命名最神奇了会宪,就是相機(jī)相冊(cè),所有相機(jī)拍攝的照片或視頻都會(huì)出現(xiàn)在該相冊(cè)中夺衍,而且使用其他應(yīng)用保存的照片也會(huì)出現(xiàn)在這里狈谊。 
case Any //包含所有類型}

注意,獲取指定類型的相冊(cè)時(shí)沟沙,主類型和子類型要匹配,如果不匹配壁榕,系統(tǒng)會(huì)按照Any子類型來處理矛紫,對(duì)于Moment類型,子類型使用Any.
1.獲取用戶自己建立的相冊(cè)和文件夾我稱之為邏輯相冊(cè)牌里,非系統(tǒng)相冊(cè)和從 iTunes 同步來的相冊(cè))有兩種方法:

PHCollection.fetchTopLevelUserCollectionsWithOptions(nil)
PHAssetCollection.fetchAssetCollectionsWithType(.Album,subtype:.AlbumRegular,option:nil)

在沒有提供PHOptions的情況下颊咬,返回的PHFetchResult結(jié)果是按相冊(cè)的建立時(shí)間排序的务甥,最新的在前面
2.獲取相機(jī)相冊(cè):

PHAssetCollection.fetchAssetCollectionWithType(.SmartAlbum,subtype:.SmartAlbumUserLibrary,options:nil)

另外:PHAsset
的獲取方式在 iOS 8.1 后發(fā)生了一些變化。以下的兩個(gè)方法在 iOS 8.1后不再包含從 iTunes 同步以及在 iCloud 中的照片和視頻喳篇。要獲取 iOS 設(shè)備上本地的所有照片和資源只能從 PHAssetCollection 入手了敞临。

+ fetchAssetsWithMediaType:options:
+ fetchAssetsWithOptions:

添加、刪除麸澜、編輯

對(duì)照片庫進(jìn)行操作,可參見官方文檔Requesting Changes to the Photo Library,照片庫中的資源都有對(duì)應(yīng)的變更請(qǐng)求類:PHAssetChangeRequest,PHAssetCollectionChangeRequestPHCollectionListChangeRequest,而這些操作的請(qǐng)求都要求在PHPhotoLibrary的performChanges(_ changeBlock: dispatch_block_t!, completionHandler completionHandler: ((Bool, NSError!) -> Void)!)中的changeBlock中執(zhí)行挺尿。注意這里只是發(fā)出請(qǐng)求并沒有做出實(shí)質(zhì)的更改,因此想要根據(jù)更改結(jié)果更新UI的話不要在completionHandler中進(jìn)行炊邦,而應(yīng)該在photoLibraryDidChange(changeInfo:PHChange1喾)中進(jìn)行。三種變更請(qǐng)求中馁害,刪除和編輯操作都比較簡(jiǎn)單窄俏,而添加操作有需要注意的地方。

添加操作:placeholder的用處

在相冊(cè)中添加照片:

let createAssetRequest = PHAssetChangeRequest.creationRequestForAssetFromImage(image)
let assetPlaceholder = createAssetRequest.placeholderForCreatedAsset
let albumChangeRequest = PHAssetCollectionChangeRequest(for AssetCollection:album)
albumChangeRequest.addAssets([assetPlaceholder])

在文件夾中添加相冊(cè):

let fetchResult = PHCollection.fetchCollectionsInCollectionList(collectionList,options:nil)
let createSubAlbumRequest = PHAssetCollectionChangeRequest.creationRequestForAssetCollectionWithTitle(title!)
let albumPlaceholder = createSubAlbumRequest.placeholderForCreatedAssetCollection
let folderChangeRequest = PHCollectionListChangeRequest.init(forCollectionList:collectionList,childCollections:fetchResult)
folderChangeRequest?.addChildCollections([albumPlaceholder])

在文件夾中添加子文件夾:

let fetchResult = PHCollection.fetchCollectionsInCollectionList(collectionList,options:nil)
let createSubAlbumRequest = PHAssetCollectionChangeRequest.creationRequestForCollectionListWithTitle(title!)
let subfolderPlaceholder = createSubFolderRequest.placeholderForCreatedCollectionList
let folderChangeRequest = PHCollectionListChangeRequest.init(forCollectionList:collectionList,childCollections:fetchResult)
folderChangeRequest?.addChildCollections([subfolderPlaceholder])

處理變更

對(duì)相冊(cè)發(fā)出變更請(qǐng)求后碘菜,系統(tǒng)會(huì)通知用戶是否允許凹蜈,用戶允許后才會(huì)發(fā)生實(shí)質(zhì)上的變化,系統(tǒng)會(huì)發(fā)布通知忍啸。
首先踪区,注冊(cè)成為PHPhotoLibrary的觀察者來接收變化通知:

PHPhotoLibrary.shareLibrary().registerChangeObserver(self)

然后,實(shí)現(xiàn)PHPhotoLibraryChangeObserver協(xié)議的photoLibraryDidChange(changeInfo:PHChange!)吊骤。官方一個(gè)很好的例子:Handing Changes:An Example,有以下幾點(diǎn)需要注意:

  • 在photoLibraryDidChange(changeInfo:PHChange!)的實(shí)現(xiàn)里將所有處理放在主線程里處理缎岗;
  • 所有PHPhotoLibrary的觀察者都會(huì)收到通知,不管觀察者本身引用的內(nèi)容是否發(fā)生變化白粉,因此要根據(jù)觀察者的情況來對(duì)通知進(jìn)行過濾传泊。從參數(shù)PhChange對(duì)象里能獲得所有的變化,通過changeDetailsForObject:和changeDetailsForFetchResult:來獲取細(xì)節(jié)鸭巴。changeDetailsForObject:獲取的細(xì)節(jié)只是PHobject子類對(duì)象本身的信息變化眷细。對(duì)一個(gè)PHFetchResult對(duì)象使用changeDetailsForFetchResult:獲取的細(xì)節(jié)中只包含該P(yáng)HFetchResult對(duì)象變化的信息,可以利用這點(diǎn)來對(duì)通知進(jìn)行過濾處理鹃祖。
  • 通過 changeDetailsForFetchResult:獲取的PHFetchResultChangeDetails對(duì)象溪椎,包含了FetchResult的結(jié)果的所有變化情況以及FetchResult的成員變化前后的數(shù)據(jù),需要注意的是成員變化的通知恬口。
    例如校读,通過
var rootCollectionsFetchResult = PHCollection.fetchTopLevelUserCollectionsWithOptions(nil)

獲取所有用戶建立的相冊(cè)和文件夾,在photoLibraryDidChange(changeInfo:PHChange!)中通過以下方法獲得PHFetchResultChangeDetails對(duì)象祖能。

let fetchChangeDetails = changeInstance.changeDetailsForFetchResult(rootCollectionsFetchResult)

fetchChangeDetails.changeObject返回一組其內(nèi)容或元數(shù)據(jù)發(fā)生變化的成員歉秫,返回的成員是跟新后的成員對(duì)象。當(dāng)用戶對(duì)某個(gè)文件夾內(nèi)的相冊(cè)或子文件夾進(jìn)行添加养铸、刪除和編輯操作即文件夾的內(nèi)容而不是文件夾本身的屬性發(fā)生變化時(shí)雁芙,通知中會(huì)該變化的信息轧膘,實(shí)際上只有在文件夾中添加相冊(cè)或子文件夾時(shí)才會(huì)在fetchChangeDetails.changedObject中有所反應(yīng),而刪除成員或是修改元數(shù)據(jù)等操作都不會(huì)再通知中有所反應(yīng)兔甘,你需要使用其他手段來跟蹤變化

獲得所有相簿的原圖

(void)getOriginalImage
{
  //獲得所有的自定義相簿
PHFetchResult<PHAssetCollection *> * assetCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionAlbumRegular options:nil];
//遍歷所有的自定義的相簿
for(PHAssetCollection * assetCollection in assetCollections){
  [self enumerateAssetsInAssetCollection:assetCollection original:yes];
}
  //獲得相機(jī)膠卷
  PHAssetCollection * cameraRoll = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary options:nil].lastObject;
//遍歷相機(jī)膠卷谎碍,獲取大圖
[self enumerateAssetsInAssetCollection:cameraRoll original:YES];
}

獲得所有相簿中的縮略圖

- (void)getThumbnailImages
{
  //獲得所有的自定義相簿
PHFetchResult <PHAssetCollection *> assetCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
//遍歷所有的自定義相簿
for(PHAssetCollection * assetCollection in assetCollections){
  [self enumerateAssetsInAssetCollection:assetCollection original:NO];
}
// 獲得相機(jī)膠卷 
PHAssetCollection *cameraRoll = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary options:nil].lastObject; 
[self enumerateAssetsInAssetCollection:cameraRoll original:NO];
}

遍歷相冊(cè)

/** 
* 遍歷相簿中的所有圖片 
* @param assetCollection 相簿 
* @param original 是否要原圖 
*/
- (void)enumerateAssetsInAssetCollection:(PHAssetCollection *)assetCollection original:(BOOL)original{
 NSLog(@"相簿名:%@", assetCollection.localizedTitle);
 PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init]; 
// 同步獲得圖片, 只會(huì)返回1張圖片 
options.synchronous = YES;
 // 獲得某個(gè)相簿中的所有PHAsset對(duì)象 
PHFetchResult<PHAsset *> *assets = [PHAsset fetchAssetsInAssetCollection:assetCollection options:nil];
 for (PHAsset *asset in assets) { 
// 是否要原圖 
CGSize size = original ? CGSizeMake(asset.pixelWidth, asset.pixelHeight) : CGSizeZero; 
// 從asset中獲得圖片
 [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:size contentMode:PHImageContentModeDefault options:options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
 NSLog(@"%@", result); 
}];
 }}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市洞焙,隨后出現(xiàn)的幾起案子蟆淀,更是在濱河造成了極大的恐慌,老刑警劉巖闽晦,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扳碍,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡仙蛉,警方通過查閱死者的電腦和手機(jī)笋敞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來荠瘪,“玉大人夯巷,你說我怎么就攤上這事“梗” “怎么了趁餐?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長篮绰。 經(jīng)常有香客問我后雷,道長,這世上最難降的妖魔是什么吠各? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任臀突,我火速辦了婚禮,結(jié)果婚禮上贾漏,老公的妹妹穿的比我還像新娘候学。我一直安慰自己,他們只是感情好纵散,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布梳码。 她就那樣靜靜地躺著,像睡著了一般伍掀。 火紅的嫁衣襯著肌膚如雪掰茶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天硕盹,我揣著相機(jī)與錄音符匾,去河邊找鬼。 笑死瘩例,一個(gè)胖子當(dāng)著我的面吹牛啊胶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播垛贤,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼焰坪,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了聘惦?” 一聲冷哼從身側(cè)響起某饰,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎善绎,沒想到半個(gè)月后黔漂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡禀酱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年炬守,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片剂跟。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡减途,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出曹洽,到底是詐尸還是另有隱情鳍置,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布送淆,位于F島的核電站税产,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏偷崩。R本人自食惡果不足惜辟拷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望环凿。 院中可真熱鬧梧兼,春花似錦、人聲如沸智听。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽到推。三九已至考赛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間莉测,已是汗流浹背颜骤。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捣卤,地道東北人忍抽。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓八孝,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鸠项。 傳聞我的和親對(duì)象是個(gè)殘疾皇子干跛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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