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