Python---如何實(shí)現(xiàn)千圖成像:初級(jí)篇(從圖片爬取到圖片合成)

千圖成像:用N張圖片拼湊成一張圖片。
實(shí)現(xiàn)原理:先將所要成像的圖片轉(zhuǎn)化成馬賽克圖片,然后從圖庫(kù)中用對(duì)應(yīng)顏色的圖片替換相應(yīng)色塊。
圖庫(kù)中的圖片處理:標(biāo)記圖庫(kù)中每張圖片的混合顏色,用于替換目標(biāo)色塊,并記錄每張圖片的特征用于成像,增加成像質(zhì)量。


0,起源

德萊文

圖片局部
英雄聯(lián)盟-微博

很久前在刷微博的時(shí)候看到了這條,被他給震撼到了,圖片是由LOL近千張皮膚圖片組合構(gòu)成的(難道這是用ps做的,還是一張張拼的,應(yīng)該不可能吧),就在昨天突然就想起了這個(gè)事,就決定也做一個(gè),隨即便展開(kāi)了行動(dòng)。搜到了這篇文章,看了下圖片的構(gòu)成,決定先取得所有皮膚的圖片再說(shuō)吧!便又開(kāi)始了爬蟲(chóng)

  • 運(yùn)行環(huán)境:Python3.6.5 , pycharm-2018-1-2 , win10

愣著干嘛,快往下看

1.爬蟲(chóng)思路

  • 皮膚圖片的來(lái)源問(wèn)題,首先到官網(wǎng)去找了找,想到了道聚城皮膚專賣(mài)區(qū),其中正好有所有我們需要的圖片。
    皮膚圖片來(lái)源
  • 通過(guò)F12鎖定圖片取得了第一張圖片的URL,(https://game.gtimg.cn/images/daoju/app/lol/medium/2-122015-9.jpg
    取得URL
  • 以此類推便可取得多個(gè)皮膚的URL,發(fā)現(xiàn)只有圖中紅框處不同


    URLS
  • 嘗試這改變紅框內(nèi)的數(shù)字(玄學(xué)),在改變后三位(122015-->122001)時(shí),獲得了另一張諾手的皮膚,基本可以確定后三位為皮膚編號(hào),前面的數(shù)字為英雄編號(hào),且皮膚編號(hào)必須為三位,這一步得感謝這位博主,讓我更加確定了這個(gè)規(guī)律的可行性。(這一步花了好久)
  • 看到這里你可能會(huì)有所疑問(wèn),為什么不直接正則獲取所需圖片的URL呢?為什么要大費(fèi)周章的尋找規(guī)律?因?yàn)檫@個(gè)翻頁(yè)式網(wǎng)站比較特殊,在翻頁(yè)時(shí)URL并不會(huì)改變,所以無(wú)法通過(guò)常用方法獲取所有皮膚,那估計(jì)又有人要提出使用selenium庫(kù)來(lái)模擬人使用瀏覽器獲取所有圖片,但是這會(huì)造成爬取圖片的速度大大下降,只能作為下策(在這過(guò)程中了解到了八爪魚(yú),發(fā)現(xiàn)其原理類似于selenium,是模擬人操控瀏覽器,速度也是不容直視,雖然它能爬取近98%的網(wǎng)站),在博主能力有限的情況下選擇了尋找規(guī)律之旅!
    如果你有好的方法解決這個(gè)問(wèn)題,可以在評(píng)論處提出,十分感謝!
  • 接下來(lái)在知道了規(guī)律的情況下,那么如何獲取每個(gè)不同英雄的編號(hào)呢?在其他博主的引導(dǎo)下,發(fā)現(xiàn)LoL資料庫(kù)中有所有英雄的頭像,通過(guò)F12的慢慢查找,發(fā)現(xiàn)了這個(gè)js文件!
    Network

查看其preview,便可得到所有英雄編號(hào),并測(cè)試發(fā)現(xiàn)可用!比如Ashe艾希的第一個(gè)皮膚對(duì)應(yīng)編號(hào)按規(guī)律應(yīng)該是22001,所以URL就是https://game.gtimg.cn/images/daoju/app/lol/medium/2-22001-9.jpg,測(cè)試發(fā)現(xiàn)確實(shí)成功了!

preview

  • 好了,到此為止網(wǎng)頁(yè)分析到此結(jié)束了,終于可以編寫(xiě)代碼了!

2,代碼框架

  • 1,獲取英雄編號(hào)及皮膚編號(hào)(說(shuō)明:關(guān)于皮膚編號(hào)并未找到每個(gè)英雄皮膚的數(shù)量,所以設(shè)置成查找所有001到015的圖片,當(dāng)然也可以更多020也行)
  • 2,將編號(hào)導(dǎo)入圖片URL(https://game.gtimg.cn/images/daoju/app/lol/medium/2-******-9.jpg)中,生成Url_list。
  • 3,根據(jù)URL來(lái)下載對(duì)應(yīng)圖片,并保存到本地。

3,完整代碼

import requests
import re
import os
# # # # # # # # # # # # # #
# title:獲取LOL英雄皮膚圖像  #
# author:簡(jiǎn)書(shū) Wayne_Dream  #
# date:2018-7-5           #
# 轉(zhuǎn)載請(qǐng)注明出處?。?!       #
# # # # # # # # # # # # # #

def getHero_data():
    try:
        headers = {
            'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
        }
        url = 'http://lol.qq.com/biz/hero/champion.js'
        r = requests.get(url, headers=headers)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        text = r.text
        hero_id = re.findall(r'"id":"(.*?)","key"', text)
        hero_num = re.findall(r'"key":"(.*?)"', text)
        return hero_id, hero_num
    except:
        return '臥槽,獲取英雄編碼失??!'

def getUrl(hero_num):
    part1 = 'https://game.gtimg.cn/images/daoju/app/lol/medium/2-'
    part3 = '-9.jpg'
    skin_num = []
    Url_list = []
    for i in range(1, 21):
        i = str(i)
        if len(i) == 1:
            i = '00'+i
        elif len(i) == 2:
            i = '0'+i
        else:
            continue
        skin_num.append(i)
    for hn in hero_num:
        for sn in skin_num:
            part2 = hn + sn
            url = part1 + part2 + part3
            Url_list.append(url)
    print('圖片URL獲取成功')
    return Url_list

def PicName(hero_id, path):
    pic_name_list = []
    for id in hero_id:
        for i in range(1, 21):
            pic_name = path + id + str(i) + '.jpg'
            pic_name_list.append(pic_name)
    return pic_name_list

def DownloadPic(pic_name_list, Url_list):
    count = 0
    n = len(Url_list)
    try:
        for i in range(n):
            headers = {
                'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
            }
            res = requests.get(Url_list[i], headers=headers).content
            if len(res) < 100:
                count += 1
                print('\r當(dāng)前進(jìn)度:{:.2f}%'.format(100*(count/n)), end='')
            else:
                with open(pic_name_list[i], "wb") as f:
                    f.write(res)
                    count += 1
                    print('\r當(dāng)前進(jìn)度:{:.2f}%'.format(100*(count/n)), end='')
    except:
        return '臥槽,獲取圖片失??!'

if __name__ == '__main__':
    print('author:簡(jiǎn)書(shū) Wayne_Dream:')
    print('http://www.itdecent.cn/u/6dd4484b4741')
    input('請(qǐng)輸入任意字符開(kāi)始爬蟲(chóng):')
    if os.path.exists('D:\LOLimg_wayne\\') == False:
        path = r'D:\LOLimg_wayne\\'
        os.mkdir(path)
        hero_id, hero_num = getHero_data()
        Url_list = getUrl(hero_num)
        pic_name_list = PicName(hero_id, path)
        print('正在下載圖片,請(qǐng)稍等。。。')
        print('在' + path + '下查看...')
        DownloadPic(pic_name_list, Url_list)
        print('圖片下載完畢')
    else:
        path = r'D:\LOLimg_wayne\\'
        hero_id, hero_num = getHero_data()
        Url_list = getUrl(hero_num)
        pic_name_list = PicName(hero_id, path)
        print('正在下載圖片,請(qǐng)稍等。。。')
        print('在' + path + '下查看...')
        DownloadPic(pic_name_list, Url_list)
        print('圖片下載完畢')

代碼寫(xiě)的比較丑,如有看不懂的部分可在評(píng)論區(qū)提出,我會(huì)秒回你的!/認(rèn)真臉

好了,到這里我們已經(jīng)完成了LOL全皮膚的獲取,接下來(lái)進(jìn)行最有意思的一步,千圖成像?。ㄎ哪┯形遗廊〉降钠つw圖集百度網(wǎng)盤(pán)地址)


4,初級(jí)階段我們先使用一款國(guó)外的合成軟件

軟件下載地址

  • 如果打不開(kāi),那就搜索“foto-mosaik-edda”下載即可!
Windows用戶請(qǐng)選這個(gè)

打開(kāi)后界面是這樣的。


第一步創(chuàng)建圖庫(kù)

先選第一步


1.1

1.2

等待一會(huì)兒

再選第二步create photo mosaic
2.1

2.2

2.3

2.4

2.5,彈出警告點(diǎn)確認(rèn)

效果圖

局部

大吉大利,今晚吃雞

有時(shí)間再分享如何用python實(shí)現(xiàn)這個(gè)軟件的功能…………
如發(fā)現(xiàn)錯(cuò)誤或看不懂的地方,可在評(píng)論區(qū)提出,大家一起交流!

如果想直接嘗試一下千圖成像的,可到百度網(wǎng)盤(pán)下載我爬取到的皮膚圖集:https://pan.baidu.com/s/19PywbOV1dBwr7r7bzsMhmw 密碼:5arb

  • *轉(zhuǎn)載請(qǐng)注明出處

5,將爬蟲(chóng)程序打包成exe

教程

百度網(wǎng)盤(pán)鏈接:
鏈接:https://pan.baidu.com/s/1186PCyhkJQ8ibSOB5VKe8A
提取碼:axzq
復(fù)制這段內(nèi)容后打開(kāi)百度網(wǎng)盤(pán)手機(jī)App,操作更方便哦

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容