使用实时更新的卫星照片作为你的桌面壁纸!

2015-12-06 21:15:13 +08:00
 bitdust

妈妈说过在标题栏加感叹号会显得很 low ,但是这的确是我发在 V2EX 第一个项目,不得不激动下。

这是一个 C#项目,可以抓取日本的向日葵 8 号卫星每十分钟更新的的地球照片作为桌面壁纸,逼格爆炸。

效果图如下:

项目地址: https://github.com/bitdust/EarthLiveSharp
使用攻略: https://github.com/bitdust/EarthLiveSharp/issues/3

欢迎大家多提宝贵意见!

24692 次点击
所在节点    分享创造
142 条回复
GPU
2015-12-09 14:32:49 +08:00
@pepsin 顺便想请教一下 ` 20.times do ` 是什么来的, while 循环吗? 

没学过 ruby 看不懂代码.想改写一个 python 的.
bitdust
2015-12-09 14:41:52 +08:00
@GPU 下次更新吧~我先观察下我的 CDN 扛得住流量扛不住
pepsin
2015-12-09 14:48:09 +08:00
@GPU 类似于 for (i=0;i < 20;i++)
miao1007
2015-12-09 15:06:46 +08:00
搞了个 shell 的,使用的 1d 精度,在 RMBP 下效果还可以

<script src="https://gist.github.com/miao1007/54a2bdb012c643e9f826.js"></script>
uuair
2015-12-09 15:11:01 +08:00
@anguslg 可行啊,但是我只有 mac 跟 linux ,哎
GPU
2015-12-09 15:34:42 +08:00
@pepsin 第一行去到最后一行的,改好了吗?
pepsin
2015-12-09 15:54:04 +08:00
@GPU 暂时没时间,你自己调整调整呗。我贴个新版的

require 'net/http'
require "cairo"

def get_url time, x, y
str = "http://himawari8-dl.nict.go.jp/himawari8/img/D531106/20d/550/#{time}00_#{x}_#{y}.png"
end

def merge time
puts "Start image process"
w = 1
h = 20
partial_width = 550
surface = Cairo::ImageSurface.new(w * partial_width, h * partial_width)
cr = Cairo::Context.new(surface)

arr = []
w.times do |x|
h.times do |y|
name = "himawari_#{x}_#{y}.png"
arr.push name
puts name
png = Cairo::ImageSurface.from_png(name)
cr.set_source(*png)
cr.matrix = Cairo::Matrix.identity
cr.translate(x * partial_width, y * partial_width)
cr.paint()
end
end

cr.target.write_to_png("#{time.split("/").join("_")}.png")
cr.destroy
surface.destroy
arr.each do |file|
# File.delete file
end
end

def run time
merge_name = time.split("/").join("_") + ".png"
unless File.exists? merge_name
ts = []
1.times do |x|
thread = Thread.new do
20.times do |y|
name = "himawari_#{x}_#{y}.png"
unless File.exists? name
url = get_url time, x, y
uri = URI.parse(url)
req = Net::HTTP::Get.new uri.path
res = Net::HTTP.start(uri.host, uri.port, use_ssl: false) do |http|
http.request req
end

file = File.open(name, "w+")
file.write(res.body)
file.close
end
end
end
ts.push thread
end
ts.map(&:join)
sleep 30
end

unless File.exists? merge_name
merge time
end
end

# 24.times do |hour|
# hour = hour.to_s
# if hour.length < 2
# hour = "0" + hour
# end
# 6.times do |minute|
# minute = (minute * 10).to_s
# if minute.length < 2
# minute = "0" + minute
# end
# str = "2015/12/01/" + hour + minute
# puts str
# run str
# end
# end

run "2015/12/01/0000"
pepsin
2015-12-09 15:54:49 +08:00
@GPU 之前你 VPS 崩掉估计是我忘了释放内存了。 Cairo 的 Surface 在 20D 精度还是蛮大的。
GPU
2015-12-09 16:06:37 +08:00
@pepsin 11000 x 11000 的像素呢.
aitaii
2015-12-09 16:52:00 +08:00
1.0 版的是没有启动程序吗。。。。
aitaii
2015-12-09 16:54:41 +08:00
看了一下 .7z 的有
.zip 的好像没有呢
bitdust
2015-12-09 16:57:04 +08:00
@aitaii 那个 zip 是 github 自动生成的代码包,并不是可执行程序。
7z 里是编译好的可执行程序。
aitaii
2015-12-09 16:59:28 +08:00
@bitdust 感谢解答。
pepsin
2015-12-09 17:15:28 +08:00
@GPU require 'net/http'
require "cairo"

def get_url time, x, y
str = "http://himawari8-dl.nict.go.jp/himawari8/img/D531106/20d/550/#{time}00_#{x}_#{y}.png"
end

def merge time
puts "Start image process"
w = 20
h = 20
partial_width = 550
surface = Cairo::ImageSurface.new(w * partial_width, h * partial_width)
cr = Cairo::Context.new(surface)

arr = []
h.times do |y|
w.times do |x|
name = "himawari_#{x}_#{y}.png"
arr.push name
puts name
png = Cairo::ImageSurface.from_png(name)
cr.set_source(*png)
cr.matrix = Cairo::Matrix.new(1,0,0,1,x * partial_width, y * partial_width)
cr.paint()
end
end

cr.target.write_to_png("#{time.split("/").join("_")}.png")
cr.destroy
surface.destroy
arr.each do |file|
File.delete file
end
end

def run time
merge_name = time.split("/").join("_") + ".png"
unless File.exists? merge_name
ts = []
20.times do |x|
thread = Thread.new do
20.times do |y|
name = "himawari_#{x}_#{y}.png"
unless File.exists? name
url = get_url time, x, y
uri = URI.parse(url)
req = Net::HTTP::Get.new uri.path
res = Net::HTTP.start(uri.host, uri.port, use_ssl: false) do |http|
http.request req
end

file = File.open(name, "w+")
file.write(res.body)
file.close
end
end
end
ts.push thread
end
ts.map(&:join)
sleep 5
end

unless File.exists? merge_name
merge time
end
end

24.times do |hour|
hour = hour.to_s
if hour.length < 2
hour = "0" + hour
end
6.times do |minute|
minute = (minute * 10).to_s
if minute.length < 2
minute = "0" + minute
end
str = "2015/12/01/" + hour + minute
puts str
run str
end
end

# run "2015/12/01/0000"
pepsin
2015-12-09 17:15:50 +08:00
@GPU 修复了那个顶部错位的玩意
GPU
2015-12-09 17:23:57 +08:00
@pepsin 把三個版本的代碼都上傳到了 gist
https://gist.github.com/p0we7/5783db11ec2ddeb67d14.\
wzqcongcong
2015-12-09 20:13:05 +08:00
学习下然后做个 mac 版的 : )
blueset
2015-12-09 22:37:44 +08:00
求哪位大神做一个 Chrome New Tab 版本。
Mark24
2015-12-10 11:22:20 +08:00
这是我小时候的梦想……真的
lqzhgood
2015-12-10 12:06:05 +08:00
逼格满满,情怀满满

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/241563

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX