前言

初做全景项目,涉及到了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度全景预览图,附选择本地全景图片并生成全景预览...相关推荐

  1. iOS开发 动画(Animation)图片360度不停旋转

    {     CGFloat angle; } - (void)viewDidLoad {     [super viewDidLoad];     angle = 0;     [self start ...

  2. iOS开发必备工具:SimpleMind轻量思维导图

    摘要:SimpleMind是一款由国外开发者Nick Arnott推出的iOS开发者专用思维导图工具,该工具适用于Mac平台,系统最低要求为OS X 10.6.6.能够抛弃笨重的MindManager ...

  3. web VR框架 a-frame入门及生成360度全景页面的demo

    官网首页地址:https://aframe.io/ 以往我们实现全景图片可以使用three.js,但是three.js渲染效果较差,且图片需要提前剪切成6张,使用体验比较差,深入学习需要一定的时间. ...

  4. iOS开发 - 利用js去除webview广告

    找到要取出内容方法: 浏览器设置 -> 更多工具 -> 开发者工具 -> 手机模式(左下角 手机按钮) 点击手机图标左边那个搜索框 -> 然后点击你要隐藏的控件 选择到你要选择 ...

  5. 教学|怎样制作360度全景图,更炫更酷3D建模步骤

    怎样制作360度全景图?现在大多数制作360度全景图都是用PS,很少会三维软件3DsMAX渲染出来,因为三维的需要3DMAX来制作和渲染,会更加的复杂,所以,下面这套<如何在3DsMAX中制作3 ...

  6. 如何进行 360 度反馈?

    来源:tita.com 360度反馈流程:推荐方法 关于360 度反馈的一大争论 是如何收集数据.管理所选择的数据收集方法以及向参与者提供反馈.如果您提供 360 度反馈流程,您用于收集和共享信息的方 ...

  7. 通知模式实现两个textField传值及模态视图——iOS开发

    通知模式实现两个textField传值及模态视图--iOS开发 利用通知模式,实现两个不同界面的textField之间的传值,在界面二输入字符,传值到前一界面的textField. 界面的切换,这里临 ...

  8. iOS开发--Mac下server搭建

    前言 对于Mac电脑的认识.我一直停留在装B神器的意识上.就在前两天我彻底改变了庸俗的看法,当时忙着写毕业设计.苦于iOS开发没有server, 数据都是从网上抓取或本地plist文件,感觉不够高大上 ...

  9. IOS开发基础之绘图的样式

    IOS开发基础之绘图的样式 // LJView.m // 33-绘图的样式 // Created by 鲁军 on 2021/2/23. #import "LJView.h" @i ...

最新文章

  1. $0,$?,$!,$-,$*,$@,$#等的特殊用法
  2. 在软盘上找不到id地址标记_记录一下我的群辉使用腾讯云域名解析IPv6地址
  3. 《Java 核心技术卷1 第10版》学习笔记------ 对象包装器、自动装箱、拆箱
  4. OpenGL polygonsmooth多边形平滑的实例
  5. Eclipse导入Tomcat源码
  6. 使用Lucid Virtu在有独立显卡的情况下使用Intel硬件加速H.264编码
  7. 数据结构与算法-概念
  8. linux内核的I2C子系统详解4——i2c-s3c2410.c文件中的adapter、algorithm
  9. 【Kafka】Kafka 0.10.0版本获取Kafka每个分区最新Offset的几种方法
  10. ERP 平台Sage X3被曝多个严重漏洞,系统可遭接管,存在潜在供应链风险
  11. c语言回文字符串判断函数的奇偶性,C语言拓展训练编程题.doc
  12. python支持xp32位系统吗_关于python在64位机器上打包32位exe(兼容xp系统)解决方法
  13. android 手机上设置呼叫转移
  14. 第二章 Hadoop序列化
  15. 惠斯通电桥你知道怎么用吗?
  16. 用c语言写一个简单的名人名言播放器
  17. Idea项目如何打包
  18. SAP PP配置详解之五:生产计划编制
  19. (一)树莓派系列教程:树莓派4B的入门使用
  20. 四季养生小技巧你知道吗?

热门文章

  1. Uncaught SyntaxError: Unexpected token {
  2. 排名第25位!众享比特连续两年上榜“北京民营企业中小百强”
  3. LeetCode 312. 戳气球(Java)
  4. mmdet2.7 doc
  5. php鼠标移动脚本,按键精灵鼠标移动脚本–eq
  6. 怎么做一个管理者和怎么成为一个管理者?
  7. 上传excel文件到服务器
  8. linux下的几个开源软件
  9. 马拦过河卒(C++)
  10. 贝壳找房 2019校招 研发类试卷C++ 编程题 2018.08.19