Happy New Year 2016

Jan 3 2016

web

20 萬張的電影海報;剛上映的星際大戰第七集;有點兒不太冷的聖嬰年冬天; 有整套專業星戰服的兩位小堂弟;再加上剛好遇上了一年一度的節日… 做點什麼吧? 於是,這 20 萬張電影海報成了資料庫,弄了張蒙太奇照片,祝大家新年快樂~

更多 Star Wars 7 的遊行照~

以下的內容,已經與恭賀新年無關,僅是簡單的側寫下來製作的過程,慎讀(tl;dr)。

電影海報哪裏抓?

電影海報,是在 MoviePosterDB 抓的。 當然,你也可以選擇別的來源,CineMaterial 就是個更好的選擇。 做法很陽春,先跑 get_html_pages.sh 去一頁一頁 html webpage 存下來, 我抓了約 12,000 頁,為了節省點時間,於是搭配了 GNU Parallel,但還是花上了點時間 = =;

parallel ./get_html_pages.sh {} ::: {1..12000}

接著,就是去從一頁又一頁抓下來的 html webpage 裏頭,抓出這些電影海報縮圖的 URL, 然後餵給 wget 來幫忙抓下圖片來。 為了非常省事地直接從 html webpage 裏頭得出 img url,我使出殺手鋤 pup

pup is a command line tool for processing HTML. It reads from stdin, prints to stdout, and allows the user to filter parts of the page using CSS selectors.

Inspired by jq, pup aims to be a fast and flexible way of exploring HTML from the terminal.

跑跑以下的程式,就有約 20 萬張的電影海報縮圖在你的 jpg_thumbs 目錄下了。

for i in {1..10000}; do ./get_thumbs.sh $i; done

製造蒙太奇照片

蒙太奇照片,漂亮一點的說法,叫 Photomosaic, 有個非常不賴,而且歷史久遠的 open source project 非常適合處理這個任務:metapixel。 很遺憾地,metapixel 已經無法順利地在 OS X 下 compile 了, 過去似乎可以的樣子,而且因為年久失修,似乎就整個被 homebrew 也移除在外了吶! 還好我們的世界是非常的大,有心人士也很多,有人提出 patch 來修正。 我順手把 patch 檔也保留下來了一份

先透過 metapixel 對所有的電影海報縮圖,計算出一些 parameters,方便之後做 similarity matching 使用。 這邊我使用 96x144 的原因很單純,只是因為目前常見的(而且抓下來的也是)的電影海報比例~

根據 IMDb 以及 Standard Poster Sizes 這兩邊的文章指出, 目前電影海報最常見的比例是 24”x36”, 27”x40” 以及 40”x60”。 有趣的是,裏頭的 40”x60” 是所謂的 Bus Stop Poster

換算一下,上頭這三比例,最接近的比例,差不多就是 1:1.5。 再配合上自 MoviePosterDB 抓下來的圖約都是 100x14x 左右, 我私自設了個比較漂亮的數字 96x144,它也是 1:1.5 :)

mkdir -p small
metapixel-prepare -r ./jpg_thumbs/ ./small --width=96 --height=144

接著,就是一連長串的實驗,找出一個讓人偏愛的結果出來了。 以下是我使用的參數。我使用了 cheat,這個數值非常的有暴壞力,建議在 15 以下,慎用。

metapixel --cheat=5 --scale=4 -w 48 -h 72 --library=./small --metapixel starwars_2015.jpg output_x4c5w48.jpg

PS. 我有提到,metapixel 實作了我非常尊敬的 Dr. Adam Finkelstein and Dr. David H. Salesin 的論文嗎!

借用 Google Maps API 來呈現

最後產生出來的圖檔 output_x4c5w48.jpg,解析度是 10416x12096, 檔案大約約是 23MB。 我非常希望讓充滿好奇心的人,有機會可以 zoom in 進去瞧瞧有哪些電影海報, 於是我找上了 Google Maps API。 偷懶如我,借用了 GMap Image Cutter 來協助切圖兼產生網頁。 於是,最終結果就出來啦

一些小 scripts

comments powered by Disqus