iOS开发,利用PanoramaGL生成360度全景预览图,附选择本地全景图片并生成全景预览...
前言
初做全景项目,涉及到了360度全景展示(也可以是720度的旋转),查找了很多资料,很多都是用PanoramaGL这个库实现的,本人也踩了一下坑,下面我简单的总结一下。
初识PanoramaGL
此处先提供一个可以在Xcode8运行的 Demo (包含PanoramaGL库)。你下载下来看一下,运行,没有太大问题,只是第一张图加载不出。
从Demo可以看出,使用PanoramaGL进行全景图展示很简单:
// 在ViewController.m
// #import "PLView.h"-(void)viewDidLoad
{[super viewDidLoad];// 创建全景展示View,设置代理self.plView.delegate = self;//JSON loader example (see json.data, json_s2.data and json_cubic.data)//[plView load:[PLJSONLoader loaderWithPath:[[NSBundle mainBundle] pathForResource:@"json_cubic" ofType:@"data"]]];// 1. 创建全景图 (单张)NSObject<PLIPanorama> *panorama = nil;panorama = [PLSphericalPanorama panorama];[(PLSphericalPanorama *)panorama setTexture:[PLTexture textureWithImage:[PLImage imageWithPath:[[NSBundle mainBundle] pathForResource:@"pano_sphere" ofType:@"jpg"]]]];/* 2. 创建全景图(多张图片拼接)PLCubicPanorama *cubicPanorama = [PLCubicPanorama panorama];[cubicPanorama setTexture:[PLTexture textureWithImage:[PLImage imageWithPath:[[NSBundle mainBundle] pathForResource:@"pano_f" ofType:@"jpg"]]] face:PLCubeFaceOrientationFront];[cubicPanorama setTexture:[PLTexture textureWithImage:[PLImage imageWithPath:[[NSBundle mainBundle] pathForResource:@"pano_b" ofType:@"jpg"]]] face:PLCubeFaceOrientationBack];[cubicPanorama setTexture:[PLTexture textureWithImage:[PLImage imageWithPath:[[NSBundle mainBundle] pathForResource:@"pano_l" ofType:@"jpg"]]] face:PLCubeFaceOrientationLeft];[cubicPanorama setTexture:[PLTexture textureWithImage:[PLImage imageWithPath:[[NSBundle mainBundle] pathForResource:@"pano_r" ofType:@"jpg"]]] face:PLCubeFaceOrientationRight];[cubicPanorama setTexture:[PLTexture textureWithImage:[PLImage imageWithPath:[[NSBundle mainBundle] pathForResource:@"pano_u" ofType:@"jpg"]]] face:PLCubeFaceOrientationUp];[cubicPanorama setTexture:[PLTexture textureWithImage:[PLImage imageWithPath:[[NSBundle mainBundle] pathForResource:@"pano_d" ofType:@"jpg"]]] face:PLCubeFaceOrientationDown];panorama = cubicPanorama;
*/// 设置一个热点PLTexture *hotspotTexture = [PLTexture textureWithImage:[PLImage imageWithPath:[[NSBundle mainBundle] pathForResource:@"hotspot" ofType:@"png"]]];PLHotspot *hotspot = [PLHotspot hotspotWithId:(kIdMin + random() % ((kIdMax + 1) - kIdMin)) texture:hotspotTexture atv:0.0f ath:0.0f width:0.08f height:0.08f];[panorama addHotspot:hotspot];// 将全景图展示[self.plView setPanorama:panorama];
}复制代码
此处给大家说一下,这里单张的全景图片的<宽高比限定为2:1>
而PanoramaGL仅支持单张分辨率2048x1024的全景图,里面的 PLSpherical2Panorama 据说能支持4096x2048 的图片,试了一下貌似不行。进去看了一下源码,所谓支持,就是基于2048x1024再缩放,然后进图片分割排布,效果不行。所以,自己生成预览图的时候,需将图片大小转为2048x1024。
给自己的项目配置PanoramaGL
看着Demo运行的挺好的,但当你把PanoramaGL拖进你的项目,编译,一大堆错误!原因是Demo把不能运行的坑都踩了,这个PanoramaGL库2011年开始就不再维护了。库是在MRC环境写的,因此,直接在现在Xcode 的ARC环境编译会出错。
解决以上问题:
在用MRC 环境写的文件 添加 -fno-objc-arc, 属于PanoramaGL基本这个库的文件基本都要添加,但是,不是全部! 注意,文件后缀.c的文件不用添加 -fno-objc-arc
好不容易将这么多文件添加了-fno-objc-arc ,再编译一下,蒙蔽了,瞬间几十个错误:
解决上面这个问题,有三个解决方案:
解决方案一:
选择所有导入的.c文件,将属性的 identity and type 改为Objective-C Source。
解决方案二:
选择所有导入的.c文件,将.c修改为.m
解决方案三:
将Compile Sources As 改为 Objective-C++。 方案三由于修改所有文件的编译类型,所有可能会导致其他包括c、c++代码的提示错误,不过都是些的提示异常,按提示修改即可。
改完了,编译,终于通过。
项目使用实例
先给大家贴一下使用PanoramaGL实现预览全景图的控制器代码吧:
// 此处是push出来的预览全景图控制器// CPPreviewPanoController.h
@interface CPPreviewPanoController : UIViewController
@property (strong, nonatomic) UIImage *previewImage;
@end
复制代码
// Created by JasonSu on 2017/5/17.
// Copyright © 2017年 JasonSu. All rights reserved.
//
// CPPreviewPanoController.m#import "CPPreviewPanoController.h"
#import "PLView.h"#define kPreviewSize CGSizeMake(2048, 1024)@interface CPPreviewPanoController ()<PLViewDelegate>
@property (strong , nonatomic) PLView *plView;
@end@implementation CPPreviewPanoController- (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColor = [UIColor whiteColor];// 创建预览self.plView = [[PLView alloc]initWithFrame:CGRectMake(0, 64, CPSCREEN_WIDTH, CPSCREEN_HEIGHT-64)];self.plView.delegate = self;[self.view addSubview:self.plView];if (!self.previewImage) {return;}UIImage *previewImg = [self reSizeImage:self.previewImage toSize:kPreviewSize];NSLog(@"改变尺寸后的image==%@", previewImg);CGImageRef cgRef = previewImg.CGImage;NSObject<PLIPanorama> *panorama = nil;// (supports up 2048x1024 texture) panorama = [PLSphericalPanorama panorama];[(PLSphericalPanorama *)panorama setTexture:[PLTexture textureWithImage:[PLImage imageWithCGImage:cgRef]]];[self.plView setPanorama:panorama];
}- (void)viewDidDisappear:(BOOL)animated
{[super viewDidDisappear:YES];[self.plView removeFromSuperview];self.plView.delegate = nil;self.plView = nil;
}
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{return YES;
}/// 修改图片尺寸
- (UIImage *)reSizeImage:(UIImage *)image toSize:(CGSize)reSize
{UIGraphicsBeginImageContext(CGSizeMake(reSize.width, reSize.height));[image drawInRect:CGRectMake(0, 0, reSize.width, reSize.height)];UIImage *reSizeImage = UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();return reSizeImage;
}复制代码
本项目选择图片使用QBImagePicker
下面展示上一级控制器.m (即选择手机相册图片的控制器)的部分代码
#import "QBImagePickerController.h"
// 遵守QBImagePickerControllerDelegate/// 选择图片
- (void)addPhoto:(CPImageUpButton *)btn
{
// CPLog(@"添加图片");QBImagePickerController *imagePickerController = [QBImagePickerController new];imagePickerController.delegate = self;imagePickerController.allowsMultipleSelection = NO; // 单选// 只获取图片资源imagePickerController.mediaType = QBImagePickerMediaTypeImage;[self presentViewController:imagePickerController animated:YES completion:nil];
}#pragma mark - QBImagePickerController delegate 图片选择代理
- (void)qb_imagePickerController:(QBImagePickerController *)imagePickerController didFinishPickingAssets:(NSArray *)assets {// iOS8 以后,assets 里面的对象默认为PHAssetNSLog(@"%@", assets);// 此处默认单选PHAsset *set = assets.firstObject;// 通过图片宽高判,这个是我项目的主要判断if ( set.pixelWidth/set.pixelHeight !=2) {[MBProgressHUD showError:@"您选的不是全景图片"];return;}// 类型判断if (!(set.mediaType == 1 && set.mediaSubtypes == 0)) {[MBProgressHUD showError:@"您选的不是全景图片"];return;}// 获取图片(获得UIImage)PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];options.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;// 注意:targetSize设置 PHImageManagerMaximumSize 有可能造成卡顿,原来为Screen.size[[PHImageManager defaultManager] requestImageForAsset:set targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeAspectFit options:options resultHandler:^(UIImage *result, NSDictionary *info) {NSLog(@"result==%@ info==%@", result,info);UIImage *photo = result;[self.photosArray addObject:photo];}];[self dismissViewControllerAnimated:YES completion:nil];
}
// 用户取消选择图片
- (void)qb_imagePickerControllerDidCancel:(QBImagePickerController *)imagePickerController {//do something[self dismissViewControllerAnimated:YES completion:nil];
}
复制代码
// 点击预览
- (void)didPreviewImageView:(CPImagePreview *)imgView
{// CPLog(@"控制器点击预览");CPPreviewPanoController *previewVc = [[CPPreviewPanoController alloc]init];previewVc.previewImage = imgView.image;[self.navigationController pushViewController:previewVc animated:YES];
}
复制代码
最后
好了,此次分享利用PanoramaGL生成360度全景预览图 就到这里,已是凌晨,希望可以帮到你。有问题的小伙伴可以留言,大家一起交流。
转载于:https://juejin.im/post/5a3a14e95188256dbd4b097f
iOS开发,利用PanoramaGL生成360度全景预览图,附选择本地全景图片并生成全景预览...相关推荐
- iOS开发 动画(Animation)图片360度不停旋转
{ CGFloat angle; } - (void)viewDidLoad { [super viewDidLoad]; angle = 0; [self start ...
- iOS开发必备工具:SimpleMind轻量思维导图
摘要:SimpleMind是一款由国外开发者Nick Arnott推出的iOS开发者专用思维导图工具,该工具适用于Mac平台,系统最低要求为OS X 10.6.6.能够抛弃笨重的MindManager ...
- web VR框架 a-frame入门及生成360度全景页面的demo
官网首页地址:https://aframe.io/ 以往我们实现全景图片可以使用three.js,但是three.js渲染效果较差,且图片需要提前剪切成6张,使用体验比较差,深入学习需要一定的时间. ...
- iOS开发 - 利用js去除webview广告
找到要取出内容方法: 浏览器设置 -> 更多工具 -> 开发者工具 -> 手机模式(左下角 手机按钮) 点击手机图标左边那个搜索框 -> 然后点击你要隐藏的控件 选择到你要选择 ...
- 教学|怎样制作360度全景图,更炫更酷3D建模步骤
怎样制作360度全景图?现在大多数制作360度全景图都是用PS,很少会三维软件3DsMAX渲染出来,因为三维的需要3DMAX来制作和渲染,会更加的复杂,所以,下面这套<如何在3DsMAX中制作3 ...
- 如何进行 360 度反馈?
来源:tita.com 360度反馈流程:推荐方法 关于360 度反馈的一大争论 是如何收集数据.管理所选择的数据收集方法以及向参与者提供反馈.如果您提供 360 度反馈流程,您用于收集和共享信息的方 ...
- 通知模式实现两个textField传值及模态视图——iOS开发
通知模式实现两个textField传值及模态视图--iOS开发 利用通知模式,实现两个不同界面的textField之间的传值,在界面二输入字符,传值到前一界面的textField. 界面的切换,这里临 ...
- iOS开发--Mac下server搭建
前言 对于Mac电脑的认识.我一直停留在装B神器的意识上.就在前两天我彻底改变了庸俗的看法,当时忙着写毕业设计.苦于iOS开发没有server, 数据都是从网上抓取或本地plist文件,感觉不够高大上 ...
- IOS开发基础之绘图的样式
IOS开发基础之绘图的样式 // LJView.m // 33-绘图的样式 // Created by 鲁军 on 2021/2/23. #import "LJView.h" @i ...
最新文章
- $0,$?,$!,$-,$*,$@,$#等的特殊用法
- 在软盘上找不到id地址标记_记录一下我的群辉使用腾讯云域名解析IPv6地址
- 《Java 核心技术卷1 第10版》学习笔记------ 对象包装器、自动装箱、拆箱
- OpenGL polygonsmooth多边形平滑的实例
- Eclipse导入Tomcat源码
- 使用Lucid Virtu在有独立显卡的情况下使用Intel硬件加速H.264编码
- 数据结构与算法-概念
- linux内核的I2C子系统详解4——i2c-s3c2410.c文件中的adapter、algorithm
- 【Kafka】Kafka 0.10.0版本获取Kafka每个分区最新Offset的几种方法
- ERP 平台Sage X3被曝多个严重漏洞,系统可遭接管,存在潜在供应链风险
- c语言回文字符串判断函数的奇偶性,C语言拓展训练编程题.doc
- python支持xp32位系统吗_关于python在64位机器上打包32位exe(兼容xp系统)解决方法
- android 手机上设置呼叫转移
- 第二章 Hadoop序列化
- 惠斯通电桥你知道怎么用吗?
- 用c语言写一个简单的名人名言播放器
- Idea项目如何打包
- SAP PP配置详解之五:生产计划编制
- (一)树莓派系列教程:树莓派4B的入门使用
- 四季养生小技巧你知道吗?
热门文章
- Uncaught SyntaxError: Unexpected token {
- 排名第25位!众享比特连续两年上榜“北京民营企业中小百强”
- LeetCode 312. 戳气球(Java)
- mmdet2.7 doc
- php鼠标移动脚本,按键精灵鼠标移动脚本–eq
- 怎么做一个管理者和怎么成为一个管理者?
- 上传excel文件到服务器
- linux下的几个开源软件
- 马拦过河卒(C++)
- 贝壳找房 2019校招 研发类试卷C++ 编程题 2018.08.19