很久不写博客了,这几年忙忘了,今天突然发现之前写的博客帮了不少需要的人,觉得还是比较有意思的,今天给大家一个干货,也是我们在开发过程中的问题,当我们做人脸识别或者vin码识别的时候,会发现如果你打开摄像头预览拍照成图片,然后用图片识别技术,这样手机会闪一下或者暂停一下,还有当我们发动态视频的时候,视频的封面用什么显示,微信也是如此,这问题其实也很简单,只需要在我们视频预览的时候获取第一祯就可以解决!
第一步打开摄像头预览
public Camera getCamera() { if (mCamera == null) { try { boolean connected = false; for (int camIdx = 0; camIdx < getNumberOfCameras(); ++camIdx) { try { mCamera = Camera.open(camIdx); connected = true; } catch (Exception e) { Log.e("TAG", "请检查摄像头!"); } if (connected) break; } } catch (Exception e) { mCamera = null; } } return mCamera; }
第二步
Camera.Size previewSize = mCamera.getParameters().getPreviewSize();//获取尺寸,格式转换的时候要用到
Bitmap bitmap=nv21ToBitmap(picData, previewSize.width, previewSize.height);
/** * 视频祯转成位图 * * @param nv21 * @param width * @param height * @return */ private static Bitmap nv21ToBitmap(byte[] nv21, int width, int height) { Bitmap bitmap = null; try { YuvImage image = new YuvImage(nv21, ImageFormat.NV21, width, height, null); ByteArrayOutputStream stream = new ByteArrayOutputStream(); image.compressToJpeg(new Rect(0, 0, width, height), 40, stream); bitmap = BitmapFactory.decodeByteArray(stream.toByteArray(), 0, stream.size()); stream.close(); } catch (IOException e) { e.printStackTrace(); } return bitmap; }
/**
转成二进制流
**/
public static String bitmapToBase64(Bitmap bitmap) { // Log.e("yangfan","bitmap1 = "+bitmap); // 要返回的字符串 String reslut = null; ByteArrayOutputStream baos = null; try { if (bitmap != null) { baos = new ByteArrayOutputStream(); /** * 压缩只对保存有效果bitmap还是原来的大小 */ bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); // Log.e("yangfan","bitmap2 = "+bitmap); baos.flush(); baos.close(); // 转换为字节数组 byte[] byteArray = baos.toByteArray(); // 转换为字符串 reslut = Base64.encodeToString(byteArray, Base64.DEFAULT); } else { return null; } } catch (IOException e) { e.printStackTrace(); } finally { try { if (baos != null) { baos.close(); } } catch (IOException e) { e.printStackTrace(); } } return reslut; }