【发布时间】:2011-05-02 16:46:22
【问题描述】:
我正在编写一个 Android 应用程序,当用户单击按钮时,它会保存来自相机的 JPEG 快照。不幸的是,当我查看 JPEG 文件时,我保存的代码看起来已损坏。这似乎是由我对 parameters.setPreviewSize 的调用引起的(请参见下面的代码 sn-p) - 如果我删除它,那么图像保存得很好;但是没有它我无法设置预览大小,并且 setDisplayOrientation 没有它似乎也没有效果。
我的应用程序面向 API 级别 8 (Android 2.2),我正在 HTC Desire HD 上进行调试。不太确定我在这里做错了什么......非常感谢任何帮助!
干杯, 斯科蒂
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
// Now that the size is known, set up the camera parameters and begin
// the preview.
Camera.Parameters parameters = mCamera.getParameters();
Camera.Size size = getBestPreviewSize(w,h);
// This next call is required in order for preview size to be set and
// setDisplayOrientation to take effect...
// Unfortunately it's also causing JPEG to be created wrong
parameters.setPreviewSize(size.width, size.height);
parameters.setPictureFormat(ImageFormat.JPEG);
mCamera.setParameters(parameters);
mCamera.setDisplayOrientation(90);
mCamera.startPreview();
}
// This is the snapshot button event handler
public void onSnapshotButtonClick(View target) {
//void android.hardware.Camera.takePicture(ShutterCallback shutter,
// PictureCallback raw, PictureCallback jpeg)
mPreview.mCamera.takePicture(null, null, mPictureCallback);
}
// This saves the camera snapshot as a JPEG file on the SD card
Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
public void onPictureTaken(byte[] imageData, Camera c) {
if (imageData != null) {
FileOutputStream outStream = null;
try {
String myJpgPath = String.format(
"/sdcard/%d.jpg", System.currentTimeMillis());
outStream = new FileOutputStream(myJpgPath);
outStream.write(imageData);
outStream.close();
Log.d("TestApp", "onPictureTaken - wrote bytes: "
+ imageData.length);
c.startPreview();
Toast.makeText(getApplicationContext(), String.format("%s written", myJpgPath), Toast.LENGTH_SHORT).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
}
}
}
};
【问题讨论】:
-
我也遇到过,但仅适用于 HTC Desire HD。 jpeg 在三星 Galaxy S 和模拟器上保存得很好。
-
@jA_cOp - 谢谢你,至少我知道错的不是我! Android 源代码中的相机应用运行良好,因此我将对其进行研究并找出其中的差异。
-
问题解决了吗?我遇到了同样的问题,只有 HTC Desire HD
-
@Ikky - 我还没有机会回到这个项目,我会在这里更新
-
如果 setPreviewSize 不是必需的,请尝试删除对我有用的 parameters.setPreviewSize。