原文链接:  http://xunyanan.com/blog/2013/11/26/mosaic-photo-and-share-moment/
 written by  寻亚楠   posted at  http://xunyanan.com

想法

2013年接近尾声了,有的媒体会用马赛克的方式,把一年中的大事件汇集到一张图片上。印象中天才少年Matrix67曾试用Mathematica制作过自己马赛克头像,于是便有了用微信朋友圈里的图片来制作一个自己的微信头像。
马赛克头像
觉得不像我,可以离开座位,退后一点,离显示器远点看这张图片。

动手

使用到的工具:
Mac(os x 10.9)电脑(windows也可以做,替换相应的工具即可)
Mathematica 9.0
Chrome and batch image download
Preview and A better finder rename

筹集素材

制作马赛克头像的第一步是什么?要有足够的马赛克(心中无码可跳过),脑子的想法便是微信朋友的头像,有足够的好友数量,便有很多素材,这些素材,还是有统一尺寸的。要获得这些素材,有几个方法。

从手机中获得素材

从手机将微信App导出,从中找到头像文件夹。这是第一想法,没试成,用的iPhone手机,升了iOS7.0,越不了狱,看不到微信的文件夹。android的童鞋可以试下,但有可能腾讯没把素材按JPEG放到文件,可能放到SQLite里,这样的话,这个方法就用不了了。

从微信网站下载素材

微信新推出了网页版,可以做的事情就多了一些。打开微信网页版后),用手机扫描二维码登陆后,可以看到微信网页版的聊天界面,看到朋友们的信息。在这里我走个小弯路(点击跳过此段内容),这个弯路是用Javascript和nodejs来完成从网站扒朋友头像的任务。

JS获得头像url代码
1
function a () {var a = document.images; for(i=0;i<a.length;i++){ if(a[i].getAttribute("hide_src")){console.log(a[i].getAttribute("hide_src"))} } } a();
使用nodejs的request下载素材到本地文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// Dependencies
var fs = require('fs');
var url = require('url');
var http = require('http');
var exec = require('child_process').exec;
var spawn = require('child_process').spawn;
// App variables
var file_url = 'http://xunyanan.com/images/blog/PowerOfNow.png';
var DOWNLOAD_DIR = './';
// We will be downloading the files to a directory, so make sure it's there
// This step is not required if you have manually created the directory
var mkdir = 'mkdir -p ' + DOWNLOAD_DIR;
var child = exec(mkdir, function(err, stdout, stderr) {    if (err) throw err;
    else download_file_httpget(file_url);
});
// Function to download file using HTTP.get
var download_file_httpget = function(file_url) {var options = {    host: url.parse(file_url).host,
    port: 80,
    path: url.parse(file_url).pathname
};
var file_name = url.parse(file_url).pathname.split('/').pop();
var file = fs.createWriteStream(DOWNLOAD_DIR + file_name);
http.get(options, function(res) {    console.log(res.statusCode);
         console.log(res.data);
    res.on('data', function(data) {            file.write(data);
        }).on('end', function() {            file.end();
            console.log(file_name + ' downloaded to ' + DOWNLOAD_DIR);
        });
    });
};
一切准备妥当,发现微信的链接是https的,直接用url是新建http连接是获得不了东西的。这就和泡好了方便面,发现没配叉子一样。就换了条其他的路,放代码出来,大家可以研究下,如何用脚本建立上https的请求,毕竟脚本的方法能控制更多东西。

新的道路,使用Chrome and batch image download插件

如果去年抢过火车票,那估计电脑里都还有Chrome,batch image download比较好用,安装完成后便在右键菜单中可以看到。就是要注意,要先把朋友列表拖动一下,让所有的朋友头像都在网页上刷新出来,这样才可以下载全部的。

整理素材

现在有了几百张朋友的头像,Mathematica需要的是统一尺寸的正方形jpg图像,大概每张图片的像素在20*20~~40*40之间,要先整理一下图片。

首先删除不是正方形的图像

里面会有群组的头像,这个也可以选择删掉

重命名整理图片(可跳过)

  1. 使用shell 命令批量重名
1
j=100;for i in *;do let j+=1;mv "$i" "${i%.*}$j.jpg";done
  1. 使用A better finder rename

    将132*132的头像图片像素变小

    推荐使用Mac自带的atuomator做这项任务,通过鼠标拖动,就能安排这个小机器人给你干活,是见很有意思的事情。对于自定义缩放图像这里有一份详细的教程。
    在脑海中先好要让机器人做什么,比如第一步先把图片拷贝到每个目录,然后在把这些图像尺寸缩小。编辑好flow后,保存好后,便可以通过右键看到自己命名的操作,然后选中文件操作。用完之后,如果不想右键点击后,还出现自定义的操作,可以在automator删除services工作流,进到目录[username]/Library/Services下删除对应名字的workflow,就可以了。

    制作黑白素材

    将所有的头像图片,制作一份黑白素材,放在一起组成新的图像库。从Mathematica生成马赛克图片的上说,素材图库中图片越多,然后有黑白色图片低对比度图片,生成出来的头像,会效果更好。每一个素材库的图片都会是当一个像素去对应到最终生成的头像图片上。制作黑白素材的方法有

  2. automator小机器人可以做
  3. 使用priview调节饱和度(Saturation)
  4. 使用photoshop调节颜色通道 效果上从上到下越来越好,功夫上也是从上到下越费越多。建议第二种。

    制作图片

    制作马赛克图片我们用的是Mathematica 9.0 (用R语言的看这里)。先看看下这经典的三行代码,向Theodore Gray致敬。

1
2
3
4
5
6
7
imagePool = Map[With[{i = Import[#]}, {i, N@Mean[Flatten[ImageData[i], 1]]}] &,
   FileNames["/Users/xunyanan/Desktop/webwx_img/*.jpg"]];
closeMatch[c_] :=
 RandomChoice[Nearest[imagePool[[All, 2]] -> imagePool[[All, 1]], c, 20]]
ImageAssemble[
 Map[closeMatch,
  ImageData[Import["/Users/xunyanan/Desktop/2011me.tiff"]], {2}]]

第一行就是把建立了一个制定路径的图像库;第二行写了个匹配函数,函数的内容是找出最接近的20个图片,并随机选择;第三行是导入目标图片,并调用函数closeMatch生成图像结果。

目标图片tiff格式的头像照片

找一张自己的头像图片,然后把它处理成20*20像素的tiff格式,注意在保存tiff格式时,一定不要勾选Alpha通道。也可以选择更大像素的图片,就是生成时间会久一点。

生成马赛克头像

在Mathematica 9.0 新建note book,然后,将三行代码拷入其中,并把路径改成自己的文件位置。右键选择Evaluation cell,便可看到结果。

分享到微信朋友圈

可以用微信的开放平台把自己的头像分享回微信。我的个人博客网站用的的是加网分享,点击分享,扫描二维码即可完成。

在个人博客网站添加加网的方法是

注册加网后,获得加网生成的js

1
2
3
4
5
6
<!-- JiaThis Button BEGIN -->
<script type="text/javascript">
var jiathis_config = {data_track_clickback:'true'};
</script>
<script type="text/javascript" src="[your url]" charset="utf-8"></script>
<!-- JiaThis Button END —>

将此段代码添加到个人网站中,详见这篇。

制做自己的马赛克微信头像相关推荐

  1. php完美实现下载远程图片保存到本地(保存微信头像)

    2019独角兽企业重金招聘Python工程师标准>>> /** * php完美实现下载远程图片保存到本地 * @param: 文件url,保存文件目录,保存文件名称,使用的下载方式 ...

  2. 圆头像 微信小程序 绘图_小程序canvas绘制圆形微信头像

    提示:canvas画布绘画图片的时候,图片不能是互联网图片,必需是本地图片才可以正常绘制. 第一步:获取客户受权,下载微信头像图片到本地.pleaseSign: function(event) { w ...

  3. 教你在微信头像上加皇冠,很漂亮!

    最近看到这样的皇冠头像还蛮漂亮的,这里先来看一下,然后教大家制作方法. 就是这样的效果,可以在自己的微信头像左上角,加上一个漂亮的皇冠很好看,安卓和iOS都可以使用. 下面说一下怎么制作,这里需要一个 ...

  4. python代码图片头像_Python帮你微信头像任意添加装饰别再@微信官方了

    @微信官方 昨天朋友圈刷爆了@微信官方的梗,从起初的为头像添加国旗,到最后的各种Book思议的需求-而我呢?@了辣么辣么多的奥特曼,结果还是加班到12点多-最后想想,人还是得靠自己吧,@我自己吧- 昨 ...

  5. python微信加人_Python帮你微信头像任意添加装饰,别再@微信官方了_编程语言_python考试视频_python教程_课课家...

    @微信官方 昨天朋友圈刷爆了@微信官方的梗,从起初的为头像添加国旗,到最后的各种Book思议的需求-而我呢?@了辣么辣么多的奥特曼,结果还是加班到12点多-最后想想,人还是得靠自己吧,@我自己吧- 昨 ...

  6. 程序员微信头像_微信头像暴露了你的层次:层次越低的人,越喜欢用这些头像...

    这个话题,原本很轻松.但往细里看,它背后玄机很多.许多未知理论与认知可能性,往往就在不为人知的拐角处. 卞之琳有一首诗:你站在桥上看风景,看风景的人在楼上看你.明月装饰了你的窗子,你装饰了别人的梦.此 ...

  7. php下载 微信头像图片_php 下载微信头像

    $header_img = "https://wx.qlogo.cn/mmopen/vi_32/z83qsUEIvwfdAElFIgRZmGMF3QJexLX8QBXB2BHXxroU8sj ...

  8. 怎样把照片中的头像扶正_微信头像用对了,2020运气差不了

    微信头像,很多时候是一个人心境的写照. 也许是有意的,也许是无意的,但冥冥之中就成为了你的一张名片. 这一年运气好不好,看看你的微信头像就知道. 用自己的照片 用自己的照片做头像,运气当然不会差. 自 ...

  9. 有很帅气的微信头像推荐吗?

    你好,很高兴回答你的问题 我有很帅气的微信头像推荐哦.这是一组我自己的手绘动漫头像,男生用了就会很显气质哦,还可以根据自己的喜好和职业去设定自己想要的感觉.帅气的头像也分很多种,选择一张适合自己的头像 ...

最新文章

  1. 最近一段时间开发客户端app的感悟
  2. Hystrix断路器(五)
  3. Scapy之ARP询问
  4. [APIO2010]特别行动队
  5. vue 实现表格循环滚动 vue-seamless-scroll插件的安装与使用
  6. checking for spandsp >= 3.0... configure: error: no usable spandsp; please install spandsp3 devel pa
  7. 无限网卡不能启动WZC服务的解决方案
  8. 完整的连接器设计手册_连接器退化机理是什么?(一)
  9. 2021年网络安全学习路线指导(含视频教程)
  10. PHP开发API签名验证
  11. 樊登读书会终身成长读后感_终身成长读后感300字
  12. 【C语言经典100例】-- 11 不死神兔问题
  13. 银联权益信息API接口及管理平台解决方案相关介绍
  14. 捣鼓PlantUML(一、环境)
  15. 【Android】App开发-动画效果篇
  16. yum安装报错:“Could not resolve host: mirrors.aliyun.com; Unknown error“--:-- ETA Trying
  17. 3.python数据分析处理库pandas(学习笔记)
  18. VUE UI框架对比 element-ui 与 iView
  19. Python-shogun安装问题
  20. Hastelloy C-276 (UNS N10276) 含钨的镍-铬-钼合金

热门文章

  1. MIKE 21 教程 1.5 基于卫星影像绘制河道边界
  2. Python学习笔记之Python之禅
  3. Linux 系统Apache配置SSL证书
  4. 基于Java web的旅游网站(源码+文档)
  5. Java swt连接数据库实现员工绩效管理系统(可视化UI界面)
  6. zabbix监控cisco路由器线路连通性——通过snmp获得cisco设备ip sla监控结果
  7. 二叉树的创建和遍历(查找key,返回二叉树的层数)
  8. FTP 传送文件到远程服务器
  9. 利用算法轻松预测用户贷款是否违约(附 Python 源码)
  10. Linux的历史背景和基本指令