????通过 getPlanes( )可以获取到对应的数据流,现在怎么去把流转成图片问题接踵而来,里面有涉及到一些计算了。下面对Plane类中方法做一个记录:
????getRowStride( )
????此颜色平面的行跨度(以字节为单位)。这是图像中连续两行像素开始的距离。 请注意,对于某些格式(如RAW_PRIVATE ,stried未定义,对这些格式的图像调用getRowStride将导致抛出UnsupportedOperationException。 对于行跨度很好定义的格式,行跨度总是大于0。
???? getPixelStride( )
????相邻像素采样之间的距离,以字节为单位。这是一行像素中两个连续像素值之间的距离。 它可能大于单个像素的大小,以考虑交错图像数据或填充格式。 请注意,某些格式(如RAW_PRIVATE像素跨距未定义,并且在这些格式的图像上调用getPixelStride将导致抛出UnsupportedOperationException。 对于像素跨度定义明确的格式,像素跨度总是大于0。
????getBuffer( )
????获取包含帧数据的直接ByteBuffer 。特别是,返回的缓冲区总是有isDirect = true ,所以底层数据可以被映射为JNI中的一个指针,而不用GetDirectBufferAddress做任何拷贝。对于原始格式,每个平面只保证包含最后一行中最后一个像素的数据。 换句话说,最后一行之后的步幅可能不会被映射到缓冲区中。 这是任何交错格式的必要条件。
????看了上面半天只有一句话,你在说什么腌。列出上面的数据只是单纯的想说明,这个获取的Buffer不可以直接转换成Bitmap的。需要通过计算的。计算的公式如下:
try {
img = imageReader.acquireLatestImage();
if (img != null) {
Image.Plane[] planes = img.getPlanes();
if (planes[0].getBuffer() == null) {
return;
}
int width = img.getWidth();
int height = img.getHeight();
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);
bitmap = Bitmap.createBitmap(bitmap, 0, 0,width, height);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
int options_ = 30;//压缩分辨率,比如取值为30,那么压缩了30%
bitmap.compress(Bitmap.CompressFormat.JPEG, options_, byteArrayOutputStream);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != fos) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != bitmap) {
bitmap.recycle();
}
if (null != img) {
img.close();
}
}
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-58101-6.html
这其实就是一场政治秀
特么都不知道在后台下载什么鬼