从Wolframserver获取DC comics卡通人物数据

时间:2021-02-13 19:56:54

背景知识

DC comics是美国时代华纳旗下DC娱乐下属的一个漫绘图书出版商。

超人、蝙蝠侠之类漫画的始作俑者。

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

由于248个数据图片信息小于250MB。easy处理。这篇博客介绍怎样下载这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

结果是这种:

从Wolframserver获取DC comics卡通人物数据

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

默认的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]

图片例如以下:

从Wolframserver获取DC comics卡通人物数据

总结

主要解决的问题

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

可能的问题

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