我正在参加「初夏创意投稿大赛」详情请看:初夏创意投稿大赛
说起夏天,就必须得说起端午节了。说到端午节就想到放假(哈哈哈哈,开个玩笑)。端午节作为中国的传统节日之一,至今以来历史悠久。而中国传统节日,是中华民族悠久历史文化的重要组成部分,形式多样、内容丰富。传统节日的形成,是一个民族或国家的历史文化长期积淀凝聚的过程。中华民族的古老传统节日,涵盖了原始信仰、祭祀文化、天文历法、易理术数等人文与自然文化内容,蕴含着深邃丰厚的文化内涵。从远古先民时期发展而来的中华传统节日,不仅清晰地记录着中华民族先民丰富而多彩的社会生活文化内容,也积淀着博大精深的历史文化内涵。
中国的传统节日主要有:春节(农历正月初一);元宵节(农历正月十五);清明节(公历4月5日后);端午节(农历五月初五);七夕节(农历七月初七);中元节(农历七月十五);中秋节(农历八月十五);重阳节(农历九月初九);下元节(农历十月十五);冬至节(公历12月21~23日);除夕(农历十二月廿九或三十) 等。
而我们越来越多年轻人选择过外国节「外国节都没放假不知道记着干嘛」。而老板更加不想你放假,想尽一切方法留你下来加班(太可恶了)。为了以后我们程序员能过好每个中国传统节日,我决定写一个程序来提醒老板该放假了,从我老板做起,给大家肃立榜样。
先说一下我大概要实现什么功能哈。首先定义好节日的日期范围与节日的宣传图片,然后判断当前时间是否在节日的范围内,如果是,则在老板打开项目的时候提醒老板该安排放假了
思路
graph TD
确定节日时间范围 -->
判断时间是否在范围内 --> 获取对应的节日宣传图片 --> 将图片转成canvas画布获取图片流 ---> 生成对应ASCII图形文案
说干就干
一:确定好时间访问与判断
let size = {} // 用于存放字体大小
let newImg = null // 用于存放图片流
let data = null // 用于存放图片二进制信息
// 定义好哪些时间段控制台显示的是什么文化图案,可以用来定义节假日呀,或者老婆的生日呀、结婚纪念日呀、等等重要的日子,每天打代码提醒自己
const dateImage = {
'2022-01-01~2022-01-03': {
blessingTitle: '老板,元旦啦,该放假了',
imgUrl: require('../img/01.png')
},
'2022-01-31~2022-02-06': {
blessingTitle: '老板,春节啦,该放假了',
imgUrl: require('../img/02.png')
},
'2022-04-03~2022-04-05': {
blessingTitle: '老板,清明啦,该放假了',
imgUrl: require('../img/03.png')
},
'2022-04-30~2022-05-04': {
blessingTitle: '老板,五一劳动节啦,该放假了',
imgUrl: require('../img/04.png')
},
'2022-06-03~2022-06-05': {
blessingTitle: '老板,端午节啦,该放假了',
imgUrl: require('../img/05.png')
},
'2022-09-10~2022-09-12': {
blessingTitle: '老板,中秋节啦,该放假了',
imgUrl: require('../img/06.png')
},
'2022-10-01~2022-10-07': {
blessingTitle: '老板,国庆节啦,该放假了',
imgUrl: require('../img/07.png')
}
}
// 获取到图片初始化图片
// 获取当前时间,判断属于在那个节日
let startTime = ''
let endTime = ''
const date = new Date().getTime()
for (const key in dateImage) {
const time = key.split('~')
startTime = new Date(time[0]).getTime()
endTime = new Date(time[1]).getTime()
// 当前时间在节假日中的
if (date >= startTime && date <= endTime) {
const promise = importImg(dateImage[key].imgUrl)
promise.then(() => {
const data = initCanvas()
toAscii(data)
})
}
}
二:通过canvas生成二进制
// 存放图片流
function importImg (imgSrc) {
const img = new Image()
img.src = imgSrc
return new Promise((resolve, reject) => {
img.onload = () => {
newImg = img
resolve()
}
})
}
// 利用canvas生成图片的流信息
function initCanvas () {
const canvas = document.createElement('canvas')
const context = canvas.getContext('2d')
size.width = 100 // 记录图片宽度,用于计算换行
size.height = 100 * newImg.height / newImg.width
canvas.width = size.width
canvas.height = size.height
context.drawImage(newImg, 0, 0, newImg.width, newImg.height, 0, 0, size.width, size.height)
// 生成图片的二进制流信息
const imgRawData = context.getImageData(0, 0, size.width, size.height)
data = imgRawData.data
}
三:通过获取的二进制以及图片信息打印出对应的图形文案
// 用于在控制台生成ascii码的
function toAscii () {
const diving = size.width * 4
// 转换灰度图,符号可以自己定
const arr = ['w', 'N', 'H', 'Q', '$', 'O', 'C', '?', '7', '>', '!', ':', '–', ';', '.']
const result = []
for (let i = 0, len = data.length; i < len; i += 4) {
const avg = (data[i] + data[i + 1] + data[i + 2]) / 3
const num = Math.floor(avg / 18)
result.push(arr[num])
if ((i + 4) % diving === 0 && i !== 0) { // 结合size判断在哪换行
result.push('\n')
}
}
console.log(result.join(''))
}
生成的效果就是这样的
就这样你们老板打开项目的时候或者你平时开发项目的时候,每次一到时间点就看到对应的节假日了,就知道该放假了,让老板时时刻刻记着我们的传统节日
又是为大家谋福利的一天,相信在你的提醒下,老板很快就意识到问题严重性,立马给你放假。思路提供给你们了,执不执行就看你的了,我要个赞跟关注不过分,实在不行点个赞呗,说不定我明天就去你公司面试了。
以上都只是个人玩笑哈,现在很多企业都是按照国家规定的节假日放假了,毕竟这是中国的传统文化节日,我们不去传承难道外国人帮我们传承嘛,所以弘扬中国传统文化,人人有责。倔金也是经常推出这种文化节日相关的活动,就非常好,既能弘扬中国传统文化也能让程序互相学习,感谢掘金(我发誓我没有在舔)