unity3D调用外接摄像头,保存图片、不使用截屏方式

首先感谢前辈使用截屏的方式调用外接摄像头并保存图片:http://blog.csdn.net/a112634313/article/details/8472786

Texture2D处理http://www.narkii.com/club/thread-291958-1.html

不多说,直接上我的代码

using UnityEngine;
using System.Collections;
using System.IO; 

public class CameraTest : MonoBehaviour
{
	public GameObject obj;
	WebCamTexture cameraTexture;
	string cameraName="";
	private bool isPlay = false;
	// Use this for initialization
	void Start()
	{
		StartCoroutine(Test());
	}  

	// Update is called once per frame
	void Update()
	{
		obj.renderer.material.mainTexture=cameraTexture;
	}
	IEnumerator Test()
	{
		yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);
		if (Application.HasUserAuthorization(UserAuthorization.WebCam))
		{
			WebCamDevice[] devices = WebCamTexture.devices;
			cameraName = devices[0].name;
			cameraTexture = new WebCamTexture(cameraName, 400, 300, 15);
			cameraTexture.Play();
			isPlay = true;
		}
	}
	void OnGUI()
	{
		if (isPlay)
		{
			GUI.DrawTexture(new Rect(0, 0, 400, 300), cameraTexture, ScaleMode.ScaleToFit);
		}
		if(GUI.Button(new Rect(400,0,450,50),"保存")){
			StartCoroutine(getTexture2d());

		}
		if(GUI.Button(new Rect(400,50,450,50),"AR")){
			Application.LoadLevel("HelloWorld");
			cameraTexture.Stop();
		}
	}
	IEnumerator getTexture2d()
	{
		yield return new WaitForEndOfFrame();
		//Texture2D savedTexture ;//要保存图片的大小
		//截取的区域
		Texture2D savedTexture=obj.renderer.material.mainTexture as Texture2D;
		//截图方式
		/*
		  Texture2D t = new Texture2D(200, 200);//要保存图片的大小
//截取的区域
		t.ReadPixels(new Rect(0,cameraTexture.height, 400, 300), 0, 0, false);
t.Apply();
//把图片数据转换为byte数组
byte[] byt = t.EncodeToPNG();
//然后保存为图片
		File.WriteAllBytes(Application.dataPath + "/StreamingAssets/TutorialHelloWorld/"+"target1.png", byt);
}*/
		Texture2D texture = new Texture2D(cameraTexture.width, cameraTexture.height);
		int y = 0;
		while (y < texture.height)
		{
			int x = 0;
			while (x < texture.width)
			{
				Color color = cameraTexture.GetPixel(x, y);
				texture.SetPixel(x, y, color);
				++x;
			}
			++y;
		}
		texture.Apply();
	byte[] pngData = texture.EncodeToPNG();
		File.WriteAllBytes(Application.dataPath + "/StreamingAssets/TutorialHelloWorld/"+"target1.png", pngData);
	}
}  

说明一下,在场景中添加一个plane,我的目的就是将camera作为贴图放到panel上面来实时显示,因为我发现WebCamTexture 不能直接作为Texture2D直接使用

之后点击保存按钮,将图片保存到指定路径:注意路径可以修改,不过没有的话它不会自己创建、会报错。看看结果

这样做和截屏相比有什么好处呢,我觉得:

1、截屏坐标需要你自己调节,unity3d默认坐标原点和截屏时候坐标原点是不一致的,一个在左上角一个在左下角,调节很麻烦

2、截屏方法一旦屏幕分辨率变化那么你的程序也要相应变化,不然会出问题

3、这种方式可以直接放到plane上或者任何Texture2D上,有很大的自由性,同时不需要担心图片是不是完整、有没有其他杂质什么的,摄像头获取的是什么,那么保存的图片就是什么。

时间: 2024-10-14 08:24:03

unity3D调用外接摄像头,保存图片、不使用截屏方式的相关文章

Snipaste强大离线/在线截屏软件的下载、安装和使用

步骤一: https://zh.snipaste.com/  ,去此官网下载. 步骤二:由于此是个绿色软件,直接解压即可. 步骤三:使用,见官网.ttps://zh.snipaste.com  按F1开始截屏 感谢下面哥的精彩微信文章 http://mp.weixin.qq.com/s?__biz=MzIwNzYwODYwMw==&mid=2247483903&idx=1&sn=02121fe920320bbe7b2fae012a18e70a&chksm=970e8f8ba

分享一种全新的截屏方法

一种全新的截屏方法 在任何时候点击手机上的浮动小球(红色圈内)就能完成整个屏幕信息的截取功能,而且最终保存的图像还不会包含该小球,这就是本文将要介绍的方法.手机整体屏幕获取项目下载链接:http://files.cnblogs.com/files/tgyf/CaptureScreen.rar. 以全新的视角实现手机屏幕的截取(快照)功能,文章可能比较长,感兴趣的朋友一定得看完,会有收获的哦!若发现有哪些地方存在问题或某些功能有更好的实现方式,欢迎指点,先谢过(我可以尽快改正或完善,以免继续误导别

android源码解析(二十六)--&gt;截屏事件流程

今天这篇文章我们主要讲一下Android系统中的截屏事件处理流程.用过android系统手机的同学应该都知道,一般的android手机按下音量减少键和电源按键就会触发截屏事件(国内定制机做个修改的这里就不做考虑了).那么这里的截屏事件是如何触发的呢?触发之后android系统是如何实现截屏操作的呢?带着这两个问题,开始我们的源码阅读流程. 我们知道这里的截屏事件是通过我们的按键操作触发的,所以这里就需要我们从android系统的按键触发模块开始看起,由于我们在不同的App页面,操作音量减少键和电

使用 JavaScript 截屏

经常在微博上看到很多内容使用的什么长微博截图,并且截图上还附加了很多其他的信息.之前对纯前端截图有些研究,正好本博客有这个需求,今天就把这东西实现了下. 需要声明的是,JavaScript 目前还不能实现网页截屏,就算以后能够实现,也一定是浏览器提供了相关接口,JS 去调用这些接口.既然不能截屏,那我们能做的只有通过拿到像素点的信息来"拼凑"图片. 先说说我们看到的截屏方式 用过 phantomJS 的同学都知道,它提供了一个截屏函数,通过它可以整屏获取页面截图,而且他支持的格式也比较

Android中利用命令行进行截屏并导出到电脑上

声明:本博客为原创博客,未经允许,不得转载!原文链接为http://blog.csdn.net/bettarwang/article/details/27819525 大多数人最常用的截屏方法可能就是利用手机的快捷按键了,但是那样如果要导入到电脑中效率会比较低.实际上有更好的截屏方式,最简单的当然就是利用Eclipse中的DDMS进行截屏了,点击"Screen Capture"按钮后等待10多秒,然后就可直接利用Save按钮保存到电脑中. 显然,由于要进行图片显示的原因,在DDMS中会

HTML5调用手机摄像头,仅仅支持OPPOHD浏览器

1 <!doctype html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>HTML5调用手机摄像头,仅仅支持OPPOHD浏览器</title> 6 <style> 7 #video { border: 1px solid #ccc; display:inline-block; } 8 #canvas

Unity3D游戏开发之如何截屏的技能培训

下面我们开始今天的Unity3D技能培训. 我们学习Unity3D培训目标:让U3D初学者可以更快速的掌握U3D技术,自行制作修改素材,可以独立完成2D.3D小规模游戏及网页游戏开发. 今天我们来做点简单的东西,做个什么呢?答案就是截屏.作为一名热爱单机游戏的玩家,每次在玩游戏的同时截取游戏中比较喜欢的画面,特别是学习了Unity3D以后玩游戏的时候更多地是从一个游戏设计者的角度来看待游戏,换句话说,可能关注技术的成分更多一点吧.比如在写<Unity3D游戏开发之自由视角下的角色控制>和<

利用html5调用本地摄像头拍照上传图片[转]

利用html5调用本地摄像头拍照上传图片 html5概念啥的就不废话了,不知道的 百度, 谷歌一堆..今天学了学html5中的Canvas结合新增的<video>标签来获取本地摄像头,在html5之前,要在浏览器获取本地摄像头只有通过插件(ActiveX,但是这种只有IE支持)或者是flash来获取(或许你没学过flash那就很坑爹了),在之后微软的silvertlight中也可以获取,但这些都比较麻烦,在html5的世界里,要获取本地摄像头,只要配合js就可以轻松获取.. 目前支持html5

Unity调用PC摄像头

转载于Unity3d圣典里面,具体哪位大侠写的我忘咯. using UnityEngine; using System.Collections; public class CameraTest : MonoBehaviour { public string deviceName; WebCamTexture tex; // Use this for initialization IEnumerator Start() { //获取授权 yield return Application.Reque