0

そのため、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 と一緒にされたサムネイル) は、現時点ではサーバーにアップロードされていません。そうでない場合は、後で写真をアップロードできます。

4

1 に答える 1

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を実行すると、強制的に閉じられます。私はまだそれをどのように処理するかを考え出していません

于 2011-12-11T22:21:00.527 に答える