网络情人节

对于即将到来的网络情人节(520),程序员是怎么看待它的呢?

不知道大家是否会期待这天的到来,但对于我这个程序猿来说:

  • 从主观来讲,不放假的节日,都不算节日

  • 从客观来讲,由消费带动的节日,都不是纯粹的节日

找这么多理由,其实归根结底,主要是以为“穷”,穷人过什么节日啊!

IT男的思维

今天随手翻UC,看到一个关于程序猿520表白的段子。

虽然是17年的老梗,但当时帖子比较火名为“她根本配不上我这么聪明的男人!”

[段子链接]

http://www.sohu.com/a/168270871_99956288

段子是一张很长长长长图,让人看得难受

在这个重大节日---520情人节来临之际,我却是显得更加寂寞无聊。看着那张长图有点不爽(关键是朋友圈狗粮吃得有点多),于是.........就有了下面这张动态图(用Python将其做成一张动态图,这就是聪明的男人一贯的做法,哈哈哈哈)

接下来让我们一起来看看聪明的男人,是如何将那张不爽的常常图做成一张动态图的?

图片的拆分与合并

Python的PIL模块在对图片处理上简直方便的不行...

先来说说图片的拆分吧

先来看看长图,内容是一共16张对白拼成的段子,其实我们只要把这16张图按照等高的方式进行裁剪就OK了,so easy!

代码主要用到了Image.crop(cropBox)的裁剪方式。

至于crop的拆分,点进去函数就能看到相关注释:

Returns a rectangular region from this image. The box is a
4-tuple defining the left, upper, right, and lower pixel
coordinate. See :ref:coordinate-system.

import os
from PIL import Image

def split_image(file, split_times):
    path, filename = os.path.split(file)
    os.chdir(path)
    try:
        os.mkdir('pictures')
    except FileExistsError:
        pass
    img = Image.open(filename)
    width, height = img.size
    per_height = height / split_times
    for pictureNumber in range(split_times):
        _cropBox = (0, per_height * pictureNumber, width * 0.8, per_height * (pictureNumber + 1))
        picture = img.crop(_cropBox)
        picture_name = os.path.join(path, 'pictures', "%d.png" % pictureNumber)
        picture.save(picture_name)

split_image("C:\\Users\Administrator\Downloads\\520.jpg", 16)

代码片段如上,简单的处理下边缘与长度即可。至于width的0.8,主要是因为图片中万恶的马赛克和“腾讯视频”的字样,影响我看段子的心情...

结果如下图:

图片分隔效果.png

再来看看图片合并

将16张剪切好的图片,组合成一个gif的动画,看起来会比单纯的图片看着高端多了,不是吗?

之前说到了PIL模块的强大,我们只需要使用Image的duration关键字,就能达到我们的目的。

上代码看看吧:

import argparse
from PIL import Image
import os

class SplitLongPicture:
    def __init__(self):
        self.dirName = os.path.split(os.path.abspath(__file__))[0]
        self.ImagePath = args.ImagePath
        self.SplitTimes = args.SplitTimes
        self.SwitchingTime = args.SwitchingTime
        self.Path, self.File = os.path.split(self.ImagePath)
        self.Image = self.check_image_file()
        self.pictureList = []

def check_image_file(self):
        _imageType = ['.jpg', '.png', '.bmp']
        if not os.path.isfile(self.ImagePath):
            raise IOError("请检查图片路径", self.ImagePath)
        elif os.path.splitext(self.File)[1].lower() not in _imageType:
            raise TypeError("请选择系统适配的图片类型", _imageType)
        else:
            return Image.open(self.ImagePath)

def split_image(self):
        os.chdir(self.Path)
        try:
            os.makedirs('pictures')
        except FileExistsError:
            pass
        width, height = self.Image.size
        _unitHeight = height / self.SplitTimes
        for pictureNumber in range(self.SplitTimes):
            _cropBox = (0, _unitHeight * pictureNumber, width * 0.8, _unitHeight * (pictureNumber + 1))
            _unitPicture = self.Image.crop(_cropBox)
            _pictureName = os.path.join(self.Path, 'pictures', "%d.png" % pictureNumber)
            self.pictureList.append(_pictureName)
            _unitPicture.save(_pictureName)

def composite_gif(self):
        images = []
        im = Image.open(self.pictureList[0])
        for file in self.pictureList[1:]:
            images.append(Image.open(file))
        gifName = os.path.join(self.Path, "result.gif")
        im.save(gifName, save_all=True, loop=True, append_images=images, duration=self.SwitchingTime * 1000)

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('-p', '--ImagePath', help="所需分隔的图片途径")
    parser.add_argument('-t', '--SplitTimes', type=int, help="图片分隔次数")
    parser.add_argument('-s', '--SwitchingTime', type=float, help="GIF图片切换时常长(单位:秒),支持小数")
    args = parser.parse_args()
    if None in args.__dict__.values():
        parser.print_help()
    else:
        Main = SplitLongPicture()
        Main.split_image()
        Main.composite_gif()

代码顺便复习了一下argparse的相关知识。那么该怎么运行呢?
python D:\SplitLongPicture.py -p C:\Users\Administrator\Downloads\520.jpg -t 16 -s 1.25


result.gif

听完这位小哥哥说的

终于明白什么叫做注孤身了

真的是“凭自己本事”单的身!

没毛病啊!

送上视频

大家好好感受一下这位兄弟的“无奈”

如果你还认为,IT男 = 沉闷无趣死宅男?不不不,你错了

今日问题

解释对偶的概念?

打卡格式:打卡第n天,答:xxx

觉得不错,点个在看呗!

520这天,我突然意识到,她根本配不上我这么聪明的男人相关推荐

  1. 520这天,我突然意识到,她根本配不上我这么聪明的男人!

    网络情人节 对于网络情人节(520),程序员是怎么看待它的呢? 不知道大家是否会期待这天的到来,但对于我这个程序猿来说: 从主观来讲,不放假的节日,都不算节日 从客观来讲,由消费带动的节日,都不是纯粹 ...

  2. 520 这天,我突然意识到,她根本配不上我这么聪明的男人

    作者 | 王翔 责编 | 胡巍巍 对于即将到来的网络情人节(520),程序员是怎么看待它的呢? 不知道大家是否会期待这天的到来,但对于我这个程序猿来说: 从主观来讲,不放假的节日,都不算节日. 从客观 ...

  3. 在 520 这天,竟然有人把 Docker讲清楚了? | 原力计划

    作者 | 夏目 " 责编 | 王晓曼 头图 | CSDN下载自东方IC 出品 | CSDN博客 简介 1.了解Docker的前生LXC LXC为Linux Container的简写.可以提供 ...

  4. 程序员 520 脱单指南!

    作者 | 周志鹏 责编 | 伍杏玲 [CSDN 编者按]今天520,朋友圈一秒变成大型"虐狗现场",单身程序员表示"也想谈恋爱"啊,那么如何找到心仪的TA,程序 ...

  5. 《使女的故事》大火,AI是背后最大推手?

    作者 | Just.Rachel 出品 | AI科技大本营(ID:rgznai100) 还记得大火的美剧<使女的故事>吗? 先别着急回答,这次我们不讲剧情,而要说的是这部剧背后的发行方是美 ...

  6. Google Android向华为“闭源”,华为手机迎来至暗时刻!

    作者 | 屠敏 转载自CSDN(ID:CSDNnews) 居安思危任正非,未雨绸缪如华为.在贸易战的背景下,即使早在多年前已在多个层面做好"备胎"计划的华为,在面对美国对芯片乃至操 ...

  7. 那些年,让我面试头大的几个排序算法,今天终于搞懂了!

    作者 | 逆流的鱼yuiop 转载自何俊林(ID:smartyuge) 算法上,最基础的就是排序算法,几乎在面试中,或多或少会要求你手写一些基础算法.今天鱼哥带大家这些基础算法回顾下. 快速排序 介绍 ...

  8. 微软提出极低资源下语音合成与识别新方法,小语种不怕没数据!| ICML 2019

    作者 | 谭旭 转载自微软研究院AI头条(ID: MSRAsia) 编者按:目前,人类使用的语言种类有近7000种,然而由于缺乏足够的语音-文本监督数据,绝大多数语言并没有对应的语音合成与识别功能.为 ...

  9. 33关Python游戏,测试你的爬虫能力到底及格不?

    作者 | 苏克1900 责编 | 胡巍巍 转载自高级农民工(ID: Mocun6) 最近在网上看到一个非常有意思的 Python 游戏通关网站,一共有 33 关,每一关都需要利用 Python 知识解 ...

最新文章

  1. 2021年了,为什么约会软件算法仍然如此糟糕?
  2. PHP取得json前面有乱码(去除文件头部BOM)
  3. groovy 使用java类_在java中使用groovy怎么搞 (java and groovy)
  4. tf.data.Dataset 用法
  5. tensorflow dataset.shuffle dataset.batch dataset.repeat 理解 注意点
  6. 计算机乘除法运算中部分积和余数的符号位选择与位移的关系
  7. HDU4405(概率DP求期望)
  8. 如何在Java代码中使用SAP云平台CloudFoundry环境的环境变量
  9. 新手求大神,有其他swit-case的思路写这个程序么?
  10. BZOJ 3170: [Tjoi 2013]松鼠聚会 切比雪夫距离
  11. micro asyn wininet
  12. 在Ubuntu 12.04安装和设置Samba实现网上邻居共享
  13. easyx写登入界面_小白入门——easyx界面版“贪吃蛇”的C语言实现(详细)
  14. linux上部署最新版本zookeeper伪分布式集群
  15. go - json -struct
  16. 【收藏向】模拟电子技术超强知识点总结 20小时不挂科
  17. 个人认为比较有意思的文章
  18. No matter how well thought out it is
  19. 小程序利用background-image设置背景
  20. * What went wrong:A problem occurred evaluating project ‘:app‘.> Failed to apply plugin ‘com.andro

热门文章

  1. 大有乾坤,售前机器人背后的 AI 技术
  2. GEMM性能提升200倍,AutoKernel算子优化工具正式开源
  3. 4场直播,哈工大、亚马逊等大咖为你带来机器学习与知识图谱的内容盛宴
  4. 编程语言性能实测,Go比Python更胜一筹?
  5. 人工智能的下一个前沿:识别“零”和“无”
  6. IBM重磅开源Power芯片指令集?国产芯迎来新机遇?
  7. 谷歌大神Jeff Dean点赞网红博士论文:改进分布式共识机制 | 技术头条
  8. “编程不规范,同事两行泪!”
  9. AI一分钟|锤子发布TNT系统和Pro 2S;美团点评将在9月20日左右正式登陆港交所
  10. 厉害了!不重启JVM,替换掉已经加载的类