2012-07-18 53 views
3

我已經使用我在網上找到的代碼設置了一個簡單的相機應用程序。我修改了很多,直到它按我喜歡的方式工作。但是,即使預覽看起來不錯,但由於某種原因,所需的圖像仍會垂直拉伸。我運行一個Galaxy Nexus的來自pictureTaken的圖片延伸

下面這個程序是什麼樣子時,與內置的攝像頭應用程序採取這樣的:correct image

而且這裏是我的應用程序的形象是這樣的:stretched image

任何想法爲什麼這是?這兩個圖像是相同的尺寸

在此先感謝。我的代碼是低於

public class CameraActivity extends Activity implements SurfaceHolder.Callback, 
OnClickListener { 
    private static final String TAG = "CameraTest"; 
    Camera mCamera; 
    boolean mPreviewRunning = false; 


    @Override 
    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 

     Log.i(TAG, "onCreate"); 


     getWindow().setFormat(PixelFormat.TRANSLUCENT); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
       WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     setContentView(R.layout.surface_camera); 
     mSurfaceView = (SurfaceView) findViewById(R.id.surface_camera); 
     mSurfaceView.setOnClickListener(this); 
     mSurfaceHolder = mSurfaceView.getHolder(); 
     mSurfaceHolder.addCallback(this); 
     mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     super.onRestoreInstanceState(savedInstanceState); 
    } 

    Camera.PictureCallback mJpegCallback = new Camera.PictureCallback() { 
     public void onPictureTaken(byte[] imageData, Camera c) { 

      if (imageData != null) { 

       handleJPEGData(imageData); 
       mCamera.startPreview(); 



      } 
     } 
    }; 

    Camera.PictureCallback mRawCallback = new Camera.PictureCallback() { 

     public void onPictureTaken(byte[] data, Camera camera) { 
      BitmapFactory.Options opts = new BitmapFactory.Options(); 
      opts.inPreferQualityOverSpeed = true; 
      opts.inPreferredConfig = Bitmap.Config.RGB_565; 
      Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length, opts); 

      Log.i(TAG, "Saving picture"); 

      MediaStore.Images.Media.insertImage(getContentResolver(), bmp, "1234", "124"); 
      Log.i(TAG, "Picture Saved"); 

     } 
    }; 

    private void handleJPEGData(byte[] data) { 
     Log.i(TAG, "Saving picture"); 
     ContentValues vals = new ContentValues(); 
     vals.put(Images.Media.DATE_TAKEN, new Date().getTime()); 
     vals.put(Images.Media.DATE_ADDED, new Date().getTime()); 
     vals.put(Images.Media.MIME_TYPE, "images/jpeg"); 
//  vals.put(Images.Media., value) 
     Uri uriTarget = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, new ContentValues()); 

     OutputStream imageFileOS; 
     try { 
      imageFileOS = getContentResolver().openOutputStream(uriTarget); 
      imageFileOS.write(data); 
      imageFileOS.flush(); 
      imageFileOS.close(); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     Log.i(TAG, "Picture Saved"); 

     mRawCallback.onPictureTaken(data, mCamera); 
    } 

    @Override 
    protected void onResume() { 
     Log.i(TAG, "onResume"); 
     super.onResume(); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
    } 

    @Override 
    protected void onStop() { 
     Log.i(TAG, "onStop"); 
     super.onStop(); 
    } 

    public void surfaceCreated(SurfaceHolder holder) { 
     Log.i(TAG, "surfaceCreated"); 
     mCamera = Camera.open(); 

    } 

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
     Log.i(TAG, "surfaceChanged"); 

     // XXX stopPreview() will crash if preview is not running 
     if (mPreviewRunning) { 
      mCamera.stopPreview(); 
     } 

     Camera.Parameters p = mCamera.getParameters(); 
     p.setPreviewSize(1920, 1080); 
     p.setAntibanding(Camera.Parameters.ANTIBANDING_AUTO); 
     p.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); 
     p.setJpegQuality(100); 
     p.setPictureFormat(ImageFormat.JPEG); 
     p.setPictureSize(2592,1944); 
     mCamera.setParameters(p); 



     try { 
      mCamera.setPreviewDisplay(holder); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     mCamera.startPreview(); 
     mPreviewRunning = true; 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     Log.i(TAG, "surfaceDestroyed"); 
     mCamera.stopPreview(); 
     mPreviewRunning = false; 
     mCamera.release(); 
    } 

    private SurfaceView mSurfaceView; 
    private SurfaceHolder mSurfaceHolder; 

    public void onClick(View arg0) { 

     mCamera.takePicture(null, null, mJpegCallback); 

    } 

} 

回答

2

想通了。這是因爲預覽尺寸與圖片尺寸不同。它是這樣愚蠢的,但它是。所以解決方案是讓它們具有相同的寬高比。然而在其他新聞中,這似乎是固定在果凍豆

+0

@ amc6經過一小時的研究,我無法找到任何信息在果凍豆這樣的修復。官方更改報告中沒有提及任何內容http://developer.android.com/sdk/api_diff/16/changes.html 如果任何人都可以提供參考,那麼將非常感謝 – 2013-02-06 06:00:24