2024年HarmonyOS鸿蒙最新千图成像!祝可爱的小伙伴们圣诞快乐_axure画圣诞树(2),2024年最新HarmonyOS鸿蒙常见面试题 知乎

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

通过爬虫将粉丝的头像下载到本地,具体分析大家可以参考我之前的博客【前方高能!看小伙是怎么表白粉丝的】,完整代码如下:

# -\*- coding: utf-8 -\*-
"""
Created on Sat Oct 17 12:27:33 2020

@author: kimol\_love
"""

import requests

def get\_fansInfo():
    '''
 获取粉丝相关信息
 '''
    url = 'https://me.csdn.net/api/relation/index?pageno=%d&pagesize=%d&relation\_type=fans' # 接口地址
    cookies = {} # CSDN登陆后的cookies
    headers = {  # 请求头
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0',
        'Accept': 'application/json, text/plain, \*/\*',
        'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
        'Referer': 'https://i.csdn.net/',
        'Origin': 'https://i.csdn.net',
        'Connection': 'keep-alive',
        'TE': 'Trailers',
    }
    # 获取粉丝总数
    res = requests.get(url%(1,10),headers=headers,cookies=cookies)
    res_json = res.json()
    N_fans = res_json['data']['data\_all']
    print('一共有%d个粉丝'%N_fans)
    # 获取全部粉丝数据
    res = requests.get(url%(1,N_fans),headers=headers,cookies=cookies)
    res_json = res.json()
    return res_json

def download\_avatar(username,url):
    '''
 下载用户头像
 '''
    savePath = './avatars' # 头像存储目录
    res = requests.get(url)
    with open('%s/%s.jpg'%(savePath,username),'wb') as f:
        f.write(res.content)
     

if __name__ == '\_\_main\_\_':
    fans = get_fansInfo()
    for f in fans['data']['list']:
        username = f['fans'] # 用户名
        url = f['avatar']    # 头像地址
        download_avatar(username,url)
        print('用户"%s"头像下载完成!'%username)

将头像下载完毕并去重,结果如下:
在这里插入图片描述
一共有2796张非重复图片,有了它们,我们便可以开始——搞事情!

2.千图成像

所谓千图成像就是用很多张图片拼接成一张完整的图片,它需要两个部分:一张背景图一个图片库。根据背景图的结构用图片库中的图片来进行拼接,最终形成新的图片。

一种最简单直观的思路便是:遍历背景图中的每个像素点,并用图库中与之颜色最相近的图片粘贴在这个位置。

因此,我们首先需要计算每个图片的“平均颜色”,即图片像素点(R,G,B)的平均值,代码如下:

def compute\_mean(imgPath):
    '''
 计算平均(R,G,B)
 '''
    img = Image.open(imgPath)
    img = img.convert('RGB')
    imgArray = np.array(img)
    R = np.mean(imgArray[:,:,0])
    G = np.mean(imgArray[:,:,1])
    B = np.mean(imgArray[:,:,2])
    return (R,G,B)

遍历图片库中的每张图片,并得到它们的平均距离,生成一个图片列表,以便后续的使用:

def get\_imgList(imgDir):
    '''
 获取图片列表(图片目录及平均颜色)
 '''
    imgList = []
    for imgName in os.listdir(imgDir):
        path = imgDir+imgName
        color = compute_mean(path)
        imgList.append({'path':path,'RGB':color})
    return imgList

该列表的每个元素是一个字典,包括了pathRGB,分别表示图片的路径以及图片的平均颜色,如下:
在这里插入图片描述
在得到了图片的“平均颜色”后,便是比较背景图的像素点与它的相似性,这里采用了欧式距离:

def compute\_distance(color1, color2):
    '''
 计算两张图的颜色差
 '''
    dis = 0
    for i in range(len(color1)):
        dis += (color1[i]-color2[i])\*\*2
    dis = dis\*\*0.5
    return dis

剩下的便是遍历背景图,并进行比较填充,代码如下:

def create\_image(bgImg,imgDir,N=10,M=50):
    '''
 根据背景图,用头像填充出新图
 bgImg:背景图地址
 imgDir:头像目录
 N:背景图缩放的倍率
 M:头像的大小(MxM)
 '''
    # 获取图片列表
    imgList = get_imgList(imgDir)
    
    # 读取背景图
    bg = Image.open(bgImg)
    bg = bg.resize((bg.size[0]//N,bg.size[1]//N)) # 缩放
    bgArray = np.array(bg)
    width = bg.size[0]\*M  # 新生成图片的宽度
    height = bg.size[1]\*M # 新生成图片的高度
    
    # 创建空白的新图
    newImg = Image.new('RGB',(width,height))
    
    # 循环填充图
    for x in range(bgArray.shape[0]):
        for y in range(bgArray.shape[1]):
            ## 找到距离最小的图片
            minDis = 10000
            index = 0
            for img in imgList:
                dis = compute_distance(img['RGB'],bgArray[x][y])
                if dis < minDis:
                    index = img['path']


![img](https://img-blog.csdnimg.cn/img_convert/6f4ce08eac8bd3bfa031fa22f07b1cca.png)
![img](https://img-blog.csdnimg.cn/img_convert/743a9a88e8660079efbecae3d891ead1.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618636735)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

真正的技术提升。**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618636735)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值