从Wolfram服务器获取DC comics卡通人物数据

来源:互联网 发布:21分钟mysql入门教程 编辑:程序博客网 时间:2024/04/29 22:55

背景知识

DC comics是美国时代华纳旗下DC娱乐下属的一个漫画图书出版商。超人、蝙蝠侠之类漫画的始作俑者。

在Wolfram的目前为止3750个PopularCurves数据中(全部下载数据有2-3GB之巨!),其中有248个图片专属于DC comics里的漫画角色。

因为248个数据图片信息小于250MB,容易处理,这篇博客介绍如何下载这248个角色的包括图片在内的信息,尤其是显示其中的图片。

代码实现

预备条件

想要下载这些数据,首先要确保自己有一台可以正常连接到internet的电脑,电脑上安装有wolfram的经典产品Mathematica最新版10.1. 因为数据有数百兆之多,所以,请确保足够的网络带宽。考虑到图片数据处理的问题,您的电脑的内存不能太小。

废话少说,直接上代码吧。

下载原始图片数据

这里的代码下载DC Comics数据中自带的图片信息并显示,最后再把它们合并在一个GIF动画文件中。

ClearAll["Global`*"];dcComics=Quiet@Check[EntityValue[EntityClass["PopularCurve","DCComics"],"Entities"],50];While[NumberQ@doComics,dcComics=Quiet@Check[EntityValue[EntityClass["PopularCurve","DCComics"],"Entities"],50]];nCharacters=(Dimensions@dcComics)[[1]]If[!ValueQ@dcImgList,dcImgList=ConstantArray[0,{nCharacters}]];Do[dcImg=Quiet@Check[EntityValue[dcComics[[i]],"Image"],50];While[NumberQ@dcImg,dcImg=Quiet@Check[EntityValue[dcComics[[i]],"Image"],50]];dcImgLabel=Quiet@Check[EntityValue[dcComics[[i]],"Name"],50];While[NumberQ@dcImgLabel,dcImgLabel=Quiet@Check[EntityValue[dcComics[[i]],"Name"],50]];dcImgList[[i]]=Labeled@@{dcImg,ToString@i<>"."<>dcImgLabel};Print@dcImgList[[i]],{i,1,nCharacters}];(*每下载一幅图片都显示它*)(*把全部图片导出到一个GIF动画中,*)Export["dcComics.gif",dcImgList,"TransitionEffect"->Background,"TransparentColor"->White]

到此为止,得到的这个GIF往往需要用gifsicle或convert之类处理才能正常使用。我用gifsicle处理的时候用的是这样的命令:

gifsicle dcComics.gif -d120 "#0-247" > final.gif

结果是这样的:
这里写图片描述

下载图片的参数方程信息及其个性化绘制

默认的DC Comics的图片数据中都有一个“十”字形的坐标轴,很难看。鉴于每幅图片都有自己的参数方程和参数区间的信息,可以获取这些信息之后,自己画一个纯净版的出来。比如,第142号图片女记者、超人嫂Lois Lane,代码如下:

mCurve=142;(*获取第142幅图片信息并用参数曲线方式单独显示它*)mhp=Quiet@Check[(EntityValue[dcComics[[#]],"Properties"])&@mCurve,50];While[NumberQ@mhp,mhp=Quiet@Check[(EntityValue[dcComics[[#]],"Properties"])&@mCurve,50]];mhe=Quiet@Check[EntityValue[dcComics[[mCurve]],mhp[[10]]][t],50];While[NumberQ@mhe,mhe=Quiet@Check[EntityValue[dcComics[[mCurve]],mhp[[10]]][t],50]];hdom=Quiet@Check[EntityValue[dcComics[[mCurve]],mhp[[6]]],50];While[NumberQ@hdom,hdom=Quiet@Check[EntityValue[dcComics[[mCurve]],hp[[6]]],50]];mlabel=Quiet@Check[EntityValue[dcComics[[mCurve]],"Name"],50];While[NumberQ@mlabel,mlabel=Quiet@Check[EntityValue[dcComics[[mCurve]],"Name"],50]];Print[Style[mlabel,Red]];ParametricPlot[mhe,{t,hdom[[1]],hdom[[2]]},PlotPoints->1500,PlotStyle->{Blue,Thickness[.002]},Axes->False]

图片如下:
这里写图片描述

总结

主要解决的问题

主要学习了处理下载中的time out exception的办法。

可能的问题

如果不能连接到互联网或wolfram server故障,上面的下载用代码将无法正常工作。如果数据有更新,则实际的数据个数可能不是现在的248个,142号图片也可能不是Lois Lane。

0 0
原创粉丝点击