Quartz 2D編程指南(2) - 圖形上下文(Graphics Contexts)

一個(gè)Graphics Context表示一個(gè)繪制目標(biāo)大莫。它包含繪制系統(tǒng)用于完成繪制指令的繪制參數(shù)和設(shè)備相關(guān)信息啦粹。Graphics Context定義了基本的繪制屬性肺樟,如顏色挎袜、裁減區(qū)域顽聂、線(xiàn)條寬度和樣式信息肥惭、字體信息、混合模式等紊搪。

我們可以通過(guò)幾種方式來(lái)獲取Graphics Context:Quartz提供的創(chuàng)建函數(shù)务豺、Mac OS X框架或IOS的UIKit框架提供的函數(shù)。Quartz提供了多種Graphics Context的創(chuàng)建函數(shù)嗦明,包括bitmap和PDF笼沥,我們可以使用這些Graphics Context創(chuàng)建自定義的內(nèi)容。

本章介紹了如何為不同的繪制目標(biāo)創(chuàng)建Graphics Context娶牌。在代碼中奔浅,我們用CGContextRef來(lái)表示一個(gè)Graphics Context。當(dāng)獲得一個(gè)Graphics Context后诗良,可以使用Quartz 2D函數(shù)在上下文(context)中進(jìn)行繪制汹桦、完成操作(如平移)、修改圖形狀態(tài)參數(shù)(如線(xiàn)寬和填充顏色)等鉴裹。

在iOS中的視圖Graphics Context進(jìn)行繪制

在iOS應(yīng)用程序中舞骆,如果要在屏幕上進(jìn)行繪制,需要?jiǎng)?chuàng)建一個(gè)UIView對(duì)象径荔,并實(shí)現(xiàn)它的drawRect:方法督禽。視圖的drawRect:方法在視圖顯示在屏幕上及它的內(nèi)容需要更新時(shí)被調(diào)用。在調(diào)用自定義的drawRect:后总处,視圖對(duì)象自動(dòng)配置繪圖環(huán)境以便代碼能立即執(zhí)行繪圖操作狈惫。作為配置的一部分,視圖對(duì)象將為當(dāng)前的繪圖環(huán)境創(chuàng)建一個(gè)Graphics Context鹦马。我們可以通過(guò)調(diào)用UIGraphicsGetCurrentContext函數(shù)來(lái)獲取這個(gè)Graphics Context胧谈。

UIKit默認(rèn)的坐標(biāo)系統(tǒng)與Quartz不同。在UIKit中荸频,原點(diǎn)位于左上角菱肖,y軸正方向?yàn)橄蛳隆IView通過(guò)將修改Quartz的Graphics Context的CTM[原點(diǎn)平移到左下角旭从,同時(shí)將y軸反轉(zhuǎn)(y值乘以-1)]以使其與UIView匹配稳强。

Mac OS X中創(chuàng)建一個(gè)窗口Graphics Context

在Mac OS X中繪制時(shí),我們需要?jiǎng)?chuàng)建一個(gè)窗口Graphics Context遇绞。Quartz 2D API 沒(méi)有提供函數(shù)來(lái)獲取窗口Graphics Context键袱。取而代之的是用Cocoa框架來(lái)獲取一個(gè)窗口上下文。

我們可以在Cocoa應(yīng)用程序的drawRect:中獲取一個(gè)Quartz Graphics Context摹闽,如下代碼所示:

CGContextRef myContext = [[NSGraphicsContext currentContext] graphicsPort];

currentContext方法在當(dāng)前線(xiàn)程中返回NSGraphicsContext實(shí)例蹄咖。graphicsPort方法返回一個(gè)低級(jí)別、平臺(tái)相關(guān)的Graphics Context(Quartz Graphics Context)付鹿。

在獲取到Graphics Context后澜汤,我們可以在Cocoa應(yīng)用程序中調(diào)用任何Quartz 2D的繪制函數(shù)蚜迅。我們同樣可以將Quartz 2D與Cocoa繪制操作混合使用。如圖2-1是一個(gè)在Cocoa視圖中用Quartz 2D繪制的實(shí)例俊抵。繪圖由兩個(gè)長(zhǎng)方形組成(一個(gè)不透明的紅色長(zhǎng)方形和半透明的藍(lán)色長(zhǎng)方形)谁不。

為了實(shí)現(xiàn)圖2-1實(shí)例,需要先創(chuàng)建一個(gè)Cocoa應(yīng)用程序徽诲。在Interface Builder中刹帕,拖動(dòng)一個(gè)Custom View到窗口中,并子類(lèi)化谎替。然后實(shí)現(xiàn)子類(lèi)視圖的偷溺,如代碼清單2-1所示。視圖的drawRect:包含了所有的Quartz繪制代碼钱贯。


引用

注:NSView的drawRect:方法在每次視圖需要繪制時(shí)自動(dòng)調(diào)用挫掏。

Listing 2-1? Drawing to a window graphics context

@implementation MyQuartzView

- (id)initWithFrame:(NSRect)frameRect

{

self = [super initWithFrame:frameRect];

return self;

}

- (void)drawRect:(NSRect)rec

{

CGContextRef myContext = [[NSGraphicsContext? currentContext] graphicsPort]; //1

// ********** Your drawing code here **********?????? //2

CGContextSetRGBFillColor (myContext, 1, 0, 0, 1);???? //3

CGContextFillRect (myContext, CGRectMake (0, 0, 200, 100 ));?? //4

CGContextSetRGBFillColor (myContext, 0, 0, 1, .5);???? //5

CGContextFillRect (myContext, CGRectMake (0, 0, 100, 200));?? //6

}

@end

代碼說(shuō)明:

1.為視圖獲取一個(gè)Graphics Context

2.插入繪圖代碼的地方。以下四行是使用Quartz 2D函數(shù)的例子

3.設(shè)置完全不透明的紅色填充色秩命。

4.填充一個(gè)長(zhǎng)方形尉共,其原點(diǎn)為(0, 0), 大小為(200, 100)

5.設(shè)置半透明的藍(lán)色填充色。

6.填充一個(gè)長(zhǎng)方形弃锐,其原點(diǎn)為(0, 0), 大小為(100, 200)

創(chuàng)建一個(gè)PDF Graphics Context

當(dāng)創(chuàng)建一個(gè)PDF Graphics Context并繪制時(shí)袄友,Quartz將繪制操作記錄為一系列的PDF繪制命令并寫(xiě)入文件中。我們需要提供一個(gè)PDF輸出的位置及一個(gè)默認(rèn)的media box(用于指定頁(yè)面邊界的長(zhǎng)方形)拿愧。圖2-2顯示了在PDF Graphics Context中繪制及在preview打開(kāi)PDF的結(jié)果杠河。

Quartz 2D API提供了兩個(gè)函數(shù)來(lái)創(chuàng)建PDF Graphics Context:

CGPDFContextCreateWithURL:當(dāng)你需要用Core Foundation URL指定pdf輸出的位置時(shí)使用該函數(shù)。代碼清單2-2顯示了該函數(shù)的使用方法(代碼2-2及后面代碼的詳細(xì)解釋略):

Listing 2-2? Calling CGPDFContextCreateWithURL to create a PDF graphics context

CGContextRef MyPDFContextCreate (const CGRect *inMediaBox, CFStringRef path)

{

CGContextRef myOutContext = NULL;

CFURLRef url;

url = CFURLCreateWithFileSystemPath (NULL, path, kCFURLPOSIXPathStyle, false);

if (url != NULL) {

myOutContext = CGPDFContextCreateWithURL (url,? inMediaBox,? NULL);

CFRelease(url);

}

return myOutContext;

}

CGPDFContextCreate:當(dāng)需要將pdf輸出發(fā)送給數(shù)據(jù)用戶(hù)時(shí)使用該方法浇辜。代碼清單2-3顯示了該函數(shù)的使用方法:

Listing 2-3? Calling CGPDFContextCreate to create a PDF graphics context

CGContextRef MyPDFContextCreate (const CGRect *inMediaBox, CFStringRef path) {

CGContextRef? ? ? ? myOutContext = NULL;

CFURLRef? ? ? ? ? ? url;

CGDataConsumerRef ? dataConsumer;

url = CFURLCreateWithFileSystemPath (NULL,? path, kCFURLPOSIXPathStyle, false);

if (url != NULL)

{

dataConsumer = CGDataConsumerCreateWithURL (url);

if (dataConsumer != NULL)

{

myOutContext = CGPDFContextCreate (dataConsumer, inMediaBox, NULL);

CGDataConsumerRelease (dataConsumer);

}

CFRelease(url);

}

return myOutContext;

}

代碼清單2-4顯示是如何調(diào)用MyPDFContextCreate程序及繪制操作。

Listing 2-4? Drawing to a PDF graphics context

CGRect mediaBox;

mediaBox = CGRectMake (0, 0, myPageWidth, myPageHeight);

myPDFContext = MyPDFContextCreate (&mediaBox, CFSTR("test.pdf"));

CFStringRef myKeys[1];

CFTypeRef myValues[1];

myKeys[0] = kCGPDFContextMediaBox;

myValues[0] = (CFTypeRef) CFDataCreate(NULL,(const UInt8 *)&mediaBox, sizeof (CGRect));

CFDictionaryRef pageDictionary = CFDictionaryCreate(NULL, (const void **) myKeys,

(const void **) myValues, 1,

&kCFTypeDictionaryKeyCallBacks,

& kCFTypeDictionaryValueCallBacks);

CGPDFContextBeginPage(myPDFContext, &pageDictionary);

// ********** Your drawing code here **********

CGContextSetRGBFillColor (myPDFContext, 1, 0, 0, 1);

CGContextFillRect (myPDFContext, CGRectMake (0, 0, 200, 100 ));

CGContextSetRGBFillColor (myPDFContext, 0, 0, 1, .5);

CGContextFillRect (myPDFContext, CGRectMake (0, 0, 100, 200 ));

CGPDFContextEndPage(myPDFContext);

CFRelease(pageDictionary);

CFRelease(myValues[0]);

CGContextRelease(myPDFContext);

我們可以將任何內(nèi)容(圖片唾戚,文本柳洋,繪制路徑)繪制到pdf中,并能添加鏈接及加密叹坦。

創(chuàng)建位圖Graphics Context

一個(gè)位圖Graphics Context接受一個(gè)指向內(nèi)存緩存(包含位圖存儲(chǔ)空間)的指針熊镣,當(dāng)我們繪制一個(gè)位圖Graphics Context時(shí),該緩存被更新募书。在釋放Graphics Context后绪囱,我們將得到一個(gè)我們指定像素格式的全新的位圖。

引用

注:位圖Graphics Context有時(shí)用于后臺(tái)繪制莹捡。CGLayer對(duì)象優(yōu)化了后臺(tái)繪制鬼吵,因?yàn)镼uartz在顯卡上緩存了層。

引用

iOS提示:iOS應(yīng)用程序使用了UIGraphicsBeginImageContextWithOptions取代Quartz低層函數(shù)篮赢。如果使用Quartz創(chuàng)建一下后臺(tái)bitmap齿椅,bitmap Graphics Context使用的坐標(biāo)系統(tǒng)是Quartz默認(rèn)的坐標(biāo)系統(tǒng)琉挖。而使用UIGraphicsBeginImageContextWithOptions創(chuàng)建圖形上下文,UIKit將會(huì)對(duì)坐標(biāo)系統(tǒng)使用與UIView對(duì)象的圖形上下文一樣的轉(zhuǎn)換涣脚。這允許應(yīng)用程序使用相同的繪制代碼而不需要擔(dān)心坐標(biāo)系統(tǒng)問(wèn)題示辈。雖然我們的應(yīng)用程序可以手動(dòng)調(diào)整CTM達(dá)到相同的效果,但這種做沒(méi)有任何好處遣蚀。

我們使用CGBitmapContextCreate來(lái)創(chuàng)建位圖Graphics Context矾麻,該函數(shù)有如下參數(shù):

CG_EXTERN CGContextRef __nullable CGBitmapContextCreate(void * __nullable data,

size_t width, size_t height, size_t bitsPerComponent, size_t bytesPerRow,

CGColorSpaceRef cg_nullable space, uint32_t bitmapInfo)

CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);

data:一個(gè)指向內(nèi)存目標(biāo)的指針,該內(nèi)存用于存儲(chǔ)需要渲染的圖形數(shù)據(jù)芭梯。內(nèi)存塊的大小至少需要(bytePerRow * height)字節(jié)射富。

width:指定位圖的寬度,單位是像素(pixel)粥帚。

height:指定位圖的高度胰耗, 單位是像素(pixel)。

bitsPerComponent:指定內(nèi)存中一個(gè)像素的每個(gè)組件使用的位數(shù)芒涡。例如柴灯,一個(gè)32位的像素格式和一個(gè)rgb顏色空間,我們可以指定每個(gè)組件為8位费尽。

bytesPerRow:指定位圖每行的字節(jié)數(shù)赠群。

colorspace:顏色空間用于位圖上下文。在創(chuàng)建位圖Graphics Context時(shí)旱幼,我們可以使用灰度(gray), RGB, CMYK, NULL顏色空間查描。

bitmapInfo:位圖的信息,這些信息用于指定位圖是否需要包含alpha組件柏卤,像素中alpha組件的相對(duì)位置(如果有的話(huà))冬三,alpha組件是否是預(yù)乘的,及顏色組件是整型值還是浮點(diǎn)值缘缚。

代碼清單2-5顯示了如何創(chuàng)建位圖Graphics Context勾笆。當(dāng)向位圖Graphics Context繪圖時(shí),Quartz將繪圖記錄到內(nèi)存中指定的塊中桥滨。

Listing 2-5? Creating a bitmap graphics context

CGContextRef MyCreateBitmapContext (int pixelsWide, int pixelsHigh)

{

CGContextRef? ? context = NULL;

CGColorSpaceRef colorSpace;

void *? ? ? ? ? bitmapData;

int ? ? ? ? ? ? bitmapByteCount;

int ? ? ? ? ? ? bitmapBytesPerRow;

bitmapBytesPerRow ? = (pixelsWide * 4);

bitmapByteCount ? ? = (bitmapBytesPerRow * pixelsHigh);

colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);

bitmapData = calloc( bitmapByteCount );

if (bitmapData == NULL)

{

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

return NULL;

}

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

if (context== NULL)?

{

free (bitmapData);

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

return NULL;

}

CGColorSpaceRelease( colorSpace );

return context;

}

代碼清單2-6顯示了調(diào)用MyCreateBitmapContext 創(chuàng)建一個(gè)位圖Graphics Context窝爪,使用位圖Graphics Context來(lái)創(chuàng)建CGImage對(duì)象,然后將圖片繪制到窗口Graphics Context中齐媒。繪制結(jié)果如圖2-3所示:

Listing 2-6? Drawing to a bitmap graphics context

CGRect myBoundingBox;

myBoundingBox = CGRectMake (0, 0, myWidth, myHeight);

myBitmapContext = MyCreateBitmapContext (400, 300);

// ********** Your drawing code here **********

CGContextSetRGBFillColor (myBitmapContext, 1, 0, 0, 1);

CGContextFillRect (myBitmapContext, CGRectMake (0, 0, 200, 100 ));

CGContextSetRGBFillColor (myBitmapContext, 0, 0, 1, .5);

CGContextFillRect (myBitmapContext, CGRectMake (0, 0, 100, 200 ));

myImage = CGBitmapContextCreateImage (myBitmapContext);

CGContextDrawImage(myContext, myBoundingBox, myImage);

char *bitmapData = CGBitmapContextGetData(myBitmapContext);

CGContextRelease (myBitmapContext);

if (bitmapData) free(bitmapData);

CGImageRelease(myImage);

支持的像素格式


表2-1總結(jié)了位圖Graphics Context支持的像素格式蒲每,相關(guān)的顏色空間及像素格式支持的Mac OS X最早版本。像素格式用bpp(每像素的位數(shù))和bpc(每個(gè)組件的位數(shù))來(lái)表示喻括。表格同時(shí)也包含與像素格式相關(guān)的位圖信息常量邀杏。

表2-1:位圖Graphics Context支持的像素格式

Null8 bpp, 8 bpc,kCGImageAlphaOnly

Mac OS X, iOS

Gray

8 bpp, 8 bpc,kCGImageAlphaNone

Mac OS X, iOS

Gray

8 bpp, 8 bpc,kCGImageAlphaOnly

Mac OS X, iOS

Gray

16 bpp, 16 bpc,kCGImageAlphaNone

Mac OS X

Gray

32 bpp, 32 bpc,kCGImageAlphaNone|kCGBitmapFloatComponents

Mac OS X

RGB

16 bpp, 5 bpc,kCGImageAlphaNoneSkipFirst

Mac OS X, iOS

RGB

32 bpp, 8 bpc,kCGImageAlphaNoneSkipFirst

Mac OS X, iOS

RGB

32 bpp, 8 bpc,kCGImageAlphaNoneSkipLast

Mac OS X, iOS

RGB

32 bpp, 8 bpc,kCGImageAlphaPremultipliedFirst

Mac OS X, iOS

RGB

32 bpp, 8 bpc,kCGImageAlphaPremultipliedLast

Mac OS X, iOS

RGB

64 bpp, 16 bpc,kCGImageAlphaPremultipliedLast

Mac OS X

RGB

64 bpp, 16 bpc,kCGImageAlphaNoneSkipLast

Mac OS X

RGB

128 bpp, 32 bpc,kCGImageAlphaNoneSkipLast|kCGBitmapFloatComponents

Mac OS X

RGB

128 bpp, 32 bpc,kCGImageAlphaPremultipliedLast|kCGBitmapFloatComponents

Mac OS X

CMYK

32 bpp, 8 bpc,kCGImageAlphaNone

Mac OS X

CMYK

64 bpp, 16 bpc,kCGImageAlphaNone

Mac OS X

CMYK

128 bpp, 32 bpc,kCGImageAlphaNone|kCGBitmapFloatComponents

Mac OS X

反鋸齒

位圖Graphics Context支持反鋸齒,這一操作是人為的較正在位圖中繪制文本或形狀時(shí)產(chǎn)生的鋸齒邊緣双妨。當(dāng)位圖的分辯率明顯低于人眼的分辯率時(shí)就會(huì)產(chǎn)生鋸齒淮阐。為了使位圖中的對(duì)象顯得平滑叮阅,Quartz使用不同的顏色來(lái)填充形狀周邊的像素。通過(guò)這種方式來(lái)混合顏色泣特,使形狀看起來(lái)更平滑浩姥。如圖2-4顯示的效果。我們可以通過(guò)調(diào)用CGContextSetShouldAntialias來(lái)關(guān)閉位圖Graphics Context的反鋸齒效果状您。反鋸齒設(shè)置是圖形狀態(tài)的一部分勒叠。

可以調(diào)用函數(shù)CGContextSetAllowsAntialiasing來(lái)控制一個(gè)特定Graphics Context是否支持反鋸齒;false表示不支持膏孟。該設(shè)置不是圖形狀態(tài)的一部分眯分。當(dāng)上下文及圖形狀態(tài)設(shè)置為true時(shí),Quartz執(zhí)行反鋸齒柒桑。

獲取打印的Graphics Context


Mac OS X中的Cocoa應(yīng)用程序通過(guò)自定義的NSView子類(lèi)來(lái)實(shí)現(xiàn)打印弊决。一個(gè)視圖通過(guò)調(diào)用print:方法來(lái)進(jìn)行打印。然后視圖以打印機(jī)為目標(biāo)創(chuàng)建一個(gè)Graphics Context魁淳,并調(diào)用drawRect:方法飘诗。應(yīng)用程序使用與在屏幕進(jìn)行繪制相同的繪制代碼。我們同樣可以自定義drawRect: 方法將圖形繪制到打印機(jī)界逛。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末昆稿,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子息拜,更是在濱河造成了極大的恐慌溉潭,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件少欺,死亡現(xiàn)場(chǎng)離奇詭異喳瓣,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)狈茉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)夫椭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人氯庆,你說(shuō)我怎么就攤上這事∪鸥叮” “怎么了堤撵?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)羽莺。 經(jīng)常有香客問(wèn)我实昨,道長(zhǎng),這世上最難降的妖魔是什么盐固? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任荒给,我火速辦了婚禮丈挟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘志电。我一直安慰自己曙咽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布挑辆。 她就那樣靜靜地躺著例朱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鱼蝉。 梳的紋絲不亂的頭發(fā)上洒嗤,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音魁亦,去河邊找鬼渔隶。 笑死,一個(gè)胖子當(dāng)著我的面吹牛洁奈,可吹牛的內(nèi)容都是我干的间唉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼睬魂,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼终吼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起氯哮,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤际跪,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后喉钢,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體姆打,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年肠虽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了幔戏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡税课,死狀恐怖闲延,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情韩玩,我是刑警寧澤垒玲,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站找颓,受9級(jí)特大地震影響合愈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一佛析、第九天 我趴在偏房一處隱蔽的房頂上張望益老。 院中可真熱鬧,春花似錦寸莫、人聲如沸捺萌。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)互婿。三九已至,卻和暖如春辽狈,著一層夾襖步出監(jiān)牢的瞬間慈参,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工刮萌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留驮配,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓着茸,卻偏偏與公主長(zhǎng)得像壮锻,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子涮阔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

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