gpt4 book ai didi

android - 使用 YuvImage 压缩时出现奇怪的错误

转载 作者:行者123 更新时间:2023-11-29 17:54:40 28 4
gpt4 key购买 nike

我想使用矩形直接从相机预览中裁剪图像。使用以下代码时,我的 LogCat 中出现以下错误:

skia(24596): onFlyCompress
AndroidRuntime(24596): FATAL EXCEPTION: main
AndroidRuntime(24596): java.lang.NullPointerException
AndroidRuntime(24596): at com.example.mycameraapp.CameraActivity.getBoundData(CameraActivity.java:417)
AndroidRuntime(24596): at com.example.mycameraapp.CameraActivity$2.onPreviewFrame(CameraActivity.java:320)
AndroidRuntime(24596): at android.hardware.Camera$EventHandler.handleMessage(Camera.java:791)
AndroidRuntime(24596): at android.os.Handler.dispatchMessage(Handler.java:99)
AndroidRuntime(24596): at android.os.Looper.loop(Looper.java:137)
AndroidRuntime(24596): at android.app.ActivityThread.main(ActivityThread.java:5103)
AndroidRuntime(24596): at java.lang.reflect.Method.invokeNative(Native Method)
AndroidRuntime(24596): at java.lang.reflect.Method.invoke(Method.java:525)
AndroidRuntime(24596): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
AndroidRuntime(24596): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
AndroidRuntime(24596): at dalvik.system.NativeStart.main(Native Method)

我的代码在 getBoundData 方法中产生错误,大概是在我使用 YuvImagecompressToJpeg 方法时。方法的代码在这里:

  ByteArrayOutputStream bos;
public byte[] getBoundData(final byte[] data,final Rect rect)
{
/*int h=mCamera.getParameters().getPictureSize().height;
int w=mCamera.getParameters().getPictureSize().width;
int bitsPerPixel=ImageFormat.getBitsPerPixel(mCamera.getParameters().getPictureFormat());
int bufferSize=w*h*(bitsPerPixel/8);
byte[] out=new byte[bufferSize];*/
new Thread()
{
public void run()
{
final int h=mCamera.getParameters().getPreviewSize().height;
final int w=mCamera.getParameters().getPreviewSize().width;
YuvImage yuvImage=new YuvImage(data,ImageFormat.NV21,w,h,null);
bos=new ByteArrayOutputStream();
yuvImage.compressToJpeg(rect, 100, bos);
}
}.start();
//Log.d(TAG,"Bound Array Size: "+bos.size());
return bos.toByteArray();
}

此方法在 PreviewCallback 中调用如下:

 PreviewCallback mPreviewCallback=new PreviewCallback() {

@Override
public void onPreviewFrame(byte[] data, Camera camera) {
// TODO Auto-generated method stub
byte[] boxData=null;
Rect rect=mBox.getRect();
if(rect!=null)
boxData=getBoundData(data,rect);
else
boxData=data;
//file saving code...previously tested.

这是在 doSnap 方法中使用 mCamera.setPreviewCallback(mPreviewCallback); 调用的。

是什么导致了这个错误,我该如何纠正它?另外,这是直接从 Android 中的 CameraPreview 裁剪图像的最佳方式吗?

最佳答案

return bos.toByteArray();

你的bos在这里是null。它稍后仅在后台线程中初始化。

如果您需要从后台线程传回数据,请使用例如一个回调接口(interface)。 AsyncTask 使后台线程任务处理更加简单顺便说一句。

关于android - 使用 YuvImage 压缩时出现奇怪的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20326788/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com