2013-06-17 6 views
3

Я использую камеру в своем приложении. Камера работает идеально на всех устройствах вплоть до Samsung S3. Изображение соответствует всем другим устройствам.Samsung Galaxy S4, изображение повреждается при съемке с камеры

Принимая изображение с S4, изображение становится поврежденным, а изображение сохраняется с некоторыми строками в горизонтальной плоскости.

Я попытался изменить разрешение и все, но все еще проблема есть.

Любая помощь enter image description here

ответ

2

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

В моем случае мой код искал идеальный размер предварительного просмотра на основе соотношения сторон экрана. S4 - это телефон 1080p, поэтому изображение предварительного просмотра было 1920x1080, что соответствует соотношению сторон 16: 9. Но мой код был жестко скопирован на захват изображения 1600x1200, что составляет 4: 3, потому что это все, что мне нужно. Но 1600x1200 не является одним из допустимых размеров, поддерживаемых S4.

Не задавая размер, S4 захватил 4128x3096, максимальный размер и 4: 3, но линии все еще появились. Как только я сказал фотоаппарату, чтобы захватить фотографию 16: 9, линии исчезли. В вашем случае вы можете настроить соотношение сторон предварительного просмотра.

Вот код, который может рассказать вам о доступных размерах.

List<Camera.Size> previewSizes = p.getSupportedPreviewSizes(); 

    int i = 1; 

    for (Size previewSize : previewSizes) { 
     Log.v("DebugCamera", "previewSize " + i++ + " width: " + previewSize.width + " height: " + previewSize.height); 
    } 
1

Только что пробовал этот код на S4, и он работает. Попробуйте:

private Camera.Size getBestPreviewSize(int width, int height) 
{ 
     Camera.Size result=null;  
     Camera.Parameters p = camera.getParameters(); 
     for (Camera.Size size : p.getSupportedPreviewSizes()) { 
      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; 

} 

public void surfaceCreated(SurfaceHolder holder) { 
    if(myCamera == null){ 
     myCamera = getCameraInstance(); 
    try { 
     myCamera.setPreviewDisplay(holder); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    } 
} 

public void surfaceDestroyed(SurfaceHolder holder) { 
    // empty. Take care of releasing the Camera preview in your activity. 
    // Surface will be destroyed when we return, so stop the preview. 
    if (myCamera != null) 
    { 
     myCamera.stopPreview(); 
     myCamera.setPreviewCallback(null); 
     myCamera.release(); 
    } 
} 

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
    //This line helped me set the preview Display Orientation to Portrait 
      //Only works API Level 8 and higher unfortunately. 

    camera.setDisplayOrientation(90); 

    Camera.Parameters parameters = camera.getParameters(); 
    Camera.Size size = getBestPreviewSize(width, height); 
    parameters.setPreviewSize(size.width, size.height); 
    camera.setParameters(parameters); 
    camera.startPreview(); 

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