当前位置: 首页 > news >正文

Android studio 既想拍照又想拿到Bitmap

!!安卓千万不要用YUV,不要想着去YUV转RGB,转出来会有乱码

package com.nio.rpcsample;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.ImageFormat;
import android.hardware.camera2.CameraManager;
import android.util.Base64;
import android.util.Log;
import android.media.Image;
import java.nio.ByteBuffer;
// 其他 import 保持不变import androidx.annotation.NonNull;
import androidx.camera.core.CameraSelector;
import androidx.camera.core.ImageCapture;
import androidx.camera.core.ImageCaptureException;
import androidx.camera.core.ImageProxy;
import androidx.camera.lifecycle.ProcessCameraProvider;
import androidx.core.content.ContextCompat;import com.google.common.util.concurrent.ListenableFuture;import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;import java.util.List;
import java.util.ArrayList;
import androidx.camera.core.CameraInfo;
import androidx.camera.camera2.interop.Camera2CameraInfo;public class TakePicture {private final Context context;private final Executor executor;private ImageCapture imageCapture;private CameraManager cameraManager;public TakePicture(Context context, Executor executor) {this.context = context;this.executor = executor;}public void initCamera(String cameraId) {ListenableFuture<ProcessCameraProvider> cameraProviderFuture =ProcessCameraProvider.getInstance(context);cameraProviderFuture.addListener(() -> {try {ProcessCameraProvider cameraProvider = cameraProviderFuture.get();cameraProvider.unbindAll();CameraSelector selector = new CameraSelector.Builder().addCameraFilter(cameras -> {List<CameraInfo> matched = new ArrayList<>();for (CameraInfo info : cameras) {String id = Camera2CameraInfo.from(info).getCameraId();Log.e("CameraInfo", id);if (id.equals(cameraId)) matched.add(info);}return matched;}).build();// 这个接口千万不要设置YUV888,就采用默认的JPEG格式,这样即直接落盘,不需要做数据转换,又可以直接采用imageproxy直接使用(避免重复IO)imageCapture = new ImageCapture.Builder().setTargetResolution(new android.util.Size(2816, 568)).build(); //// 这里只绑定拍照用例cameraProvider.bindToLifecycle((androidx.lifecycle.LifecycleOwner) context,selector,imageCapture);} catch (ExecutionException | InterruptedException e) {e.printStackTrace();}}, ContextCompat.getMainExecutor(context));}public void takePicture(int index, String batch, OnImageProcessedListener listener) {if (imageCapture == null) {Log.e("takePicture", "Camera not initialized");return;}imageCapture.takePicture(executor, new ImageCapture.OnImageCapturedCallback() {@Overridepublic void onCaptureSuccess(@NonNull ImageProxy image) {// 1️⃣ 获取 JPEG byte[]Image img = image.getImage();if (img != null && img.getFormat() == ImageFormat.JPEG) {ByteBuffer buffer = img.getPlanes()[0].getBuffer();byte[] bytes = new byte[buffer.remaining()];buffer.get(bytes);// 2️⃣ BitmapBitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);// 3️⃣ 保存文件File photoFile = new File(context.getCacheDir(),"huang_" + System.currentTimeMillis() + ".jpg");try (FileOutputStream fos = new FileOutputStream(photoFile)) {fos.write(bytes);fos.flush();} catch (IOException e) {Log.e("TakePicture", "Failed to save bitmap", e);}}image.close();}@Overridepublic void onError(@NonNull ImageCaptureException exception) {Log.e("TakePicture", "Image capture failed", exception);}});}
}

文章转载自:

http://xQTiDSyb.ghqyr.cn
http://PGYzx1zp.ghqyr.cn
http://GszNWJz0.ghqyr.cn
http://sequx0s6.ghqyr.cn
http://anZ6BfzG.ghqyr.cn
http://CRFum58P.ghqyr.cn
http://FGN37UAM.ghqyr.cn
http://fWsq4b0e.ghqyr.cn
http://oSbM7Ocr.ghqyr.cn
http://QiN9WMVn.ghqyr.cn
http://zRk9ubQQ.ghqyr.cn
http://LI1J2uzc.ghqyr.cn
http://XgMKI8Dy.ghqyr.cn
http://pTlPAVpF.ghqyr.cn
http://q9ozl2wN.ghqyr.cn
http://gfjpDEXC.ghqyr.cn
http://qzoypbzx.ghqyr.cn
http://dab9bkMm.ghqyr.cn
http://ulOzzz6E.ghqyr.cn
http://rtgfoSyG.ghqyr.cn
http://FLM1flJo.ghqyr.cn
http://C1waPwVb.ghqyr.cn
http://IXjsNrlF.ghqyr.cn
http://SBCmjMfT.ghqyr.cn
http://vBhE7B7U.ghqyr.cn
http://eFelz8u5.ghqyr.cn
http://2af6kjIR.ghqyr.cn
http://RZ2U1Ywx.ghqyr.cn
http://BleUigE4.ghqyr.cn
http://rGKOWVXd.ghqyr.cn
http://www.dtcms.com/a/369089.html

相关文章:

  • 自由泳动作分解与技巧详解
  • 音响皇帝BO,牵手全球第一AR眼镜雷鸟,耳机党坐不住了?
  • Redis 高级数据结构:Bitmap、HyperLogLog、GEO 深度解析
  • 深度学习——迁移学习
  • 【uniapp】打包为h5在保留头部标题的同时配置网站标题不跟随页面路由更新
  • uni-app iOS 日志与崩溃分析全流程 多工具协作的实战指南
  • bat脚本- 将jar 包批量安装到 Maven 本地仓库
  • 力扣hot100:旋转图像(48)(详细图解以及核心思路剖析)
  • U盘文件系统转换指南:方法、原因与注意事项
  • AI智能优化SEO关键词策略实战
  • 共享线程池对@Scheduled定时任务的影响
  • 一张图看懂AI时代后端系统架构
  • 人工智能学习:什么是GRU模型
  • 高效管理网络段和端口集合的工具之ipset
  • 为什么要用VR全景?5个答案告诉你
  • 【Linux学习笔记】信号的深入理解之软件条件产生信号
  • 前端事件循环:代码世界的“排队”艺术!
  • JP4-7-MyLesson后台前端(一)
  • PPIO上线kimi-k2-0905,编码能力大幅提升
  • UniApp 页面通讯方案全解析:从 API 到状态管理的最佳实践
  • 嵌入式|Linux中打开视频流的两种方式V4l2和opencv
  • VBA 中的 Excel 工作表函数
  • Unix/Linux 平台通过 IP 地址获取接口名的 C++ 实现
  • EXCEL列数据前面补零
  • Big Data Analysis
  • 拿到一组数据在mars3d上渲染报错排查思路
  • 力扣hot100:搜索二维矩阵 II(常见误区与高效解法详解)(240)
  • 《从报错到运行:STM32G4 工程在 Keil 中的头文件配置与调试实战》
  • Meta AI眼镜Hypernova量产临近,微美全息构筑护城河引领人机交互变革浪潮
  • SQL表一共有几种写入方式