最近项目需要循环的截屏分析数据,实践后发现下面这篇可以使用
但是里面方法存在一个问题,手机截取的图片在小米手机1080×1920中截屏图片缩放且有黑色外框
在vivo手机上截屏发现宽度多截了8px
经过查找发现问题出现在下面这段代码中
Image image = mImageReader.acquireLatestImage(); if (image == null) { // Log.e(TAG, "image is null."); return null; } Log.e(TAG,"截图时间:"+(System.currentTimeMillis()-begintime)); int width = image.getWidth(); int height = image.getHeight(); final Image.Plane[] planes = image.getPlanes(); final ByteBuffer buffer = planes[0].getBuffer(); int pixelStride = planes[0].getPixelStride(); int rowStride = planes[0].getRowStride(); int rowPadding = rowStride - pixelStride * width; Bitmap bitmap = Bitmap.createBitmap(width + rowPadding / pixelStride, height, Bitmap.Config.ARGB_8888); bitmap.copyPixelsFromBuffer(buffer); image.close();
修改方法:
Image image = imageReader.acquireLatestImage(); if (image == null) { // Log.e(TAG, "image is null."); return null; } Log.e(TAG,"截图时间:"+(System.currentTimeMillis()-begintime)); int width = image.getWidth(); int height = image.getHeight(); final Image.Plane[] planes = image.getPlanes(); final ByteBuffer buffer = planes[0].getBuffer(); //IntBuffer intBuffer = buffer.order(ByteOrder.BIG_ENDIAN).asIntBuffer(); int pixelStride = planes[0].getPixelStride(); int rowStride = planes[0].getRowStride(); int rowPadding = rowStride - pixelStride * width; byte[] array = new byte[buffer.remaining()]; Log.e(TAG,"arr:"+array.length); buffer.get(array,0,array.length); int[] iarr = new int[array.length/4]; for (int i = 0; i < array.length/4; i++) { int i1 = ((int)array[i*4])&0xFF; int i2 = ((int)array[i*4+1])&0xFF; int i3 = ((int)array[i*4+2])&0xFF; int i4 = ((int)array[i*4+3])&0xFF; iarr[i]= (i1<<16)|(i2<<8)|(i3<<0)|(i4<<24); //r,g,b,a //argb } Bitmap bitmap = Bitmap.createBitmap(metric, iarr, 0, rowStride/4, width, height, Bitmap.Config.ARGB_8888); image.close(); StreamTool.saveBitmap(bitmap,"test"+System.currentTimeMillis()+".png");
个人记录,以备参考