如何将返回的Bitmap转换BitmapFactory.decodeFile()为YUV格式(simillar到相机的onPreviewFrame()返回字节数组)?
混合来自OpenGL和Android相机的视图时图像失真,以便在使用takepicture方法时获取两者的图像.我查了一下,发现相机图片设置为640X480,openGL视图和相机预览都设置为1280x720.
所以我将相机图片大小设置为1280x720,结果非常完美.但是我无法在代码中设置大小,因为每个Android设备都会有所不同,并且每个设备都必须从支持的大小列表中选择预览大小和图片大小的设置.
考虑到这里有三个变量,活动布局的屏幕尺寸,相机预览尺寸和图片尺寸,最好的方法是什么.
是最好使用match_parent或fitXY作为FrameLayout大小,只能使用两个变量,预览大小和图片大小?
请注意预览大小和图片大小中的几个宽度和高度组合是相同的.例如1280 x 720同时存在于预览和图片中,是否总是会出现两种尺寸的匹配?
List<Size> previewSizes = mCamera.getParameters().getSupportedPreviewSizes();
List<Size> imageSizes = mCamera.getParameters().getSupportedPictureSizes();
// layout in the activity that the cameraView will placed in
int layoutWidth = frameLayout.getWidth();
int layoutHeight = frameLayout.getHeight();
Run Code Online (Sandbox Code Playgroud)
例如,在测量后的一个Android平板电脑中,这些是使用的3个变量的结果
作为测量结果的活动中布局viewGroup的大小
1280 x 736
Run Code Online (Sandbox Code Playgroud)
支持的图片尺寸
320 x 240
640 x 480
1024 x 768
1280 x 720 << best size in my example to use
1280 x 768
1280 x 920
1600 x 1200
2048 x 1536
2560 x 1440
2560 x 1536
2560 x …Run Code Online (Sandbox Code Playgroud) 我目前正在使用Javacv,它利用public void onPreviewFrame(byte[] data, Camera camera)相机功能.
由于相机已被弃用,我一直在研究camera2和MediaProjection.这两个库都使用ImageReader类.
目前我ImageReader使用以下代码实例化这样的:
ImageReader.newInstance(DISPLAY_WIDTH, DISPLAY_HEIGHT, PixelFormat.RGBA_8888, 2);
并附上OnImageAvailableListener这样的:
private final ImageReader.OnImageAvailableListener mOnImageAvailableListener
= new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
mBackgroundHandler.post(new processImage(reader.acquireNextImage()));
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用RGBA_8888Javacv 的格式按照这个帖子:https://github.com/bytedeco/javacv/issues/298但这对我不起作用.
所以我正在考虑使用Render脚本将这些Image转换为NV21(YUV_420_SP)格式(这是onPreviewFrame函数中相机的默认输出),因为这对我来说对camera库有用.
我还阅读了这个和本网站的帖子进行转换,但这些对我不起作用,我担心它们会太慢.此外,我对C的了解非常有限.基本上看起来我想要https://developer.android.com/reference/android/renderscript/ScriptIntrinsicYuvToRGB.html的反向操作
那么你怎么能从一个Image匹配onPreviewFrame函数输出的字节数组,即NV21(YUV_420_SP)格式?最好使用Renderscript,因为它更快.
我尝试过使用ImageFormat.YUV_420_888 …
camera android image-processing renderscript android-camera2
我正在使用Android ImageReader类从MediaProjection.createVirtualDisplay方法接收位图.
到目前为止,我的代码如下所示:
mProjection.createVirtualDisplay("test", width, height, density, flags, mImageReader.getSurface(), new VirtualDisplayCallback(), mHandler);
mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
Image image = null;
try {
image = mImageReader.acquireLatestImage();
final Image.Plane[] planes = image.getPlanes();
final ByteBuffer buffer = planes[0].getBuffer();
final byte[] data = new byte[buffer.capacity()];
buffer.get(data);
final Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
if (bitmap==null)
Log.e(TAG, "bitmap is null");
} catch (Exception e) {
if (image!=null)
image.close();
}
}
}, mHandler);
Run Code Online (Sandbox Code Playgroud)
问题是BitmapFactory无法将data []解码回Bitmap,即BitmapFactory总是返回null.我从logcat看到的唯一消息来自android_media_ImageReader.cpp,如下所示:
D/ImageReader_JNI(1432): ImageReader_imageSetup: Receiving JPEG …Run Code Online (Sandbox Code Playgroud)