Android:从相机保存的Jpeg看起来已损坏

我正在编写一个Android应用程序,当用户点击一个按钮时,它可以从相机保存JPEG快照。 不幸的是,当我看着JPEG文件时,我的代码看起来已经损坏。 它似乎是由我调用parameters.setPreviewSize(请参阅下面的代码片段)引起的 - 如果我删除它,则图像可以很好地保存; 但是没有它,我无法设置预览大小,并且setDisplayOrientation在没有它的情况下似乎也没有效果。

我的应用针对API Level 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 {
            }
        }
    }
};

另一个解决方法是匹配预览和图片大小之间的宽高比(即setPreviewSize(w1,h1); setPictureSize(w2,h2)与w1 / h1〜w2 / h2(小的差异似乎可以))。 例如,对于Desire HD S w1 = 800,h1 = 480,w2 = 2592,h2 = 1552以及w1 = 960,h1 = 720,h2 = 2592,h2 = 1952(如果你不介意失真的图像; - )


我假定您正在使用通常实现的getBestPreviewSize(w,h)方法,该方法在这个方法中处于浮动状态,您可以在其中遍历不同的getSupportedPreviewSizes()来查找最佳匹配。 虽然我不确定它为什么会导致图像失真,但我发现使用getBestPreviewSize方法的输出调用parameters.setPreviewSize(size.width,size.height)方法是导致问题的原因HTC Desire。 我也证实,通过评论它,扭曲的形象问题消失。

链接地址: http://www.djcxy.com/p/46501.html

上一篇: Android: Jpeg saved from camera looks corrupted

下一篇: fill after a screen orientation change