在本文中,将探讨如何使用Django和命令行工具处理360度图片,包括提取EXIF元数据和添加水印。360度图片通常以等矩形格式存储,并依赖于元数据或EXIF数据来显示方向。将使用常见的Linux应用程序exiftool和ImageMagick,这些工具也可以在Linux工作站的命令行上使用。
例如,使用RICOH THETA相机拍摄的360度图片,其EXIF数据可能包含如下信息:
Full Pano Height Pixels : 3584
Full Pano Width Pixels : 7168
Initial Horizontal FOV Degrees : 70.0
Initial View Heading Degrees : 0.0
Initial View Pitch Degrees : 0.0
Initial View Roll Degrees : 0
Pose Heading Degrees : -54.1
Pose Pitch Degrees : 0.0
Pose Roll Degrees : 0.0
Projection Type : equirectangular
Stitching Software : RICOH THETA Stitcher v1.00.4
Use Panorama Viewer : true
除了方向信息,EXIF数据还会包含位置信息,如果有GPS设备的话。
Date/Time Created : 2019:07:06 08:58:29-08:58
GPS Altitude : 43 m Above Sea Level
GPS Date/Time : 2019:06:17 19:59:06Z
GPS Latitude : 34 deg 40' 5.20" N
GPS Latitude Ref : North
GPS Longitude : 135 deg 26' 15.80" E
GPS Longitude Ref : East
GPS Position : 34 deg 40' 5.20" N, 135 deg 26' 15.80" E
Image Size : 7168x3584
Megapixels : 25.7
Shutter Speed : 1/13
提取EXIF数据非常简单,可以使用一个叫做exiftool的免费工具。在Django的views.py文件中,可以直接使用subprocess访问Linux命令。
from django.shortcuts import render
from subprocess import Popen, PIPE, STDOUT
def homepage(request):
image_file_name = "/home/craig/Development/django/shell/shell/media/osaka-night.jpg"
process = Popen(['exiftool', image_file_name], stdout=PIPE, stderr=STDOUT)
output_byte = process.stdout.read()
output_list = str(output_byte)[2:-1].strip().split('\\n')
return render(request, 'home.html', {
'output': output_list,
'filename': image_file_name.split('/')[-1]
})
输出结果将传递给HTML模板,作为render函数的第三个参数。数据以字典的形式发送。在HTML中,简单地使用for循环遍历列表。
接下来,将展示如何使用ImageMagick添加水印。这个例子将两个图片合并成第三个图片。将第三个图片的位置传递给HTML模板文件以供渲染。
def watermark(request):
image_file_name = "/home/craig/Pictures/theta/2019/watermark/toyo-hardrock.jpg"
logo_file_name = "/home/craig/Pictures/theta/2019/watermark/theta_logo.png"
output_file = "/home/craig/Development/django/shell/shell/media/new-image.jpg"
Popen([
'composite',
'-geometry',
'+3000+1600',
logo_file_name,
image_file_name, output_file], stdout=PIPE, stderr=STDOUT)
return render(request, 'watermark.html', {
'output': output_file.split('/')[-1]
})
水印是theta_logo.png,这是一个带有40%透明度的PNG文件。ImageMagick能够将此与JPG文件合并。
HTML更简单,它只是使用传递给它的文件位置来显示图片。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>
Watermark
</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/aframe/0.7.1/aframe.min.js" integrity="sha256-SNDsmWBFQwJAjxLymQu5Fqh6rWKLJXUQboy3O0BUA=" crossorigin="anonymous"></script>
</head>
<body>
<h1>
Watermark
</h1>
<a-scene>
<a-sky src="/media/{{output}}" rotation="0 -130 0">
</a-sky>
</a-scene>
</body>
</html>
可以使用相同的遮罩模板为所有图片创建水印。由于遮罩嵌入到图片本身中,因此被盗的风险很小。
尽管这是个人选择的问题,但与JavaScript相比,使用Python进行后端工作更令人愉快。Django与JavaScript MEAN堆栈相比可能显得有些过时,但它非常快速,而且很容易在一小时内搭建起来。如果想要更快的东西,可以在Python中使用Linux命令。也可以将多个Linux命令放入bash脚本中,并从Django内部运行该脚本。是的,这是一种hack,但有时只是想快速展示一些东西。