2012-07-18 2 views
3

Я создал приложение для простой камеры, используя код, который я нашел в Интернете. Я многое изменил, пока он не работает, как мне нравится. Тем не менее, изображение, которое он занимает, в конечном итоге растягивается по вертикали по какой-либо причине, хотя просмотр выглядит нормально. Я бег этого приложения на Galaxy NexusИзображение от картиныTaken растягивается

Вот что он выглядит, когда сделано со встроенными в приложении камеры: 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

Выяснил это. Это связано с тем, что размеры предварительного просмотра отличаются от размеров изображения. Это глупо, что это так, но это так. Поэтому решение состоит в том, чтобы сделать их одинаковыми пропорциями. В других новостях, однако, похоже, что это зафиксировано в Jelly Bean

+0

@ amc6 После часа исследования я не могу найти информацию о таком исправлении в Jelly Bean. Ничего не упоминается в официальном отчете об изменении http://developer.android.com/sdk/api_diff/16/changes.html Если кто-то может предоставить ссылку, он будет высоко оценен –

Смежные вопросы