照相机技术(二)

  1 //定制拍照:
  2 public class MainActivity extends Activity {
  3     private Camera mCamera;
  4     private Preview mPreview;
  5
  6     @Override
  7     protected void onCreate(Bundle savedInstanceState) {
  8         super.onCreate(savedInstanceState);
  9         // setContentView(R.layout.fragment_main);
 10         // 隐藏标题
 11         requestWindowFeature(Window.FEATURE_NO_TITLE);
 12         // 设置为全屏
 13         getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
 14         mPreview = new Preview(this);
 15         setContentView(mPreview);
 16     }
 17
 18     @Override
 19     protected void onResume() {
 20         // TODO Auto-generated method stub
 21         super.onResume();
 22         // 第一步:打开照相机
 23         mCamera = Camera.open(0);
 24         mPreview.setCamera(mCamera);
 25     }
 26
 27     // 释放焦点
 28     @Override
 29     protected void onPause() {
 30         // TODO Auto-generated method stub
 31         super.onPause();
 32         if (mCamera != null) {
 33             mCamera.release();
 34             mCamera = null;
 35             mPreview.setCamera(null);
 36         }
 37     }
 38
 39     // 第三步:添加回调事件监听器SurfaceHolder.addCallback
 40     class Preview extends ViewGroup implements SurfaceHolder.Callback,
 41             OnClickListener {
 42         SurfaceView mSurfaceView;
 43         SurfaceHolder mHolder;
 44         Size mPreviewSize;
 45         List<Size> msupportedPreviewSizes;
 46         Camera mCamera;
 47         Context mContext;
 48
 49         public Preview(Context context) {
 50             super(context);
 51             // TODO Auto-generated constructor stub
 52             mContext = context;
 53             mSurfaceView = new SurfaceView(context);
 54             addView(mSurfaceView);
 55             mHolder = mSurfaceView.getHolder();
 56             mHolder.addCallback(this);
 57         }
 58
 59         public void setCamera(Camera camera) {
 60             mCamera = camera;
 61             if (mCamera != null) {
 62                 // 获得所有预览尺寸
 63                 msupportedPreviewSizes = mCamera.getParameters()
 64                         .getSupportedPictureSizes();
 65                 requestLayout();
 66
 67             }
 68         }
 69
 70         @Override
 71         public void surfaceCreated(SurfaceHolder holder) {
 72             // TODO Auto-generated method stub
 73             try {
 74                 if (mCamera != null) {
 75                     // 将Camera和SurfaceView关联
 76                     mCamera.setPreviewDisplay(holder);
 77                 }
 78             } catch (Exception e) {
 79                 // TODO: handle exception
 80             }
 81         }
 82
 83         private PictureCallback mpPictureCallback = new PictureCallback() {
 84
 85             @Override
 86             public void onPictureTaken(byte[] data, Camera camera) {
 87                 mCamera.startPreview();
 88                 File pictureFile = new File("/sdcard/image.jpg");
 89                 try {
 90                     FileOutputStream fos = new FileOutputStream(pictureFile);
 91                     fos.write(data);
 92                     fos.close();
 93                 } catch (Exception e) {
 94                     // TODO: handle exception
 95                 }
 96             }
 97         };
 98
 99         @Override
100         public void surfaceChanged(SurfaceHolder holder, int format, int width,
101                 int height) {
102
103             // 设置最佳预览尺寸
104             Camera.Parameters parameters = mCamera.getParameters();
105
106             parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
107
108             mCamera.setParameters(parameters);
109             mCamera.startPreview();
110         }
111
112         @Override
113         public void surfaceDestroyed(SurfaceHolder holder) {
114             // TODO Auto-generated method stub
115             if (mCamera != null) {
116                 mCamera.stopPreview();
117             }
118         }
119
120         @Override
121         protected void onLayout(boolean changed, int l, int t, int r, int b) {
122             // 使预览和实际窗口大小一致
123             if (changed && getChildCount() > 0) {
124                 final View child = getChildAt(0);
125                 int width = r - l;
126                 int height = b - t;
127                 int previewWidth = width;
128                 int previewHeight = height;
129                 if (mPreviewSize != null) {
130                     previewWidth = mPreviewSize.width;
131                     previewHeight = mPreviewSize.height;
132
133                 }
134                 // 手机屏幕的宽高比大于采集图像的宽高比
135                 if (width * previewHeight > height * previewWidth) {
136                     final int scaledChildWidth = previewWidth * height
137                             / previewHeight;
138                     // child.layout((width - scaledChildWidth) / 2, 0,
139                     // (width + scaledChildWidth) / 2, height);
140                     child.layout(100, 100, 340, 240);// 设置照相框位置
141                 } else {
142                     final int scaledChildHeight = previewWidth * width
143                             / previewWidth;
144                     child.layout(0, (height - scaledChildHeight) / 2, width,
145                             (height + scaledChildHeight) / 2);
146                 }
147             }
148
149         }
150
151         private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {
152
153             double ASPECT_TOLERANCE = 0.1;
154             double targetRatio = (double) w / h;
155             if (sizes == null) {
156                 return null;
157             }
158             Size optimalSize = null;
159             double minDiff = Double.MAX_VALUE;
160             int targetHeight = h;
161             for (Size size : sizes) {
162
163                 double ratio = (double) size.width / size.height;
164                 if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) {
165                     continue;
166                 }
167                 if (Math.abs(size.height - targetHeight) < minDiff) {
168                     optimalSize = size;
169                     minDiff = Math.abs(size.height - targetHeight);
170                 }
171
172             }
173             if (optimalSize == null) {
174                 minDiff = Double.MAX_VALUE;
175                 for (Size size : sizes) {
176
177                     if (Math.abs(size.height - targetHeight) < minDiff) {
178                         optimalSize = size;
179                         minDiff = Math.abs(size.height - targetHeight);
180                     }
181
182                 }
183             }
184
185             return optimalSize;
186
187         }
188
189         @Override
190         protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
191             // TODO Auto-generated method stub
192             super.onMeasure(widthMeasureSpec, heightMeasureSpec);
193             int width = resolveSize(getSuggestedMinimumWidth(),
194                     widthMeasureSpec);
195             int height = resolveSize(getSuggestedMinimumHeight(),
196                     heightMeasureSpec);
197             setMeasuredDimension(width, height);
198             if (msupportedPreviewSizes != null) {
199                 mPreviewSize = getOptimalPreviewSize(msupportedPreviewSizes,
200                         width, height);
201             }
202
203         }
204
205         @Override
206         public void onClick(View v) {
207             // TODO Auto-generated method stub
208             mCamera.takePicture(null, null, mpPictureCallback);
209         }
210
211     }
212
213 }
时间: 2024-10-20 06:09:02

照相机技术(二)的相关文章

C#线程同步技术(二) Interlocked 类

接昨天谈及的线程同步问题,今天介绍一个比较简单的类,Interlocked.它提供了以线程安全的方式递增.递减.交换和读取值的方法. 它的特点是: 1.相对于其他线程同步技术,速度会快很多. 2.只能用于简单的同步问题. 比叫好理解,不再赘述,给一个我们常用的单例模式的 Interlocked 实现: class SourceManager { private SourceManager() { } private static SourceManager sourceManager; publ

19、照相机技术

照相机有哪些功能 Android SDK支持操作Android设备内置的照相机.从Android2.3开始,支持操作多个摄像头(主要指前置摄像头和后置照相机).通过照相机可以拍照和录像. 编写拍照程序需要考虑哪些方面 是否支持照相机 快速拍照和定制拍照 存储 照相机涉及到的主要API Camera SurfaceView. MediaRecorder Intent 拍照和摄像程序可能涉及到的权限和特性 <uses-permission android:name="android.permi

早期主流的WLAN技术(二)

4.1  802.11a IEEE 802.11a是802.11原始标准的一个修订标准,于1999年获得批准.802.11a标准采用了与原始标准相同的核心协议,工作频率为5GHz,使用52个正交频分多路复用载波,最大原始数据传输率为54Mb/s,这达到了现实网络中等吞吐量(20Mb/s)的要求.如果需要的话,数据率可降为48,36,24,18,12,9或者6Mb/s.802.11a拥有12条不相互重叠的频道,8条用于室内,4条用于点对点传输.它不能与IEEE 802.11b进行互操作,除非使用了

负载均衡技术(二)———常用负载均衡服务介绍

此文已由作者张小刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 在上一篇文章中,介绍了负载均衡服务,常用的负载均衡服务器以及负载均衡服务在公司的应用情况.这一篇文章会对上篇提到的负载均衡服务器进行较为深入的分析,对其主要功能,优缺点,使用场景进行介绍.希望可以起到抛砖引玉的左右,对大家在了解,使用不同的负载均衡服务有所帮助. LVS LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个基于Linux的负载均衡服务器.LVS项目在19

spring 技术(二) ----- IOC

spring 技术 ---  控制反转(IOC)  也叫依赖注入(DI) (1)基于setter方法的注入 (2)基于构造函数的注入 (3)Bean之间的引用 1. 新建一个Java Project.名为springtest2.然后新建一个package.名为com.gxcme.springtest2. 2. 加入spring框架. 3.新建一个Interface.名为helloInterface.java. 4.新建一个class.名为helloImpl.java.继承helloInterfa

Android摄像头照相机技术-android学习之旅(八)

简介 Android SDK支持Android设备内置的照相机.从Android2.3开始支持多个摄像头(主要指前置摄像头和后置摄像头).通过照片相可以拍照和录像. 需要考虑的问题 是否支持照相机 快速拍照还是定制拍照 存储问题 照相机涉及的主要API Intent听过action来启动系统的相机 Camera SurfaceView MediaRecorder(录像) 权限 "android.permission.CAMERA" "android.permission.WR

XML学习总结-XPATH技术-(二)

XPATH技术 当使用dom4j查询比较深的层次结构的节点(标签,文本,属性)时,比较麻烦,所以出现了xpath技术 XPATH作用:用于快速获取所需节点对象 在dom4j中如何使用xPath技术 1)导入xPath支持jar包 .  jaxen-1.1-beta-6.jar 2)使用xpath方法 List <Node>  selectNodes("xpath表达式");   查询多个节点对象 Node       selectSingleNode("xpath

Smarty模板引擎技术(二)

一.使用Smarty模板引擎步骤 第一步:引入smarty核心类文件并创建一个smarty实例对象: include_once “libs/smarty/Smarty.class.php”; $smarty=new Smarty(); 第二步:对核心类中属性或变量的配置 $smarty->template_dir=”./templates”; $smarty->compile_dir=”./templates_c”; $smarty->config_dir=”./configs”; $s

Lucence.net索引技术 二

一. Lucene索引创建和优化 [版本2.9.0以上] Lucene索引的创建首先需要取得几个必须的对象: 1.分词器//可以采用其他的中文分词器 StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_CURRENT);//分词器 2.lucene目录 File dir = new File(indexDir);// indexDir为文件路径 //这种目录存在锁机制,在打开目录时,写的权利一次只分给一个用户:有效保证了