在sd_card保存之后,jpeg保存失真

时间:2011-12-11 04:25:26

标签: android parameters camera sd-card fileoutputstream

所以,我使用fileOutputStream将我的图片保存到SD卡 - 我的图像格式为jpeg-但图像保存失真。这很奇怪,因为缩略图图像是图像的正确表示,但是当打开时,它是一系列水平线。

以下是我的代码中的一些片段:

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {
    if(previewing){
        camera.stopPreview();
        previewing=false;
    }
    if(camera!=null){
        try{
            camera.setPreviewDisplay(surfaceHolder);
            Camera.Parameters parameters = camera.getParameters();
            parameters.setPictureFormat(PixelFormat.JPEG);
            parameters.setPreviewSize(width, height);
            camera.setParameters(parameters);
            camera.startPreview();              
            previewing=true;
        } catch(IOException e){}
    }

}

    @Override
    public void onPictureTaken(byte[] data, Camera camera) {

        OutputStream outputStream;


        try{
            outputStream = new FileOutputStream(String.format("/sdcard/%d.jpg", System.currentTimeMillis())); //to sd card
            imageFileOS.write(data);
            imageFileOS.flush();
            imageFileOS.close();


        }catch(FileNotFoundException e){
            e.printStackTrace();
        }catch(IOException e){
            e.printStackTrace();
        }

    }
};

水平扭曲的jpeg和放在一起的缩略图的图像目前没有上传到服务器 - 希望有人知道发生了什么。如果没有,我可以尝试上传图片。

1 个答案:

答案 0 :(得分:0)

问题解决了:

在2.2中我没有问题

在2.3中,图像保存失真 - 这是通过一个名为“getBestPictureSize”的方法修复的,这与我用来获得屏幕宽高比的最佳预览大小的方法基本相同

这是为应用程序运行的设备获取最佳图片大小的方法...

private Camera.Size getBestPicturSize(int width, int height)
{
        Camera.Size result=null;    
        Camera.Parameters p = camera.getParameters();
        for (Camera.Size size : p.getSupportedPictureSizes()) {
            if (size.width<=width && size.height<=height) {
                if (result==null) {
                    result=size;
                } else {
                    int resultArea=result.width*result.height;
                    int newArea=size.width*size.height;

                    if (newArea>resultArea) {
                        result=size;
                    }
                }
            }
        }
    return result;

}

这是surfaceChanged回调,其中使用上述方法来正确调整camera.takePicture(...);

产生的图片大小
private Camera.Size getBestPicturSize(int width, int height)
{
        Camera.Size result=null;    
        Camera.Parameters p = camera.getParameters();
        for (Camera.Size size : p.getSupportedPictureSizes()) {
            if (size.width<=width && size.height<=height) {
                if (result==null) {
                    result=size;
                } else {
                    int resultArea=result.width*result.height;
                    int newArea=size.width*size.height;

                    if (newArea>resultArea) {
                        result=size;
                    }
                }
            }
        }
    return result;

}

您还可以使用此图片大小调整方法来获取预览尺寸,方法是切换以下行:

for (Camera.Size size : p.getSupportedPictureSizes()) {

for (Camera.Size size : p.getSupportedPreviewSizes()) {

希望这对某人有所帮助,因为我花了10个小时强调这个功能对我的2.3.4不起作用但是会对我的2.2

据说 - 在2.2上运行getBestPictureSize会导致力量关闭。还没弄清楚我将如何处理呢