如何将返回的Bitmap转换BitmapFactory.decodeFile()为YUV格式(simillar到相机的onPreviewFrame()返回字节数组)?
我正在尝试从相机预览中捕获图像并对其进行绘制.问题是,我只有大约3-4 fps的绘图,并且一半的帧处理时间是从摄像机预览接收和解码NV21图像并转换为位图.我有一个代码来执行此任务,我在另一个堆栈问题上找到了该代码.它似乎并不快,但我不知道如何优化它.三星Note 3需要大约100-150毫秒,图像尺寸为1920x1080.如何让它更快地运作?
代码:
public Bitmap curFrameImage(byte[] data, Camera camera)
{
Camera.Parameters parameters = camera.getParameters();
int imageFormat = parameters.getPreviewFormat();
if (imageFormat == ImageFormat.NV21)
{
YuvImage img = new YuvImage(data, ImageFormat.NV21, prevSizeW, prevSizeH, null);
ByteArrayOutputStream out = new ByteArrayOutputStream();
img.compressToJpeg(new android.graphics.Rect(0, 0, img.getWidth(), img.getHeight()), 50, out);
byte[] imageBytes = out.toByteArray();
return BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length);
}
else
{
Log.i(TAG, "Preview image not NV21");
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
图像的最终格式必须是位图,因此我可以对其进行处理.我试图将Camera.Parameters.setPreviewFormat设置为RGB_565,但无法将相机参数分配给相机,我还读到NV21是唯一可用的格式.我不确定,是否有可能在这些格式变化中找到解决方案.
先感谢您.
我按照下面的说明裁剪图像.
http://coderzheaven.com/index.php/2011/03/crop-an-image-in-android/
最终裁剪的位图图像的高度和宽度都大于屏幕的高度和宽度.
在调整大小和裁剪过程中,抛出内存不足错误,并强制应用程序退出.
错误日志:
04-09 11:37:28.658: ERROR/dalvikvm-heap(4003): 435176-byte external allocation too large for this process.
04-09 11:37:28.658: ERROR/GraphicsJNI(4003): VM won't let us allocate 435176 bytes
04-09 11:37:28.668: WARN/dalvikvm(4003): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
04-09 11:37:28.708: ERROR/AndroidRuntime(4003): FATAL EXCEPTION: main
04-09 11:37:28.708: ERROR/AndroidRuntime(4003): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
04-09 11:37:28.708: ERROR/AndroidRuntime(4003): at android.graphics.Bitmap.nativeCreate(Native Method)
04-09 11:37:28.708: ERROR/AndroidRuntime(4003): at android.graphics.Bitmap.createBitmap(Bitmap.java:468)
04-09 11:37:28.708: ERROR/AndroidRuntime(4003): at android.graphics.Bitmap.createBitmap(Bitmap.java:435)
04-09 11:37:28.708: ERROR/AndroidRuntime(4003): at com.test.Test.onCreate(Test.java:57)
04-09 11:37:28.708: ERROR/AndroidRuntime(4003): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
04-09 11:37:28.708: ERROR/AndroidRuntime(4003): …Run Code Online (Sandbox Code Playgroud)