From efa5fe48ebc866ec07a597ef551cf7e13c3b7aba Mon Sep 17 00:00:00 2001
From: whycxzp <glperry@163.com>
Date: 星期六, 27 七月 2024 17:27:02 +0800
Subject: [PATCH] 更新单摄像头的AR方案

---
 app/src/main/java/com/whyc/util/BitmapUtil.java |  104 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 104 insertions(+), 0 deletions(-)

diff --git a/app/src/main/java/com/whyc/util/BitmapUtil.java b/app/src/main/java/com/whyc/util/BitmapUtil.java
index c70b480..8f9d690 100644
--- a/app/src/main/java/com/whyc/util/BitmapUtil.java
+++ b/app/src/main/java/com/whyc/util/BitmapUtil.java
@@ -2,18 +2,30 @@
 
 import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
 import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
+import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.Locale;
 
 import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
+import android.graphics.ImageFormat;
 import android.graphics.Matrix;
 //import android.support.media.ExifInterface;
+import android.graphics.Rect;
+import android.graphics.YuvImage;
 import android.media.ExifInterface;
+import android.media.Image;
 import android.os.Environment;
+import android.renderscript.RenderScript;
+import android.renderscript.ScriptIntrinsicYuvToRGB;
+
+import static android.os.Environment.DIRECTORY_DOCUMENTS;
 
 public class BitmapUtil {
 
@@ -115,4 +127,96 @@
             e.printStackTrace();
         }
     }
+
+    private static ByteArrayOutputStream stream = new ByteArrayOutputStream();
+    /**灏唍v21鏁版嵁杞崲涓築itmap*/
+    public static Bitmap nv21ToBitmap(byte[] nv21, int width, int height) {
+        Bitmap bitmap = null;
+        YuvImage image = new YuvImage(nv21, ImageFormat.NV21, width, height, null);
+        //杈撳嚭鍒板搴旀祦
+        image.compressToJpeg(new Rect(0, 0, width, height), 100, stream);
+        //瀵瑰簲瀛楄妭娴佺敓鎴恇itmap
+        bitmap = BitmapFactory.decodeByteArray(stream.toByteArray(), 0, stream.size());
+        //閬垮厤涓棿鐨刡yte鏁扮粍杞崲姝ラ锛岀洿鎺ヤ粠YuvImage鍐欏叆ByteBuffer锛岀劧鍚庝娇鐢˙itmapFactory鐨勭浉搴旀柟娉曠洿鎺ヤ粠ByteBuffer鍒涘缓Bitmap
+        stream.reset();
+        return bitmap;
+    }
+
+    /**淇濆瓨bitmap鍒版枃浠�*/
+    public static void saveBitmapToFile(Bitmap bitmap) {
+        // 瀹氫箟鍥剧墖鐨勪繚瀛樿矾寰勫拰鏂囦欢鍚�
+        String fileName = "IMG_" + System.currentTimeMillis() + ".jpg";
+        String filePath = Environment.getExternalStoragePublicDirectory(DIRECTORY_DOCUMENTS).getAbsolutePath()  + "/yc_test"+ File.separator + fileName;
+        try(
+            FileOutputStream fos = new FileOutputStream(filePath);
+            BufferedOutputStream bos = new BufferedOutputStream(fos);
+        ){
+            bitmap.compress(Bitmap.CompressFormat.JPEG, 99, bos);
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }finally {
+            bitmap.recycle();
+        }
+    }
+
+    /**
+     * 閬垮厤涓棿鐨刡yte鏁扮粍杞崲姝ラ锛岀洿鎺ヤ粠YuvImage鍐欏叆ByteBuffer锛岀劧鍚庝娇鐢˙itmapFactory鐨勭浉搴旀柟娉曠洿鎺ヤ粠ByteBuffer鍒涘缓Bitmap
+     * */
+    /*public static Bitmap yuvToBitmap(Image image, int width, int height) {
+        //鑾峰彇YUV鏁版嵁
+        *//*int I420size = image.getWidth()*image.getHeight()*3/2;
+        byte[] nv21 = new byte[I420size];
+        Image.Plane[] planes = image.getPlanes();
+        int remaining0 = planes[0].getBuffer().remaining();
+        int remaining1 = planes[1].getBuffer().remaining();
+        int remaining2 = planes[2].getBuffer().remaining();
+        //鍒嗗埆鍑嗗涓変釜鏁扮粍鎺ユ敹YUV鍒嗛噺銆�
+        byte[] yRawSrcBytes = new byte[remaining0];
+        byte[] uRawSrcBytes = new byte[remaining1];
+        byte[] vRawSrcBytes = new byte[remaining2];
+        planes[0].getBuffer().get(yRawSrcBytes);
+        planes[1].getBuffer().get(uRawSrcBytes);
+        planes[2].getBuffer().get(vRawSrcBytes);*//*
+
+        int W = image.getWidth();
+        int H = image.getHeight();
+
+        Image.Plane Y = image.getPlanes()[0];
+        Image.Plane U = image.getPlanes()[1];
+        Image.Plane V = image.getPlanes()[2];
+
+        int Yb = Y.getBuffer().remaining();
+        int Ub = U.getBuffer().remaining();
+        int Vb = V.getBuffer().remaining();
+
+        byte[] data = new byte[Yb + Ub + Vb];
+
+
+        Y.getBuffer().get(data, 0, Yb);
+        V.getBuffer().get(data, Yb, Vb);
+        U.getBuffer().get(data, Yb + Vb, Ub);
+
+
+
+        RenderScript rs = RenderScript.create(context);
+        ScriptIntrinsicYuvToRGB yuvToRgbIntrinsic = ScriptIntrinsicYuvToRGB.create(rs, Element.U8_4(rs));
+
+        Type.Builder yuvType = new Type.Builder(rs, Element.U8(rs)).setX(data.length);
+        Allocation in = Allocation.createTyped(rs, yuvType.create(), Allocation.USAGE_SCRIPT);
+
+        Type.Builder rgbaType = new Type.Builder(rs, Element.RGBA_8888(rs)).setX(W).setY(H);
+        Allocation out = Allocation.createTyped(rs, rgbaType.create(), Allocation.USAGE_SCRIPT);
+
+        final Bitmap bmpout = Bitmap.createBitmap(W, H, Bitmap.Config.ARGB_8888);
+
+        in.copyFromUnchecked(data);
+
+        yuvToRgbIntrinsic.setInput(in);
+        yuvToRgbIntrinsic.forEach(out);
+        out.copyTo(bmpout);
+        image.close();
+        return bmpout ;
+    }*/
 }

--
Gitblit v1.9.1