360度图片处理技术

在本文中,将探讨如何使用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,但有时只是想快速展示一些东西。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485