gpt4 book ai didi

java - 压缩并保存位图/缩略图

转载 作者:行者123 更新时间:2023-12-02 11:45:22 27 4
gpt4 key购买 nike

我正在录制视频然后将其保存到设备,我使用视频的路径创建并保存缩略图,当尝试压缩位图时出现以下错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.graphics.Bitmap.compress(android.graphics.Bitmap$CompressFormat, int, java.io.OutputStream)' on a null object reference

视频文件和缩略图将在所需文件夹中创建。但缩略图已损坏..

请查看下面的代码,我评论了崩溃指向的位置(在 saveThumbnail 下):

public class testCam extends Activity {
CameraView cameraView;
ImageView startRec, stopRec;
String filename;
File directoryToStore;
File filePlusName;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_cam);
startRec = (ImageView) findViewById(R.id.startRec);
stopRec = (ImageView) findViewById(R.id.stopRec);

SimpleDateFormat formatter = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");
Date now = new Date();
filename = formatter.format(now) + ".mp4";

directoryToStore = getBaseContext().getExternalFilesDir("TestCam");

filePlusName = new File(directoryToStore, filename);


if (startRec.getVisibility() == View.VISIBLE){
startRec.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startCaptureVideo();
}
});
}if (startRec.getVisibility() == View.VISIBLE) {
stopRec.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
stopCaptureVideo();

}
});

}

cameraView = (CameraView) findViewById(R.id.camera);
cameraView.start();
cameraView.mapGesture(Gesture.PINCH, GestureAction.ZOOM); // Pinch to zoom!
cameraView.mapGesture(Gesture.TAP, GestureAction.FOCUS_WITH_MARKER); // Tap to focus!
cameraView.mapGesture(Gesture.LONG_TAP, GestureAction.CAPTURE); // Long tap to shoot!

}

private void startCaptureVideo() {
cameraView.startCapturingVideo(filePlusName);
}

private void stopCaptureVideo(){
cameraView.stopCapturingVideo();
saveThumbnail();
}

private void saveThumbnail() {
Bitmap b = ThumbnailUtils.createVideoThumbnail(directoryToStore + "/" + filename, 3);
File newFile = new File(directoryToStore, filename.replace(".mp4", ".jpg"));
FileOutputStream outputStream = null;
try {
outputStream = new FileOutputStream(newFile);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
//This is where the issue is pointing to
b.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}

}

}

令我感到奇怪的是,我在应用程序的其他地方以相同的方式完成了此操作,并且没有出现此错误。有谁知道为什么会发生这种情况吗?

最佳答案

看起来问题可能是在您尝试创建缩略图之前视频尚未完成写入文件。如果您检查 CameraView类中,您将看到有一个接口(interface),您可以通过针对各种不同相机状态的回调来实现该接口(interface)。如果您实现CameraCallbacks接口(interface),则有一个onVideoTaken()方法,当调用stopCapturingVideo()时会触发该方法。 saveThumbnail() 应在此函数调用中执行,因为摄像头录制发生在单独的线程中。您必须确保视频已完成写入文件,然后再尝试从中创建缩略图。

您的主要 Activity 应实现 CameraListener,并且您必须调用 cameraView.setCameraListener(this); 才能收到所有回调通知。

关于java - 压缩并保存位图/缩略图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48247504/

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