以前发过基于PIL模块实现其他图像处理的文章https://blog.csdn.net/sm9sun/article/details/77703551
今天偶尔在网上看到了一些关于图片转换成字符画的相关内容。
其实这个也蛮简单的,无非就是把原画本身的颜色映射成不同的字符,字符可以按照填充系数排列(比如说@这个字符填充系数最大,.这个字符填充系数最小)从而实现字符画呈像的效果。
通常的做法是按照原画的灰度值来排列,比如说黑色我们用@,白色我们用. (文本的底色是白色的)
图像的灰度值公式:
1.浮点算法:Gray=R*0.229+G*0.587+B*0.114
2.整数方法:Gray=(R*30+G*59+B*11)/100
3.移位方法:Gray =(R*77+G*151+B*28)>>8;
4.平均值法:Gray=(R+G+B)/3;
也可以用convert("L")方法将其转换成黑白图,再求取灰度值参数。
完整代码:
# -*- coding: utf-8 -*- from PIL import Image codeLib = '''@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,"^`'. '''#生成字符画所需的字符集 count = len(codeLib) def transform1(image_file):#黑白图 image_file = image_file.convert("L") codePic = '' for h in range(0,image_file.size[1]): for w in range(0,image_file.size[0]): gray = image_file.getpixel((w,h)) codePic = codePic + codeLib[int(((count-1)*gray)/256)] codePic = codePic+'\r\n' return codePic def transform2(image_file):#灰度值公式 codePic = '' for h in range(0,image_file.size[1]): for w in range(0,image_file.size[0]): g,r,b = image_file.getpixel((w,h)) gray = int(r* 0.299+g* 0.587+b* 0.114) codePic = codePic + codeLib[int(((count-1)*gray)/256)] codePic = codePic+'\r\n' return codePic fp = open('img/nine_sun.jpg','rb') image_file = Image.open(fp) image_file=image_file.resize((int(image_file.size[0]*0.75), int(image_file.size[1]*0.5)))#调整大小,针对于记事本视图 print (u'Info:',image_file.size[0],' ',image_file.size[1],' ',count) tmp = open('img/out.txt','w') tmp.write(transform2(image_file)) tmp.close()
测试样例:
用记事本打开输出文本,选择(宋体 小六)
扫描二维码关注公众号,回复:
1533301 查看本文章
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@-<i!!!lllll!!!>+(@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@QQQQQLi!!llII;;;;;;;;;Illl!!<0QQQQQ@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@QQQQOtUQnI;;;;:::::::::::;;;II\QLu0QQQQ@@@@@@@@@@@@@@ @@@@@@@@@@@@@@QQ_!!lI!Qn::::::::::::::::::;\Q<ll!<xQQQ@@@@@@@@@@@@@ @@@@@@@@@@@@@@r>llI;;:QC:::::::::::::::::::vQ;;;ll!?@@@@@@@@@@@@@@@ @@@@@@@@@@@@@>!lI;;::::::::::::::::::::::::::::;;;l!!_@@@@@@@@@@@@@ @@@@@@@@@@@X<llI;;;:::::::::::::::::::::::::::::;;;ll![@@@@@@@@@@@@ @@@@@@@@@@-i!lli+++~<!:::::::::::::::::::::::><~+~<;Il!<p@@@@@@@@@@ @@@@@@@@@p])-^........':<{~;:::::::::::;~|i,........,<{_i@@@@@@@@@@ @@@@@@@/)>Uz?..............^_;;;;;;;;>|[zY'............."1a@@@@@@@@ @@@@@@|'\dddd,..............')I;;;;;)"Idddd1..............<\@@@@@@@ @@@@@|+.tdddd<<-1)(1}?!:'....?>;;;;l..idddp(>[{)){[i,......!8@@@@@@ @@@@@u1i+1->I;IlIII;;::,,l<+>;;;;;;;<!<|]<,,:;;;;;;;::+})>![#pI@@@@ @@@@@@]li<_-?--_<ilIIIIIIIIIIIIIIIII:::IIIIIIIIIl!>+_-??_il>#kZ@@@@ @@@@@%~~_-][}[[]+<iIIIIIIIIIIIIIIIIIIIIIIIIIIIIIi<+?][}[[?_+)*o@@@@ @@@@@(<~+-][[[[]+<illIIIIIIIIIIIIIIIIIIIIIIIIIIIi<+?][[[[?_+_&%@@@@ @@@@@?>><~__--_+<i!lllllllllllllllllllllllllllll!!>+__--_+~<<wB@@@@ @@@@@+>ii!ii>>ii!!!lllllllllllllllllllllllllllllll!!ii>>>ii><r@@@@@ @@@@@~>i!!!!!!!!!!lllllllllllllllllllllllllllllllll!!!!!!!ii<f@@@@@ @@@@@+<iii!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!ii><n@@@@@ @@@@@?<iii\1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!x!!ii>~C@@@@@ @@@@@)~>>i{X!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!/iii><+@@@@@@ @@@@@L~<>iiL|iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii?_ii><<1@@@@@@ @@@@@@}<<>i)Qiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii~Lii><<~w@@@@@@ @@@@@@w~<<>!j(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii?QXi>><~~@@@@@@@ @@@@@@@~~<<>!QX<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Qcl>><~~]@@@@@@@ @@@@@@@|~~<<>_LQ>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>(Q1l><<<~_&@@@@@@@ @@@@@@@@(+~<<>l|Qv+>>>>>>>>>>>>>>>>>>>>>>>>>>>><QQxi<<<~~_W@@@@@@@@ @@@@@@@@@f~~~<<i1LQx+>>>>>>>>>>>>>>>>>>>>>>>>tLQtl!<<<~~+@@@@@@@@@@ @@@@@@@@@@_+~~<<iliQQQf-<<<<<<<<<<<<<<<<<<\UQQv<i<<<~~++/@@@@@@@@@@ @@@@@@@@@@@)++~~<<<ll[QQQQYx}-~<<<<<[|rQQQQY)l!<<<~~~+-b@@@@@@@@@@@ @@@@@@@@@@@@W+++~~~~~>ll!fYQQQQQQQQQQQQr{>l!i~~~~~~++_@@@@@@@@@@@@@ @@@@@@@@@@@@@o]++++~~~~~~i!lllllllllllli><~~~~~~+++_c@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@B+++++~~~~~~~~~~~~~~~~~~~~~~~~+++++]@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@h1_++++++++~~~~~~~~~~~++++++++_X@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@Bn?__+++++++++++++++++++__|b@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@pf____+++++++++____UB@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@WOXrf/frCb@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
...................................................................................................................................................... ...................................................................................................................................................... ...................................................................................................................................................... ...................................................................................................................................................... ...................................................................................................................................................... ...................................................................................................................................................... ...................................................................................................................................................... ...................................................................................................................................................... ..........................................................''.......................................................................................... ......................................................''.`~,........''..',^'``........................................................................ ................................................''i;':;'.'''```'..'`l!:`;~i!<l"'...................................................................... ................................................`:\['.`-)I'',"'.....''...''.''........................................................................ ................................................'..>+''-l:.......`''',;:!,`'..'....................................................................... ................................................[f>_''.'..'''';.^,.''+1_>~^''`'....................................................................... .............................................'"'I/<.''``':"''`^II'i;".'............`.................................................................. ......................................'.;....''.'>;>I\)`'`^'...'^.''";^;''.'.......`.................................................................. ......................................'..`'....'`|t\IIi^........,`..'``........'...................................................................... ...................................."'.,'''.'.<t<i/([''~:'....'.'lI!^l"'''..'`'..'.;`'................................................................ ..................................''!'`'l'`':'.`|_,``'`''..'^"``?|(|}!;'''...`^"`'`''................................................................. ..............................'....^;':...[`.;]);|1i,'.^;'.^[]:::"]+>>i:,,`'.'",,"'................................................................... ...........................",x:''...'.'''^'i]^'"I[;f.^!`''....`;"",^''................................................................................ .........................'''1v|"''...'.^;,I'^:'..',*@BmI.'.''....'.`.''....''..............''umC`..................................................... ...........................;(r\l.!''''";l`''.'`.`t_f@@@@@8...'.`^```......................d@@@@@@@B''................................................. .........................:`!|/:i~''''.;,''.''!';)fj`d@@@@@c.`'..........................-@@@@@@@@@@@B................................................. ........................'.'^',\1,~.`!'...,`''^}{{I)?~w@@@@&@@@''..................'....B@@@@@@@8@@@@@k...............'...`.'.......................... .......................''';)}x?1(`)~'....'^l,:l.'l<"'@@@@@@@@@@@B.................xu'.B_...l-...B@@@@%..........'.^:;'I!ruxXunr?^..................... ......................'.'^:]{'""<vYv.'....`'_..'`'.!B@@@@@@@@@@@@@................'@B@8'........B@@@@%......''+[-1xY0COZZZJdwkdZQcl`'................. .....................i,Il'`.;`"!,vn|{..'^"~..i,.j@@@@@@@@@@#.B@@@B.................B@@@'........B@@@@\.''',?jrvCLJwkUbhamQp#&W#hqk0c>................. ....................'.`'''i':+['[ux1}_,''<.';%@@@@@@@@@@B...B@@@@..................@@@@v..'''...B@@@@l'i}//czvZbbpho*WWWMb#WW&&&WWp0n>................ ..................''''.[^'`'?x+t_;x[jll'd@@@@@@@@@@@@@@W...(@@@W...................B@@@?`B@@B`..B@@@@f(tYcYQZZqh###M#W&&&WM&W&&8W&MapX|'.............. ..................."'>f)|?'!;1v\.-,?;`,'.]@@@@@@@:@@@@@...(@@@B....................B@@@@@@@@@@0.B@@@@zjYO0qZ0Ydb*WWMWWW&WW&&&W&&&8W&MmX<.............. ..................".';,<[.'^^t)'``,I{}>'>^'._[...@@@@@....@@@@...................."@@@@@@@@@@@{.B@@@@vYCZqqbkhaMMMWWWWWWWWW&W&8W8&8&8hC\\'............ .................`^_`,\1"':.+\`:!"`!xf+(]!......w@@@B....%@@@].....B..............l@@@B@@@%u....@@@@@zJzzdbhaaoWWWWW&&&8&WWW&&88&&&8&M*OYuI........... .................i<'Ir,>^(jt\[^..;,/ufx(]I'^...~@@@@....'@@@r.......k.............>@@@\........'@@@@@zcJUwZdo*o&M&&W&8MWWWWMW&&WWW8&&&WamU1'.......... .................'`i'>f>f[,v|'^'..+/xxj[!+;'..h@@@@'....@@@@........J8............I@@@`........'@@@@@uvuQLpkhoMMW&WMMWMMMWMWWW&WWW&WWWWWdZvI.......... ..................'.|,':/txr>`.'.'[_l\!`i!^..h@@@@[....n@@@Y.........@@L..........'@@@....'+'...@@@@@tUQQqdhk##MMWWMWM#WWWWWWWWWW&&W&&&W#kLf;.'....... ..............._j?/xcr>`!|r1'};".I::)[lIX;'.B@@@@......z@@@..........@@@B..........B@@h@@@@@@B,'@@@@@YCQObkk*##MMWMMMWMMMWMWWWWW&&W&&&W&Mhmrl......... ............'.'|cnr}`\]`I'l:"'^`'~"I)}<~|B%@@@@B.......<@@@@}......_@@@@@@l........B@@@@@@@@@@@}@@@@@/vJzddo#MM##MMMMWMMMWMMWWW&W8&&88WWW#mri......... .............'"~f?``+,':+'''.:~"!'._j:'>'@@@@@..........\@@@@@@@@@@@@@@@@@0........l@@@@@Bh).v@@@@@@@jtzQ0do*MMMMMMMWWMWWMW&WWW&&&&&8&&&&#dn)'........ .............':'.^?||^_It/[';]'`'~jtt]!<..|?..............B@@@@@@@@@@@@B,...........>%B{...'..h@@@@@%/nrXCZpo*o##MMWMMWWWW&WW&&&&W8&&&&WWMpXx`.'...... ..............``'';r|.''nr\''I`(\~fr|?I:.......................`li'............................B@@@@/\/fu0Zwba*M##WMWWMWW&W&&&&&W&&8&8&&WWawx>........ ..............^.".>;'I!.|f;)ru?v)`jx(>'........................................................-@@B"+_/txCQmdho#*MMWWMWMWWW&&&&8W&&8&8&&&&#Oci'....... ..............;''``~l~^`l1`rUUXYzvYx|~-`........................................................Z|'",+(1rYOwbhao*##MMMMWWM&&&&&&&&W&&&&&&&MqJ<'....... ..............(,(\f(.,`^~!'/x/,1rvnj+)~`...........................................................`"!|1vULmqba###MMMMWM#WW&WW&&8W8&&8&&&W#Zv:........ .............'''~'+t^.^';^'','`tfYzvI[~.............................................B@a`...........'^:~(1rULmd*#MMW#WWWWW&&&&&W&88&&8&88&WM0|'........ ............'Ifl'IzuI^~';,`.};\vnQYY()[email protected]@@@L'..........'^lI))tzZqoMMMWMWMMW&&&&&&&&W&&W88&&W&Mdv'.'...... ............'`-/f(Yz?:cUu1,!}\vJUO0Lu|?'..............%@@@@@@J......................+@@@M...........'^:<_)tX0ma*MWWWWWWW&WW&&WWWWW&&&&&WW&MpzI'....... .............:`iI'I!]j\CLu`jc;,CcqZ0nf-'...........'@@@@@@@@@@'.....................d@@@@B`........k@B8-_/jvOwa##WW&W&WWW&&&&WW&&&&88&&&&WWqz;........ ..............`!`:)}]l{zv)^;zJJwOQ0Ocf[.........M@@@@@@@@@@@@d.................tbu&@@@@@@@a..c@@1?@@@@@@v})cJZo##MWW&W&W&W&WWWW&WW&W&WW&WWWQt`........ .............I''l<]_'I",{`'1[_YmJm0Czr1..'......./@@@@@@@@@@....................X@@@@@@@p'....B@@B8b.%@@U()zQZo#MMWWWW&W&WWWWWWWW&&W&&&&&&MbJ-'....... .............`.`it+!.`''itlICwpbppqwJXf`.'..........0@@o@@@Q......................U@@@@,^.....B@W'...%B@f|/cCm*##MMWW&WWWW&&&W&&WW&W&&&&&�v'.'...... .............`.I,'|{.''fjr;[UdbdkbdwUufi...............8@@B.......................t@@@@@@@Bh.'%@}'1..%@@](1jUOoM#MWMWWWWW&W&&&WWWWWW&&8&WW*v<'........ ................`'|?_I.`UX`!ZhbdbdbwCxv{'..............@@@h..................b..:@@@@@@['@@@8`%@@@@@a@@B>]/xCqo#MMWWWWW&M&&&&8&&&&W&&&W&WW*r,......... ..............`.)`jf',"?UOY_ZbahhhhbQXJf,'............w@@@@B.................B@BC'`(XL_.,@@@l'%@@@@@OB@&+ffcwaM#MM&WW&W&&&&&WW&8&&&&&&WW&Wh]`'........ ..............'.}xuUz,njLZt^LdoaohhdwOLz-.......!OMB@@@@@@@@@Z...............i@@BC@@@@@~U@@o.B@@w'@B'B@w[1rQwh##MM&&MW&&&&&&&&&&&&&&&&&WMMw)'......... .............`+I-fivLZQcZkqnnboohaakbqOU/;....@@@@@@@@@@@@@@@B................;B@.'W@@h.%@@'@ZB@'&@'^BBq]\v0haoMWWW&&&8&&&W&88&8W&&&&WW&W*Y`''........ .............'!x?`',?Y+YwhamQo*#*aohdkqwYt....@@@@@@@@@@@@@@M..................8@'X@@%h%@B..b:BB'%@@O*@0{/cZao#MMWWWWW&&&W&&&&W88&&&&&&8W*x........... ...............<?I"zw<:I)Lo#o####ohoakbqZU)'...zB'1Y'.#@@@@Y...................!@@@@@@@@@Y..#!%@.&@@Bz@dj\Cdho*MWWWW&&&&WW&&&&&W&&W&&&&WMk1'.......... ...............".`._vX)]Jpo#*##M*oo*aahbwZc~....l@@BBB@@@@......................%@@@@@|.'....@@B..8@%c@btcLaaoMMWW&WWW&W&&&&&W&&&&88&&&Wo0"'.......... ...............'i,jI^nrf_Xa#*a##M#*aohkbpwZu}'....M@@@@@@.......................`0`,@@@@@@@[email protected]@Q!f@#tUmdo*#WMW&&&MWWW&&&WW&8%&&&&W&Whr'........... ................+-)u>uvx^/mo*#*o##*o*ahkahpZC{,...>@@@@@@dLLmoBB@'..............Q@@@@@r.'.'''%@@@@:~-u@8Ywpho#*#MMWWW&WW&&&&&&&&WW&&WWWMY/............ ...............''r;Xv`:<'|QhhoLoo####**oaabbqCt"B@@@@@@@@@@@@@@@@@;........>ZB@@Bb"'@@/......B@`@@<}}\@Bqhao#MW&&WWW&888&&&&&&&&&&8&&&Mon,............ .................xCLzcvY~JL{baa#**o#ooo*aaap@@@@@@@@@@@@@@@@@@@@@@@1......h@@@*`...`@@r.....'@B',W@o|u@@qh#WWW&&&W&&&&88&8&8&88&8&8&&&Ww|`............ ................."YLc;!OwCJX0moMMM*#Mo*o*oab#@@@@@@@@@BOf!^``">C8@@@......'^[......'@@]....+%@^;!]#B@@@@oWM&&WW&&&888888&&8&&&&888&&&WMx``............ ..................|xl+'rwO"Cda#MMMMM#M##**oakw@%OYf!.'..............................B@.....'@;i-[}|Z@@@@aWW8&W&&&&&888&8&88&&&&WW&&8WMq~'............. ..................'//}jfzOX1}p#MWMMWMWWM##*##hwZZ0Lv}~..............................'%...',I~{1{\rzmpB@@*WWW&&W&&&8%8&8&&8&888&WW&W&Mbr............... .....................'"''Cqz?d#MMWMWM&WWMMM##MohdZO0Lv~''..............................'"I__1/jvz0bho#qwW&8W&&88888&88&&&&&&&8&88&&&#j`.'............. .....................)].([Cc'ZoMWMM#MWMM###M*M#**kqZZOU||i^^'........................`,>~?(rxXLwkho##MMW&8&&88&888&&&8888%88%%8&&WWoY^'............... .....................)f-,lvOZQjOoMMM*#MMMWW####*oohdmZZOQc(1_,"^''.'.........'''.,;<~l]/trzJZah**#MWWW&88&&&%8&8%8&&&8%%%8%%8888&&Mdl'................ ......................,Ir|,jZL_\baMMMMM#WWWWMM#M#o*hahdZZOmZz|{-~i>i,^`^`'^,"!l><]11ttxuJmbkho*#*oW&&&&&&&888&&&888888&88888&&&&&&pn.................. ......................'_>.1I{-xqhhhMMWMMWMWWM##MM###*hbpwOmmQJYJYrtr{-]/}{-[r1j/|xzYLQwqdhhoo#M#WWW&&&&8&8&&WW&88888&8&8WW&&W&&WMbf^'................. .........................~:}l;<JO\<wMM#WWWWWMMWM#MMWMM#oaabpwmZwmwqwZQ0QCJQUCCJmqmqpbdahao*#WMWW88&8&8&8&&888888W88&8&W&&&&MWWW#k\'................... .........................`"'`_1{<:)m#MMMMMMWWWW&&WMMWMWW###*ohbakdpppbppdbhdpdpdkkahaoo###M#MWW&&&&&8&&&&&&&&8&&W&WM8&888WWWWMaC['.................... ..........................'''`(;<cUUmo##WWW&W&&&W&&&MWMWWMWMM##oo*ooaoo**##a**o#a##MM#MMMW&&888&&88&888888&&&&&88&88&8W&W&&WW#0_.'.................... ...........................'l^'.'.\uXlk#MWWMM####WWWWWWWWWMMMMWM##*#MWMMoMM#oMMMMMMMMWMW8&88&&&&&8888&88&&88W&&8W8&88888&&&WhJ:'...................... .............................;]l\-''vwCkah#WWWMMMWMMMWWW&W&&&WWWWMW&MMMMWWWWWMMW8&&&MM&&&&&888&888&WW&8&W&W&&8&&&8&8WW&&&WM*ri........................ ..............................^t^l>iXCQY{YmdoMMMWWW&WW&WW&&&WWWW&MMMM##oo##MMWWM&WM&&&&&&888&&&8&88WW&W&&&8&88888&&&W&M&8Mo).......................... ...............................`,,,/)`:,^..`1dMW&WWMMMMW&&&W&WW&&WWW&WM&&WWW&&W&8WWW&8&888&&WWWWWW&&&&&W&8&88&8888W&&WM#azf'.......................... ...............................'.._'`|:^'.?)'vdhMWM&MWW&&8&&&&&&&&&8W&&8&&WW&W&&&&&&MW&&&W&WWWMMWWW&&8&8&%88888&&888&MkO1^............................ ..................................''.`.''`'^_]'Qo##WWW&WM&&&WMWW&&W&&88&W&WW8&&&8W&WMMMMM#MMWWWW&8%88%8%%%8M&&&W#*##*w]^.............................. ...........................................`[_Om_rOp*#WWWWMW&WMMWMMWMWWW&&W&&MMMWWWMMMW&&&888&&&888888&&&&WWMM**aamz+................................. .......................................'.'"jnJJc,UQljk*MWWMWWWW&WWWMWMWWMWWW&&&WMM#&%%&&88%8&8&&&&W8&WW&MMM#***kmX~'.................................. .........................................''':~vcfI!qp*MMM#MMWMWWMMMMMWWWMW&&WWW&&%8&W88&88WW&WWWWW&MWMWMMMM#ohL(:'.................................... ...........................................'1/I'z/_OdqwMMMWMMMM##M#MMMWMWWWW&&&8M&WWWWMM#MWMWWWMMMWWWMMMW&*dX[''...................................... .............................................;xcCUXUphooa#hko#MMMMWMWWMMW&WWMWWMWMMMMMMWMMWMWWMMMWWWM#M*qX|''......................................... ...............................................`i)tutlmOOUc;+mpqmko##W&WWWMWWWMM#MMMMM#MMMM&&&WWMM#od0c{.'............................................ ...............................................'..."+|{~x;_Yn!{':<?cCpaMWWMMMMWM####M#*#M&&&WWMoq0U}i''.'............................................. ...............................................'....'.'`I1/f\-''..''"^<Ca#WMMMM#MM#*WWWW#MM#kmY]^''..'................................................ .........................................................''''...........Uwo*#M##*ohhkbqOQUf<'''....................................................... ........................................................................'+(xuUXYXvf{>,''`'............................................................ .......................................................................................''............................................................. .......................................................................................''............................................................. ...................................................................................................................................................... ...................................................................................................................................................... ...................................................................................................................................................... ...................................................................................................................................................... ...................................................................................................................................................... ...................................................................................................................................................... ...................................................................................................................................................... ......................................................................................................................................................