我正在尝试从Android Studio中的Camera2 API抓取视频帧,并对每个帧进行一些简单的图像处理。
我遇到的问题是将已处理的帧绘制回屏幕上。
我正在使用camera2raw示例中的代码。
我正在修改存储所有帧的缓冲区中的像素值。
现在,我只是向每个像素添加一个常数值,以查看屏幕上的图像是否被修改。
通过向每个像素添加一个非常大的值,不会更改屏幕上的图像。
因此,我非常有信心不会将修改后的像素值写回到屏幕上。
以下是该程序相关部分的代码段:
ImageReader.OnImageAvailableListener imageAvailableListener = new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
Image image = null;
try {
image = reader.acquireLatestImage();
ByteBuffer Y = image.getPlanes()[0].getBuffer();
ByteBuffer U = image.getPlanes()[1].getBuffer();
ByteBuffer V = image.getPlanes()[2].getBuffer();
int Yb = Y.remaining();
int Ub = U.remaining();
int Vb = V.remaining();
byte[] data = new byte[Yb + Ub + Vb ];
//your data length should be this byte array length.
for (int i = 0; i < 512; i++)
{
for (int j = 0; j < 512; j++)
{
int idx = i * 512 + j;
data[idx] += 255;
}
}
// Screen should now show some distortion.
Y.get(data, 0, Yb);
U.get(data, Yb, Ub);
V.get(data, Yb+ Ub, Vb);
} catch (Exception ee) {
} finally {
if (image != null)
image.close();
}
}
//void save(byte[] bytes) {
File file12 = getOutputMediaFile();
OutputStream outputStream = null;
try {
outputStream = new FileOutputStream(file12);
outputStream.write(bytes);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (outputStream != null)
outputStream.close();
} catch (Exception e) {
}
}
// }
};
请让我知道是否提供进一步的说明或代码部分有助于使我的问题更加清楚。
有人可以告诉我如何将修改后的框架写回到屏幕上吗?
我也尝试过这样做:
// Convert bytes data into a Bitmap
Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
ImageView imageView = new ImageView(MainActivity.this);
// Set the Bitmap data to the ImageView
imageView.setImageBitmap(bmp);
// Get the Root View of the layout
ViewGroup layout = (ViewGroup) findViewById(android.R.id.content);
// Add the ImageView to the Layout
layout.addView(imageView);
有与此问题相关的帖子,但没有一个提供确切的解决方案。谁能给我提供有关如何实现我所描述的详细逐步说明的链接?