2016-01-23 2 views
1

Вот весь мой код (там не так много, так что я понял, я бы вставить):Получение значения RGB от камеры поверхности Android

Дело в том, я в основном скопирована весь этот код из учебника. Помимо метода decodeYUV, который я получил от here.

Разрешение экрана телефона 480x800.

Ключевым методом, с которым у меня возникают проблемы, является метод onPictureTaken с потоком байтов.

Проблема в том, когда я делаю снимок. Растровый выглядит следующим образом:

enter image description here

public class HuntActivity extends AppCompatActivity implements SurfaceHolder.Callback{ 

    Camera camera; 
    SurfaceView surfaceView; 
    SurfaceHolder surfaceHolder; 
    Camera.PictureCallback jpegCallback; 
    ImageView sbut; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_hunt); 
     sbut = (ImageView) findViewById(R.id.searchbut); 
     surfaceView = (SurfaceView) findViewById(R.id.surfaceView); 
     surfaceHolder = surfaceView.getHolder(); 
     surfaceHolder.addCallback(this); 
     surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

     jpegCallback = new Camera.PictureCallback() { 
      public void onPictureTaken(byte[] data, Camera camera) { 

       int[] rgbs = new int[480*800*3/2]; //buffer size 
       decodeYUV(rgbs, data, 480, 800); 
       Bitmap bitmap = Bitmap.createBitmap(rgbs, 480, 800, Bitmap.Config.ARGB_8888); 
       sbut.setImageBitmap(bitmap); 
       Toast.makeText(getApplicationContext(), "Picture Saved", 2000).show(); 
       refreshCamera(); 
      } 
     }; 
    } 

    public void captureImage(View v) throws IOException { 
     camera.takePicture(null, null, jpegCallback); 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 

     try {camera = Camera.open(); 
     } catch (RuntimeException e) { 
      System.err.println(e); 
      return; 
     } 
     Camera.Parameters param; 
     param = camera.getParameters(); 
     param.setPreviewSize(800, 480); 
     camera.setDisplayOrientation(90); 
     camera.setParameters(param); 
     try { 
      camera.setPreviewDisplay(surfaceHolder); 
      camera.startPreview(); 
     } catch (Exception e) { 
      System.err.println(e); 
      return; 
     } 

    } 

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

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     camera.stopPreview(); 
     camera.release(); 
     camera = null; 
    } 


    public void refreshCamera() { 
     if (surfaceHolder.getSurface() == null) {return;} 
     try {camera.stopPreview(); 
     } catch (Exception e){} 
     try { 
      camera.setPreviewDisplay(surfaceHolder); 
      camera.startPreview(); 
     } catch (Exception e) {} 
    } 

... 
... 
+0

Не имеет значения, используете ли вы 800x480 для выбранного размера изображения так же, как вы задали размер предварительного просмотра? Или изображение повернуто? – harism

+0

Спасибо за ответ. Но я пробовал это, к сожалению, это правильные размеры, учитывая, что он повернулся на 90 градусов. –

ответ

1

Вы реализовать jpegCallback и затем обрабатывают байты данных, как кодируются YUV. Нет. Байты данных содержат jpg-изображение. Поэтому относитесь к ним соответствующим образом.

+0

Спасибо за ответ. Это 'jpegCallback' просто является именем переменной из учебника. Он реализует 'Camera.PictureCallback'. Он говорит, что формат данных зависит от контекста обратного вызова и настроек «Camera.Parameters». Я считаю, что они ссылаются на метод setPictureFormat, который я никогда не вызываю. Я думал, что по умолчанию это YUV? Я ошибаюсь? –

+0

О, я понимаю, что вы имеете в виду. Вы говорите о 'camera.takePicture (null, null, jpegCallback'? –

+0

Если это так, это имеет смысл, но что я могу исправить? –

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