本篇讲述如何制作WinPE。我参考了微软的技术文档:
https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/winpe-create-usb-bootable-drive

首先打开开始菜单,找到Windows Kits并展开,右键“部署和映像工具环境”,以管理员身份运行,如下图所示:

在弹出的cmd窗口中,键入以下命令并按回车。此命令的目的是将PE的工作文件创建到你指定的文件夹中

# 要制作64位WinPE,使用下面这个命令。强烈建议使用64位的WinPE
copype amd64 C:\WinPE_amd64
# 如果是要32位的WinPE,则使用这条命令
copype x86 C:\WinPE
# WinPE和WinPE_amd64目录可以更换成你想要的名称,我自己怕麻烦就选择不更改
PE复制完成

接下来就是将PE烧录到U盘中了,使用如下命令:

# 64位
MakeWinPEMedia /UFD C:\WinPE_amd64 P:
# 32位
MakeWinPEMedia /UFD C:\WinPE P:

注意,P:是U盘的盘符。该命令会格式化U盘(FAT32格式),所以建议找个小容量U盘或者SD卡来操作(几年前淘汰下来的存储设备又可以重新发光发热)。盘符一定不能输入错误,否则就会呵呵。烧录时间根据存储设备的性能不同而不同,请耐心等待结束。

C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools>MakeWinPEMedia /UFD C:\WinPE_amd64 E:
WARNING, ALL DATA ON DISK DRIVE E: WILL BE LOST!
Proceed with Format [Y,N]?Y
Formatting E:...

Setting the boot code on E:...

Copying files to E:...


Success

制作完成,可以把U盘插到VMWare中来测试一下效果:

WinPE界面

Emm…看到这个界面就表示WinPE已经制作成功了,这个就是微软的,原汁原味的WinPE。现在可以通过命令行来执行各种命令了。

好了,本篇教程就到这里,下次会讲如何个性化WinPE

首先,让我们去从微软官网上下载ADK。下载地址:
https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/download-winpe–windows-pe

微软官网上的说明

然后,确认一下要制作的WinPE的内核版本。如果要制作1809版本及以上的,需要下载ADK和WinPE插件两个程序;如果是1803或者更早期的内核,则只需要下载一个ADK程序即可。注意,两个ADK并不是同一个程序。这里我选择使用1809的版本

下载完成后得到两个程序,上面一个是ADK,下面那个是WinPE Add-on

ADK程序

首先运行上面个adksetup.exe,因为目的是制作WinPE,所以在选择功能的时候,除了部署工具以外的其他功能统统用不到。点击安装后等待完成安装。

选择“部署工具”即可

接着安装下面那个adkwinpesetup.exe。过程中可能会多次跳出下面这个对话框,表示没有网络连接,这种情况下首先检查自己的网络,确认网络没问题的话只需多点几次Retry,基本就能下载成功。

没有网络连接?

下载过程中请耐心等待。。。。下载完成之后,WinPE的部署环境就搭建好了

本文转载自果壳 https://www.guokr.com/article/439451/

你一定会对这样的场景十分熟悉:在电影或者电视剧的高潮部分,最终大BOSS手拿武器对准躺在地上满身是血的主角。他/她/它(当然)并没有立即终结主角,而是(如你所想地)侃侃而谈:“想当年,我可是……”这段追忆往昔峥嵘岁月的回忆洋洋洒洒,足以写下一篇八百字作文。等等,只听“砰!”的一声——大BOSS(如你所想地)被主角干掉了。

大BOSS常常在占尽优势的时候对主角“话太多”。在说这段剖析自己内心世界的话时,他们给了主角足够的时间准备“逆袭”,而潜台词就是:“主角你在干啥?我都说的口干舌燥了,还不来干掉我?”于是主角愉快地满足了他们的愿望。嗯,那么现在问题就来了:为什么这些坏人、大BOSS,总是功败垂成,最后死于自己太话痨呢?


嗯,那一定挺疼的……图片来源:mrwgifs.com

剧情要求,主角光环不能始终无敌

首先,在影视作品里很显然这事儿得问编剧跟导演啊!这可都是编剧和导演弄出来的鬼把戏。一方面,作为正面角色,主人公做事儿不能太顺利,主角光环只能在关键时刻用一用,如果全程都是无敌效果,那还有什么看头啊?估计这样的片子只能吸引吸引小学三年级以下的观众了——现在的动画片儿都不太这么演了好嘛。

反过来,坏人也不能太厉害,他可以一直都占据优势、占据主动,但最后必须被主人公给干掉。你要是让坏人一路占尽优势,最后把主人公给干掉了,观众也不答应啊。就算是观众答应了,你不给个正面的光明的结尾,也有些人要跟你急啊。

不过,话说回来,艺术来源于生活。时间是最好的编剧,现实世界才是我们能看到的最伟大的戏剧。在这部漫长而丰饶的现实大戏里,坏人死于话多的情况,真的会出现。

真实的坏人也死于“话太多”

美国联邦调查局(FBI)的科学调查组创始人雷斯勒写过一本很著名的书,叫《FBI心理分析术》,详细记录了自己为FBI工作的过程和细节。他提到,自己曾经跟上世纪70年代纽约一个著名的连环杀手大卫·柏克威兹(David Berkowitz),做过深入的谈话。这个柏克威兹很厉害,他自称“山姆之子”,总是在深夜伏击正在亲热的情侣。而且还很高调地给当地媒体写信,讲述自己的故事。截止到被捕的时候,他一共杀死了6个人,击伤7人。可以说是罪行累累。


“山姆之子”,真名叫作大卫·柏克威兹,他专门狙杀约会中的情侣,往往隐藏在小暗巷中趁情侣们缠绵时从车窗口向女方射击。crimemagazine.com

然而,就是这样一个心狠手辣的杀手,他却告诉雷斯勒一个此前所有心理学家、刑侦专家,估计连大长脸儿夏洛克都没有注意到过的信息:凶手在行凶之后,常常会情不自禁地回到案发现场。很快,心理学方面的一些研究也证实了这一点。这个现象后来被运用到刑侦工作当中,起了很大的作用。现在我们看一些刑侦题材的影视剧作品,也经常会看到这样的桥段:警方在勘查案发现场的时候,在围观的人群中发现了形迹可疑者,这个时候嫌疑人一定会拔腿狂奔,警察则一定会紧紧追赶。而且这一追捕行动一定会失败:不是被嫌疑人跑掉,就是突然暴毙,看一眼进度条就什么都明白了。

美国小说家帕拉尼克在名作《肠子》里也提到过这样的桥段,警探会在谋杀弃尸的现场藏一个麦克风,然后监听这里的情况。因为几乎所有的凶手都会回来跟受害者说话。所有人都有倾诉的需求,而杀人者只能与那个被杀死的,也就是永远都不可能出卖他的人分享自己的罪行。

可是,匪徒为什么要去多这么一嘴呢?他难道不能像个北欧人一样保持沉默吗?如果进入了心理学的范畴,一切都变得好理解了。

为啥坏人总是喋喋不休?

消解认知失调

行凶者面临的第一个问题就是认知失调。认知失调简单来说就是我们所做的事情跟我们的认知发生了冲突。比如我们会有一个基本认识:“杀人是不对的”。行凶者在做这件不对的事情,但又不愿意承认自己犯罪是错误的。所以,他必须要通过将杀人行为“合理化”来实现建立心理防御机制。

行凶者会找各种借口来获取自己犯罪的正当性,最终说服自己放下良心的包袱,告诉自己“他就是该杀”。这种心理防御机制在电影中的最经典表现来自《黑客帝国》。在片中,史密斯要毁灭人类的理由如此充分:“你们人类一直以为你们自己是哺乳动物,其实你们不是。地球上没有哪种哺乳动物像你们这样生存:每到一处,尽力耗尽那里的资源,榨干那里的财富,直至那里一无所有,然后和那块地方一起死掉。你们人类繁衍的唯一方式就是换一块地方,重新掠夺。地球上只有一种生物像你们这样生存——病毒。你们人类是地球的瘟疫和灾难,而我们——电脑——是解药。”


Ouch!《黑客帝国》大BOSS史密斯被干掉。图片来源:voiceofcrazy.com

现在我们可以理解了,坏蛋为什么总在控制大局,只需再动一下手指就能大获全胜的情况下,突然变得喋喋不休。其实,他就是为了消除自己作恶时由于内化的道德和外显的行为不相符而产生的认知失调。通过不停地说给自己和别人听,来达到所谓的“认知失调消解”。

不过,这套理论有一个缺陷,坏蛋要想达成“认知失调消解”,自己在心里默默调节消解不就好了嘛,为什么一定要说出来呢?这里就牵扯到心理学的另一个机制:通过获得外部反馈,而提升自我评价。

提升自我评价

从原理上来说,提升自我评价有两个途径:自我效能感,社会认同感。这两个途径都迫使坏蛋们不停地说话。

自我效能感简单来说就是强调“我有我可以”。比如你面前有一堆砖,你来要搬它,可你怎么知道自己搬得动它呢?根据自我效能感的理论,你以前成功地搬过砖、你看过体力跟你差不多的人成功地搬砖、有别人或者你自己来现场分析一下你能搬动砖的十大原因、开一个搬砖动员大会、把砖放在你熟悉的环境里搬,这些因素都能让你觉得自己离优秀的搬砖工更近了一步。

自我效能感的提升,能让人感觉异常良好。坏人也是人,也有人的优点和缺点,要遵循人类共有的心理规律。把众人眼中威风凛凛的正义化身踩在脚下,恶棍们随心所欲地发表自己的高谈阔论:一边回顾自己“光辉”的历史,一边叙述自己“天才”的计谋;一边夸耀自己超凡的实力,一边肯定自己胜利的必然——自我效能感简直要爆棚了。然而这还不够,独角戏不够精彩,一定要有一个配角,甚至一批观众才能让个体获得最大的心理满足感。

实际上,在人类犯罪史上确实有罪犯真的在用极端的方式获得自我效能感,鼎鼎大名的“黄道十二宫”杀手,就曾炫耀性地主动寄给当地报社一些自己编写的密文,而其中的“340密文”的谜底至今仍未揭晓。

而社会认同感说的是人意识到自己属于特定的群体,并且通过群体成员的身份来获得价值和情感意义。对于影视剧中的大坏蛋,在毕生追求的野心即将实现之际,不把这一系列的阴谋诡计全盘托出以便让世人知道自己才是名符其实的头号恶棍?这无异于锦衣夜行,实在会让人太失落了。而这种自我标榜为头号恶棍的做法,本身也是社会认同感极端化的表现。


虽然在《钢铁侠3》电影中只是一个傀儡,不过满大人的噱头还是搞得很好的。图片来源:wikia.com

有限认知:给坏人的会心一击

以上的心理动机导致了坏人总是陷入话痨综合征而难以自拔。而一种很重要的心理学概念仍然悄悄潜伏在草丛中,随时准备跃出来,给他致命一击。这就是每次都能让主角绝境翻盘,逆袭反杀的最好帮手:人类有限的认知资源。

人的认知资源是非常有限的,当我们专注地做某一件事时,不在我们关注范围内的信息很可能就无法有效地进入我们的认知加工环节,从而导致视而不见、听而不闻的情况。1999年,美国心理学家西蒙斯做过一项实验,在向观众播放视频的时候,让一个合作者扮成大猩猩从人群前面走过。至少有一半人会注意不到大猩猩的出现。可以想见,当坏人专注于向已经被打倒在地动弹不得的主人公倾诉,以获得自我满足的时候,他是无法注意到后者行为、姿态和情绪上的变化细节的。逆袭的线索,就这样被忽视了。

坏人,就这样死于他的喋喋不休。由此可见,言多必失、沉默是金这样的古律,至少在电影当中是有很重要的作用的。

最后,让我们一起重温一位敦厚长者的谆谆教诲:一定要闷声才能发大财啊!(编辑:Jerrusalem

今天看新闻,看到一篇比较有意思的文章,于是就复制粘贴了过来。如果侵犯了原作者的权益,立刻删除

原文出处:https://baike.baidu.com/tashuo/browse/content?id=5d5bb1f89a4ef1495c7b2152


被捉住的男人女人,站在大家面前,衣不遮体,形容狼藉,女的抱胸,男的捂下身,被大家用极其下流的眼光来审视:奶不大,屁股不够翘,看起来操得也不太得劲……

微博只要一有人出轨,马上就会爆。

比如今天白百何疑似出轨,连续几个关键词都爆了。“白百何”、“陈羽凡”、“白百何离婚申明”、“卓伟”……先后都成超级热点。

网友一边兴奋地点开视频,期待能发现超劲爆的淫秽色情男盗女娼;

一边板起脸孔,大骂当事人贱货白莲花道德败坏。

我对评论出轨事件已经没有兴趣了。

今天想聊聊,为什么中国人这么热衷于捉奸。

大家应该还有印象,不光白百何,陈思诚、林丹、刘恺威疑似出轨时都是这样。

狗仔一放猛料,大家立即闻腥而动,见色而起,全民抓奸,热情永远澎湃,正义感永远高涨。

而平常,无论哪里发生人命,发生残忍至极的犯罪,哪里有孩子被霸凌至死,哪怕有畜生性侵女童,都不会引发这么多人关注。

人命是次要的,抓奸才是重要的。

与人人息息相关的公共环境是次要的,别人的床上发生什么才是重要的。

NO1

为什么大家会这样?

有三个原因:

1,刺探隐私是有快感的。

2,捉奸往往意味着香艳、暴力、狗血。

3, 围观者既可以满足窥私欲,还能满足道德优越感。

所以,捉奸一直是广大人民群众最刺激、最喜闻乐见、最能唤起全民热情的娱乐活动。

易中天曾经说,“捉奸本身就是一台戏。环境是神秘的,人物是真实的,情节是紧张的,动作是惊险的,悬念是强烈的,高潮则是令人兴奋的。既是真人上场,又不用花钱买票,正可谓不看白不看,还可以打着正义道德的旗号,岂有不看之理?”

是啊,也就只有“骂小三”和“骂汉奸”这两件事,最能体现中国人的道德了。

骂得越凶,自己的道德指数就越高。

骂得不给力,就会引来“你是不是也做过小三”、“你是不是也出过轨”的怀疑。

至于当事人的痛苦与隐私如何,谁还去管那些。

NO2

捉奸在中国,历来都是源远流长,历史悠久。

文艺著作中的不说,就说我们亲耳听闻的……

在我们父辈那一代,村子里一旦听见“抓奸去喽”,所有人都会冲出家门,吃饭的放下筷子,拉屎的提起裤子,正在和老婆嘿咻的翻下床,跟着兴奋的大伙们一起跑去看“奸夫淫妇”。

被捉住的男人女人,站在大家面前,衣不遮体,形容狼藉,女的抱胸,男的捂下身,被大家用极其下流的眼光来审视:奶不大,屁股不够翘,看起来操得也不太得劲……

接着便要他们讲偷情细节。

注意,一定要越详细越好,越下流越好……关键之处,还得讲上好几遍。

“这个交代不详细,不老实,重讲!”

“你这什么态度?知不知错?知错就给我把每一个细节都讲出来……”

当然这时候,小孩子是不能站旁边的。但对于大人,却是超强兴奋剂,整整半年的娱乐生活都靠它了。

正像严锋的微博所说的,“从前,我们村没有什么娱乐生活,最让村民兴奋的文化事件是捉奸,那绝对是全村围观,大家快活很多天。”

谁管对错呀,谁管你是不是老公家暴、出轨在先啊,“捉奸”本来就是浓墨重彩的性刺激,旁观者才不关心是非。

NO3

农耕时代的“围观捉奸”,早已经变成了“微博捉奸”。

场合和方式不同,实质却是相同的。

依然是将隐私揪出,供看客娱乐;

依然是多数人暴力;

依然是以一种道德败坏,对抗另一种道德败坏;

依然是将出轨者拉出来游行示众(从前是广场,现在是微博),然后,全民都来骂娘,吐口水,扔破鞋,将他们浸猪笼,挂上“荡妇”、“婊子”、“渣男”的牌子永远踩在脚下。

于是,隔三岔五,微博上就能看到各色捉奸视频,打小三新闻。

年轻的女孩被人当街剥掉衣服,一群人围着抽耳光,踢裸体,一边打,一边骂,那叫一个理直气壮;

旁人呢,纷纷表情复杂地站在一旁,手机拍照,不亦乐乎。

还有一些女人和男人在酒店,忽然闯进一帮人,有的举着手机,有的扑上去扒掉他们的被子和衣物,整个过程杀气腾腾,完全忘记了“你。正。在。违。法”这回事。

别人出轨,跟你是没关系的。

爱人出轨,你要用合法的手段维护权益。

你可以选择离婚,也可以提出损害赔偿。

但是,无论是拍摄证据,还是捉奸,如果使用了违法手段,比如闯入他人住宅或者使用违禁的拍摄设备,或者殴打了他人,有关证据法院可能不予采纳,捉奸者甚至会受到法律的惩罚。

也就是说,出轨的两个人如果反过来告你,你分分钟要背负法律责任。

NO4

捉奸固然有快感,但请你也记得:

1,这是另一种道德败坏。

2,婚姻是一个漫长的双人博弈的过程。不是你一个人努力,就能确保一生安稳。每个人都可能遭遇另外的爱情。每个人都可能踏进雷区。

在出轨率高涨的今天,你或许就是明天的小三,也是明天的出轨男。

今天你辱骂他人的,明天或许就会反诸于身。

NO5

最后讲一个《约翰福音》中的故事。

文士和法利赛人带着一个行淫时被拿的妇人来,叫她站在当中。

对耶稣说:夫子,这妇人是正行淫之时被拿的。摩西在律法上所吩咐我们,把这样的妇人用石头打死。你说该把她怎么样呢?

耶稣弯着腰用指头在地上画字。

他们还是不住的问他。

耶稣就直起腰来,对他们说:“你们中间谁是没有罪的,谁就可以先拿石头打她。”于是又弯着腰用指头在地上画字。

人们听见这话,就从老到少一个一个的都出去了。只剩下耶稣一人,还有那妇人仍然站在当中。

耶稣就直起腰,对她说:妇人,那些人在哪里呢,没有人定你的罪么?

她说:主阿,没有。

耶稣说:我也不定你的罪。去吧,从此不要再犯罪了。

一、一般在代码中的调用,要么通过id找到,要么直接new出来:

①、调用setTextSize(<数值单位>,<值>)

这里的数值单位可以为下列的几种:

TypedValue.COMPLEX_UNIT_PX
TypedValue.COMPLEX_UNIT_DIP
TypedValue.COMPLEX_UNIT_SP

当然还有不常用的,比如

TypedValue.COMPLEX_UNIT_PT

1 .如果直接使用固定的数值,那么该数值的单位则由上述的几种枚举决定,比如:

setTextSize(TypedValue.COMPLEX_UNIT_SP,16);//就是设置为16sp的大小

2 .如果使用资源文件中的数值,那么请注意,数值单位 要设置为 COMPLEX_UNIT_PX,比如:

setTextSize(TypedValue.COMPLEX_UNIT_PX,getResources().getDimensionPixelSize(R.dimen.你的资源);

 原因如下

* 获取dimension的方法有几种,区别不大
* 共同点是都会将dp,sp的单位转为px,px单位的保持不变
*
* getDimension() 返回float
* getDimensionPixelSize 返回int 小数部分四舍五入
* getDimensionPixelOffset 返回int,但是会抹去小数部分

getDimensionPixelSize在要求不高的情况下也可以替换为getDimensionPixelSize或者getDimensionPixelOffset,具体根据业务需求决定

②、调用setTextSize(<Size>):

这个方法不带单位,Doc的描述如下:

Set the default text size to the given value, interpreted as “scaled pixel” units. This size is adjusted based on the current density and user font size preference.

大意就是,Size单位是px且当设置为某个值的时候,最后会乘一个destiny后显示出来

没例子,也不建议用

二、自定义控件中调用:

①、使用paint直接画TextView:

调用paint.setTextSize(<px值>)即可

②、在declare-styleable中定义size,在xml中设置size,代码中通过TypedArray取出来:

这是比较常见的情况,此时通过调用TypedArray的对象调用getDimension,getDimensionPixelSize 或者getDimensionPixelOffset 方法来获取。同样的,返回结果是以px为单位的

然后,同(一)里面的做法,设置大小即可

继续阅读

前几天遇到一个问题,将uint32_t类型的值放到字典里面传递到下一个vc中。就这么个简单的问题,却踩进了坑。

由于之前主攻java,想当然的就将uint32_t转换成NSString然后丢到下一个vc中,然后要使用的时候再转回uint32_t,然后问题就出现了:转回uint32_t后发现数值不正确。

下面是之前的转换方式:

//uint32_t --> NSString
uint32_t a=2373916479;
NSString * aStr=[NSString stringWithFormat:@"%u",a];//这个没毛病,确实变成了字符串
//NSString --> uint32_t
uint32_t b=[aStr intValue];//这句话有问题

通过上面的代码执行后发现a和b的值不一样,惊到我了!

通过查询uint32_t的定义,发现这货就是unsigned int。然后再回来看代码,觉得没问题哇。。。

然后再转念一想,它是无符号的int,直接转数值会有损。于是将最后一句改成:

uint32_t b=[aStr longLongValue];

虽然执行结果正确了,但是xcode提示了一个警告:

Implicit conversion loses integer precision:'long long' to 'uint32_t' (aka 'unsigned int')

虽然能解决问题,但是这个警告实在是看的很不爽,而且实现起来比较暴力。怎样才能更加优雅的解决目前的困扰呢?

搜索了StackOverflow,突然发现可以把uint32_t放到NSNumber中,再放到字典里面,于是:

//uint32_t --> NSNumber
uint32_t a=2373916479;
NSNumber * aNumber=[NSNumber numberWithUnsignedInt:a];//用NSNumber包裹uint32_t,这样就能放到字典中了
//NSNumber --> uint32_t
uint32_t b=[aNumber unsignedIntValue];//结果正确

经过上面的实践之后,总结一下:

  1. 一切都是基础不扎实导致的
  2. uint32_t本质是unsigned int,如果先转化为字符串再用intValue转回来就会有可能出现数据不正确的情况,而且NSString也没有提供unsingedIntValue,所以使用NSString不明智;
  3. NSNumber是一个可以放到字典和数组中的类型。如果需要再字字典或者数组中存放基本数据类型,可以把所需要的基本数据类型转化为NSNumber后再存入

最近有这么个给图片加水印的需求,把网上的方法基本都试了个遍,最后也就发现一个简单的方法比较可靠。改造了一下,变成了下面这样的:

#define UIColorFromHex(s)  [UIColor colorWithRed:(((s & 0xFF0000) >> 16))/255.0 green:(((s &0xFF00) >>8))/255.0 blue:((s &0xFF))/255.0 alpha:1.0]
-(UIImage *)watermarkImage:(UIImage *)img withName:(NSString *)name
{
    NSString* mark = name;
    const NSString * copyRight=@"©2017 测试公司.All rights reserved.";
    int w = img.size.width;
    int h = img.size.height;
    UIGraphicsBeginImageContext(img.size);
    [img drawInRect:CGRectMake(0, 0, w, h)];
    UIFont * font=[UIFont systemFontOfSize:64];
    NSShadow *shadow = [[NSShadow alloc] init];
    shadow.shadowColor = UIColorFromHex(0x666666);
    shadow.shadowBlurRadius = 5;
    shadow.shadowOffset = CGSizeMake(1, 3);
    NSDictionary *attr_mainContent = @{
                           NSFontAttributeName: font,  //设置字体
                           NSForegroundColorAttributeName: [UIColor cyanColor] ,  //设置字体颜色
                           NSShadowAttributeName:shadow,
                           NSVerticalGlyphFormAttributeName:@0
                           };
    NSDictionary *attr_copyRight = @{
                                       NSFontAttributeName: font,  //设置字体
                                       NSForegroundColorAttributeName: [UIColor whiteColor] ,  //设置字体颜色
                                       NSBackgroundColorAttributeName:[UIColor grayColor]
                                       };
    NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithObject:font forKey:NSFontAttributeName];
    CGSize main_Size1 = [name boundingRectWithSize:CGSizeMake(MAXFLOAT, 0.0) options:NSStringDrawingUsesLineFragmentOrigin attributes:dic context:nil].size;
    CGSize main_Size2 = [name boundingRectWithSize:CGSizeMake(w, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:dic context:nil].size;

    CGSize copyRight_Size1 = [copyRight boundingRectWithSize:CGSizeMake(MAXFLOAT, 0.0) options:NSStringDrawingUsesLineFragmentOrigin attributes:dic context:nil].size;
    CGSize copyRight_Size2 = [copyRight boundingRectWithSize:CGSizeMake(w, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:dic context:nil].size;

    //=======
    //draw main text
    [mark drawInRect:CGRectMake(20, h - 20 - main_Size2.height - copyRight_Size2.height, main_Size1.width, main_Size2.height) withAttributes:attr_mainContent];//左下角
    //=======
    //draw copy right text
    //copyRight
    [copyRight drawInRect:CGRectMake(0, h - copyRight_Size2.height , copyRight_Size1.width, copyRight_Size2.height) withAttributes:attr_copyRight];//左下角

    UIImage *aimg = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return aimg;
}

效果如下:(iPhone 7Plus的大小)

我在这里面加入了两段水印,上面的是要加入的信息,下面是版权信息。

NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithObject:font forKey:NSFontAttributeName];
CGSize main_Size1 = [name boundingRectWithSize:CGSizeMake(MAXFLOAT, 0.0) options:NSStringDrawingUsesLineFragmentOrigin attributes:dic context:nil].size;
CGSize main_Size2 = [name boundingRectWithSize:CGSizeMake(w, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:dic context:nil].size;

这一段代码用来获取要添加的水印字符的宽度和高度。main_Size1的width就是文本的宽度,main_Size2的height就是文本的高度。这里踩过一个坑,之前照抄网上的获取宽度和高度的代码,发现添加上去的水印文字总是显示不全,后来测试了才发现,需要指定一个宽度,假设为x,这样获取到的高度是文本最大宽度为x的情况下对应的高度(汗颜,仔细想想确实应该是这样)。如果将文本的宽度指定为图片的宽度的话,那么基本可以保证文字的正常显示。

[mark drawInRect:CGRectMake(20, h - <height>, <width>, <height>) withAttributes:<Your Attr>];

这一段是最核心的部分,用于将文本绘制到图片上。可以绘制到由UIGraphicsBeginImageContext指定的区域中的任意位置。代码中我设置绘制区域为整个图片,水印设置在左下角。

这里有一个Attributes参数,是一个属性数组。其中可用的属性如下:

  • NSKernAttributeName:设置字符间距,取值为 NSNumber 对象(整数),正值间距加宽,负值间距变窄
  • NSFontAttributeName:设置文本的字体,参数为UIFont对象
  • NSForegroundColorAttributeName:设置文本的颜色,参数为UIColor
  • NSParagraphStyleAttributeName:设置段落格式。参数为NSMutableParagraphStyle或者NSParagraphStyle对象。例如:
    NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init];
    paragraph.alignment = NSTextAlignmentCenter;//居中
  • NSBackgroundColorAttributeName:设置文本的背景颜色,参数为UIColor
  • NSStrokeWidthAttributeName:设置文本的描边宽度。

    这个属性所对应的值是一个 NSNumber 对象(小数)。该值改变描边宽度(相对于字体size 的百分比)。默认为 0,即不改变。正数只改变描边宽度。负数同时改变文字的描边和填充宽度。例如,对于常见的空心字,这个值通常为3.0。

    如果同时设置了空心的两个属性,并且NSStrokeWidthAttributeName属性设置为整数,那么文字前景色就无效果了

  • NSStrokeColorAttributeName:设置文本的描边颜色
  • NSStrikethroughStyleAttributeName:设置删除线。参数为数字。例如:NSStrikethroughStyleAttributeName:@3 表示删除线的宽度为3
  • NSUnderlineStyleAttributeName:添加下划线。参数为枚举类型。可用的类型如下:

    NSUnderlineStyleNone

    NSUnderlineStyleSingle   

    NSUnderlineStyleThick

    NSUnderlineStyleDouble

    设置单下划线:NSUnderlineStyleAttributeName:@(NSUnderlineStyleSingle)

  • NSUnderlineColorAttributeName:设置下划线颜色,参数为UIColor
  • NSShadowAttributeName:设置阴影效果,参数为NSShadow对象。注意这个属性必需和这三个属性NSVerticalGlyphFormAttributeName,NSObliquenessAttributeName和NSExpansionAttributeName之一同时使用才能生效,否则将无效。

    关于NSShadow的用法,如下:

    NSShadow *shadow = [[NSShadow alloc] init];//初始化
    shadow.shadowColor = [UIColor grayColor];//设置阴影颜色
    shadow.shadowBlurRadius = 2;//模糊程度,值越大越模糊
    shadow.shadowOffset = CGSizeMake(2, 4);//阴影的位置。如:设置为CGSizeMake(0, 0)则会直接叠加到文本后方;CGSizeMake(0, 4)则是出现在文本的下方
  • NSVerticalGlyphFormAttributeName:该属性所对应的值是一个 NSNumber 对象(整数)。0 表示横排文本。1 表示竖排文本。在 iOS 中,总是使用横排文本,0 以外的值都未定义。
  • NSObliquenessAttributeName:设置字体倾斜,参数为NSNumber 0或1
  • NSExpansionAttributeName:设置文本扁平化(个人感觉很丑,而且还会影响文本的宽度计算),参数为NSNumber 0或1
  • NSTextEffectAttributeName:设置文本特殊效果,取值为 NSString 对象,目前只有图版印刷效果可用
  • NSBaselineOffsetAttributeName:设置基线偏移值,取值为 NSNumber (float),正值上偏,负值下偏
  • NSWritingDirectionAttributeName:设置文字书写方向,从左向右书写或者从右向左书写。以下是API中的说明:

    NSNumbers representing the nested levels of writing direction overrides as defined by Unicode LRE, RLE, LRO, and RLO characters. The control characters can be obtained by masking NSWritingDirection and NSWritingDirectionFormatType values.

    LRE: NSWritingDirectionLeftToRight|NSWritingDirectionEmbedding
    RLE: NSWritingDirectionRightToLeft|NSWritingDirectionEmbedding
    LRO: NSWritingDirectionLeftToRight|NSWritingDirectionOverride
    RLO: NSWritingDirectionRightToLeft|NSWritingDirectionOverride

  • NSLinkAttributeName:设置链接属性,取值为NSURL对象。点击后调用浏览器打开指定URL地址
  • NSAttachmentAttributeName:设置文本附件,取值为NSTextAttachment对象,常用于文字图片混排

基本就以上这些属性

PS:UILabel也是可以设置以上属性,只是代码不一样而已。关于这个可以参考:http://www.jianshu.com/p/6665c088bd01

之前考虑用MMPopupView来实现弹出式对话框,不得不说这个弹出的效果还是很不错的,可惜我发现使用xib来绘图还是有点问题的,所以想了个另类的办法:弹出一个模态的view controller来充当对话框。

成功实现之后,发现无法改变背景透明度,即弹出动画显示的过程中背景是有透明色的,动画过后就变成不透明了。于是在网上搜索到了这样的解决办法:

参考:http://www.jianshu.com/p/4f7a29bb333f

AppDelegate *appdelegate=(AppDelegate*)[[UIApplication sharedApplication] delegate];

UIViewController *vc = [[UIViewController alloc]init];//这里写你要弹出的vc

appdelegate.window.rootViewController.definesPresentationContext = YES;

view.modalPresentationStyle = UIModalPresentationOverCurrentContext;

[appdelegate.window.rootViewController presentViewController:vc animated:YES completion:^{

vc.view.backgroundColor=[UIColor colorWithRed:237/255.0 green:236/255.0 blue:244/255.0 alpha:0.5];//这里写你需要的颜色,或者透明度

}];

这样基本上就可以了。如果要更加完美的话,可以修改弹出动画的背景透明度,和上述的颜色一致,这样就可以让弹出效果更自然

本文原引出处:http://wpchina.org/how-to-change-wordpress-domain-prefectly-1528/

UPDATE wp_options SET option_value = replace(option_value, ‘<你的旧域名>’,'<新域名>’) ;
UPDATE wp_posts SET post_content = replace(post_content, ‘<你的旧域名>’,'<新域名>’) ;
UPDATE wp_comments SET comment_content = replace(comment_content, ‘<你的旧域名>’, ‘<新域名>’) ;
UPDATE wp_comments SET comment_author_url = replace(comment_author_url, ‘<你的旧域名>’, ‘<新域名>’) ;

上文中是基于phpMySql的,其中有几个注意要点:

0.写在前面:数据库要备份要备份要备份!万一操作失误,那损失就大了

1.一定要选中数据库之后,再去点击右侧上方的SQL选项卡

2.UPDATE 后面的是表的名称。如果在安装wordpress时自定义过表名称,这里要修改成实际的表名称

3.替换前最好先看看wp_options(也许叫别的名称)中的home字段是什么,然后用这个字段值去替换例子中的www.mydomain.com

4.为了防止出错,修改好sql语句之后,最好先点击右下角的模拟查询按钮。没有这个按钮?请检查sql语句是否正确,否则请升级phpMyAdmin。如果模拟查询执行后的结果有错误,说明sql语句哪里有问题,需要一个一个排查直至问题解决。确认无误后再点击执行按钮。

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

至于文中有人评论说:”二级站点只能访问首页,其他还是转跳到原来的域名地址“,我表示这人maybe是改错了什么地方,允悲

我已经按照这个方法更换过N个域名了,貌似还没出过问题