【发布时间】:2016-03-13 22:54:01
【问题描述】:
我正在尝试从位图获取 RGB 并同时保存 JPEG 图像,而 JPEG 字节数组可从 android camera2 api 中的ByteBuffer 获得,这是我的代码:
private class ImageSaver implements Runnable {
private final Image mImage;
private ImageSaver(Image image) {
mImage = image;
}
@Override
public void run() {
// TODO Auto-generated method stub
ByteBuffer byteBuffer = mImage.getPlanes()[0].getBuffer();
byte[] bytes = new byte[byteBuffer.remaining()];
byteBuffer.get(bytes);
final byte[] myBytes = bytes;
Thread getRGB = new Thread() {
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
Bitmap bmp = BitmapFactory.decodeByteArray(myBytes, 0, myBytes.length);
for(int y=0; y<bmp.getHeight();y++) {
for(int x=0; x<bmp.getWidth();x++) {
int c = bmp.getPixel(x, y);
pixel++;
red += Color.red(c);
green += Color.green(c);
blue += Color.blue(c);
}
}
}
};
getRGB.start();
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream(mImageFile);
fileOutputStream.write(bytes);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
mImage.close();
if(fileOutputStream!=null)
{
try {
fileOutputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
现在我得到了例外
03-13 19:26:26.199:E/AndroidRuntime(19715):致命异常:我的 Camera2 基本应用程序 03-13 19:26:26.199: E/AndroidRuntime(19715): 进程: com.example.mycamera2basicapp, PID: 19715 03-13 19:26:26.199: E/AndroidRuntime(19715): java.lang.NullPointerException: file == null 03-13 19:26:26.199: E/AndroidRuntime(19715): 在 java.io.FileOutputStream.(FileOutputStream.java:84) 03-13 19:26:26.199: E/AndroidRuntime(19715): 在 java.io.FileOutputStream.(FileOutputStream.java:72) 03-13 19:26:26.199: E/AndroidRuntime(19715): 在 com.example.mycamera2basicapp.MainActivity$ImageSaver.run(MainActivity.java:145) 03-13 19:26:26.199: E/AndroidRuntime(19715): 在 android.os.Handler.handleCallback(Handler.java:739) 03-13 19:26:26.199: E/AndroidRuntime(19715): 在 android.os.Handler.dispatchMessage(Handler.java:95) 03-13 19:26:26.199: E/AndroidRuntime(19715): 在 android.os.Looper.loop(Looper.java:211) 03-13 19:26:26.199: E/AndroidRuntime(19715): at android.os.HandlerThread.run(HandlerThread.java:61)
这里我正在初始化 mImageFile:
@Override
public void onCaptureStarted(CameraCaptureSession session, CaptureRequest request, long timestamp,
long frameNumber) {
// TODO Auto-generated method stub
super.onCaptureStarted(session, request, timestamp, frameNumber);
createImageGallery();
try {
mImageFile = createImageFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
createImageFile() 是创建 JPEG 文件的简单函数:
private File createImageFile() throws IOException {
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "Jpeg_Image_"+timeStamp+"_";
File image = File.createTempFile(imageFileName, ".jpg", mJpegGalleryFolder);
mImageFileLocation = image.getAbsolutePath();
return image;
}
当我评论这些行时
pixel++;
red += Color.red(c);
green += Color.green(c);
blue += Color.blue(c);
文件被保存,完全没有错误。 我的意图是同时获取 RGB 和保存图像,有人可以帮助我解决这个问题,或者可以告诉我一些其他方向,我可以保存图像并也可以利用 RGB。
【问题讨论】:
-
嗯,很明显第一个catch块被输入了,所以
fileOutputStream是空的。这很容易在关闭资源之前通过 if null 检查来解决 -
现在给我这个 java.lang.NullPointerException: Attempt to invoke virtual method 'android.hardware.camera2.CaptureRequest$Builder android.hardware.camera2.CameraDevice.createCaptureRequest(int)' on a空对象引用
-
你是如何定义 mImageFile 的?确实调用 fileOutputStream = new FileOutputStream(mImageFile);实例化 fileOutputStream?
-
请使用新信息而不是 cmets 编辑您的问题。此外,该错误不是来自您在问题中显示的代码。但是 NullPointerExceptions 很容易修复。只要确保错误所在行的所有变量都不能为空即可。
标签: android nullpointerexception fileoutputstream bitmapfactory