0

バーコードを読み取るために、カメラ ビューによって生成されたすべてのフレームを処理する必要があります。

私は HTC Sensation を使用しています (テストするための別の電話をまだ持っていません)

だから私は getSupportedPreviewSizes を呼び出して、使用できる最適な解像度を選択しました。


1920,1088年

1280,720

960,544

800,480

720,480

640,480

640,368

480,320

352,288

320,240

176,144


ただし、640x480 のみが機能します :(

私が使用する場合:

parameters.setPreviewSize(800 , 600);

また

parameters.setPreviewSize(960 , 544);

また

parameters.setPreviewSize(1280 , 720);

次に、取得した画像が取り除かれます。ここに例を示します。

ここに画像の説明を入力

プレビュー サイズとして 3264x1840 または 2592x1456 を使用しても効果はなく、生成された画像のサイズは 640x480 のままです。

プレビュー サイズとして 1920x1088 を設定すると、アプリを自動的に再起動するという致命的なエラーが発生します。

0x417db2d9 (コード = 2) の致命的なシグナル 11 (SIGSEGV)

参考までに、 onPreviewFrame の本文をコピーして貼り付けます。

    public void onPreviewFrame(byte[] data, Camera camera) 
    {

    int width = camera.getParameters().getPreviewSize().width;  
    int height = camera.getParameters().getPreviewSize().height; 

    Parameters parameters = camera.getParameters();

    YuvImage image = new YuvImage(data , parameters.getPreviewFormat(), width , height , null);

    String resultText = "";

    try 
    {


        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        image.compressToJpeg(new Rect(0 , 0 , image.getWidth() , image.getHeight()), 100, baos);

        // Convertie YUV TO BITMAP
        Bitmap bitmap = BitmapFactory.decodeByteArray( baos.toByteArray(), 0,  baos.size());

        FileOutputStream outStream = new FileOutputStream("/sdcard/" + System.currentTimeMillis() + ".jpg");

            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream);

            outStream.close();

            outStream.flush();

    }
    catch (Exception e) 
    {
             e.printStackTrace();
        }    

  }

コールバック buffer のコードを含む surfaceChanged 関数のコードで投稿を更新します。

    @Override
public void surfaceChanged(SurfaceHolder holder,  int format, int width, int height) 
{

    try 
    {
        Parameters parameters = camera.getParameters();

    //  parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); // ACTIVE FLASH SI NECESSAIRE
    //  parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO ); // ACTIVE AUTOFOCURS
    //  parameters.setSceneMode(Camera.Parameters.SCENE_MODE_STEADYPHOTO);

        String focusMode = Utils.findSettableValue(parameters.getSupportedFocusModes(), Camera.Parameters.FOCUS_MODE_AUTO, Camera.Parameters.FOCUS_MODE_MACRO);

        if (focusMode != null) 
        {
            parameters.setFocusMode(focusMode);
        }

        Log.e(TAG , "PREVIEWS : ");

        List<Size> previews = parameters.getSupportedPreviewSizes();

        for(int i = 0 ; i < previews.size() ; i++) 
        {
            Log.e(TAG , i + " : " + previews.get(i).width + "," + previews.get(i).height);
        } 

        Log.e(TAG , "PICTURES : ");

        List<Size> pictures = parameters.getSupportedPictureSizes();

        for(int i = 0 ; i < pictures.size() ; i++) 
        {
            Log.e(TAG , i + " : " + pictures.get(i).width + "," + pictures.get(i).height);
        } 

        Size preview = previews.get(1);

        parameters.getSupportedPictureSizes();


//      parameters.setPreviewSize(preview.width , preview.height);

    //  Camera.Size size = getBestPreviewSize(width, height);



        parameters.setPictureSize(1280 , 720);
        parameters.setPreviewSize(1280 , 720);

        camera.setParameters(parameters);

    //  camera.setDisplayOrientation(90);
        camera.setPreviewDisplay(holder);
        camera.setPreviewCallback(this);
        camera.startPreview();
        camera.autoFocus(autoFocusCallback);

        ///////////////////////////////////////////////////////////

        int imgformat = parameters.getPreviewFormat();
        int bitsperpixel = ImageFormat.getBitsPerPixel(imgformat);

        Camera.Size camerasize = parameters.getPreviewSize();
        int frame_size = ((camerasize.width * camerasize.height) * bitsperpixel) / 8;

        byte[] buffer = new byte[frame_size];
        camera.addCallbackBuffer(buffer);



    } 
    catch (Exception e) 
    {
        e.printStackTrace();
    }   

}

しかし、コールバック バッファを使用しても問題は残り、画像が剥がれます。

私は何か間違ったことをしましたか?

ありがとう

4

2 に答える 2

0

私の知る限り、HTC G11 にも同じ問題があります (setPreviewSize が 1280x720 以上)。

HTC電話を適応させることをお勧めします。HTC 電話を使用している場合は、PreviewSize を 640x480 に設定します。

于 2013-07-09T06:26:41.913 に答える