2013-11-16 2 views
5

Когда вы делаете снимок с фронтальной камерой в Android, предварительный просмотр отражается вдоль оси Y, чтобы изображение выглядело так, как если бы пользователь смотрел в зеркало. Я хочу отменить этот эффект (применить второе отражение) или просто остановить тот, который выполняется автоматически.Зеркально передняя передняя камера в Android

я, хотя использовать это:

Camera mCamera; 
.... 
mCamera.setPreviewCallback(...); 

Но я действительно не знаю, что делать с переопределения

onPreviewFrame(byte[] data, Camera camera){...} 

Что лучший способ, которым я могу добиться того, что я описал?

Примечание. Я пытаюсь применить этот эффект к предварительным просмотрам в реальном времени, а не к уже сделанным изображениям.

+0

Дубликат: http://stackoverflow.com/questions/9754346/prevent-flipping-of-the-android-front-facing-camera/17569915# 17569915 –

+0

@clairharrison вы получили решение? – Aswathy

+0

@Aswathy К сожалению, все ответы для изображения, которое сохраняется, а не в реальном времени. – Edd

ответ

1

Вы можете использовать матрицу, чтобы перевернуть данные изображения, что-то вроде:

byte[] baImage = null; 
Size size = camera.getParameters().getPreviewSize(); 
ByteArrayOutputStream os = new ByteArrayOutputStream(); 
YuvImage yuv = new YuvImage(data, ImageFormat.NV21, size.width, size.height, null); 
yuv.compressToJpeg(new Rect(0, 0, size.width, size.height), 100, os); 
baImage = os.toByteArray(); 
Bitmap bitmap = BitmapFactory.decodeByteArray(rawImage, 0, rawImage.length); 
Matrix matrix = new Matrix(); 
matrix.preScale(-1.0f, 1.0f); 
Bitmap mirroredBitmap = Bitmap.createBitmap(bitmap, 0, 0, size.width, size.height, matrix, false); 
+0

И ... Я пропустил вашу последнюю заметку и ответил на неправильный вопрос;) – vitriolix

4

Первый, когда вы открываете свой экземпляр камеры с Camera.open(), вы должны открыть переднюю камеру с Camera.open (getSpecialFacingCamera ())

private int getSpecialFacingCamera() { 
    int cameraId = -1; 
    // Search for the front facing camera 
    int numberOfCameras = Camera.getNumberOfCameras(); 
    for (int i = 0; i < numberOfCameras; i++) { 
     Camera.CameraInfo info = new Camera.CameraInfo(); 
     Camera.getCameraInfo(i, info); 
     if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
      cameraId = i; 
      break; 
     } 
    } 
    return cameraId; 
} 

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

public void onPictureTaken(byte[] data, Camera camera){ 
      Bitmap newImage = null; 
      Bitmap cameraBitmap; 
      if (data != null) { 
       cameraBitmap = BitmapFactory.decodeByteArray(data, 0, (data != null) ? data.length : 0); 
       if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { 
        // use matrix to reverse image data and keep it normal 
        Matrix mtx = new Matrix(); 
        //this will prevent mirror effect 
        mtx.preScale(-1.0f, 1.0f); 
        // Setting post rotate to 90 because image will be possibly in landscape 
        mtx.postRotate(90.f); 
        // Rotating Bitmap , create real image that we want 
        newImage = Bitmap.createBitmap(cameraBitmap, 0, 0, cameraBitmap.getWidth(), cameraBitmap.getHeight(), mtx, true); 
       }else{// LANDSCAPE MODE 
        //No need to reverse width and height 
        newImage = Bitmap.createScaledBitmap(cameraBitmap, screenWidth, screenHeight, true); 
        cameraBitmap = newImage; 
       } 
      } 
     } 

вы можете передать newImage в холсте и создать jpeg-изображение и сохранить его на устройстве. Не забывайте, что камера устарела на уровне Апи 21 ...

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