2014-04-07 5 views
0

surfaceView없이 이미지를 캡처해야하는 서비스가 있습니다. 각도가 잘못된 것으로 밝혀진 결과 이미지 방향을 제외한 모든 것이 완벽하게 작동합니다. HTC와 같은 소형 장치에서 문제 또는 회전이 발생하여 수동으로 회전을 설정하여 작동하는지 확인하고 작동했습니다.sufaceView가없는 Android 카메라 이미지 방향

if (camInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
    parameters.setRotation(270); 
} else if (camInfo.facing == 
    Camera.CameraInfo.CAMERA_FACING_BACK) { 
    parameters.setRotation(90); 
} 

하지만 삼성 전자와 HTC (대형 장치)를 점검 할 때 각도에 문제가 발생합니다. 이미지 경로를 넣은 다음 회전을 설정해야하는 곳에서 몇 가지 게시물을 찾았습니다.하지만이 작업은 저에게 맞지 않습니다. 즉,이 작업은 serfaceview없이 사진을 찍은 다음 서버에 즉시 게시하는 것과 같습니다. 나는 또한 setCameraOrientation()에 대한 코드의 구글 부분을 시도했지만 작동하도록 액티비티 뷰가 필요하다. 그래서 나는 거기에서도 실패했다.

필요한 모든 표면보기 또는 활동 것이없이 서버에 보내기 전에 이미지의 각도를 수정하는 것입니다.

답변

0

setRotation()은 EXIF ​​플래그로만 재생하도록 선택할 수 있습니다. 결과는 여전히 90도 회전되었지만 올바른 방향을 나타내는 "깃발"이있는 이미지입니다. 모든 시청자가이 깃발을 올바르게 설명하지는 않습니다. 특히 BitmapFactory은이를 무시합니다. 캔버스에 회전 된 비트 맵을 그리거나 BitmapFactory.decodeFile()에서 가져온 비트 맵을 회전하거나 3 rd party lib를 사용하여 outStream에 쓰기 전에 JPEG 데이터를 조작 할 수 있습니다. MediaUtil. Android 포트는 GitHub입니다.

0

ExifInterface 개체를 통해 이미지 방향 정보에 액세스 할 수 있습니다. 가로 세로 모드에서 이미지를 캡처하는 경우 전화기에 따라 다른 값을 제공합니다. 그런 다음 행렬을 사용하여 ExifInterface 정보에 따라 이미지를 회전 할 수 있습니다. 마지막으로 서버로 보낼 수 있습니다.

rotatedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(),matrix, true); 

당신은 할 것이다 : 사용하여 비트 맵을 회전 그런 다음

Matrix matrix = new Matrix(); 
try{    
ExifInterface exif = new ExifInterface(imagePath); 
       int orientation = exif.getAttributeInt(
         ExifInterface.TAG_ORIENTATION, 
         ExifInterface.ORIENTATION_NORMAL); 

       switch (orientation) { 
       case ExifInterface.ORIENTATION_ROTATE_90: 
        // Change the image orientation 
        matrix.postRotate(90); 
        break; 
       case ExifInterface.ORIENTATION_ROTATE_180: 
        // Change the image orientation 
        matrix.postRotate(180); 
        break; 
}catch (IOException e) { 
       e.printStackTrace(); 
      } 

당신이 순서대로 행렬 객체를 사용, 다음 코드를 사용하여 이미지 (IMAGEPATH)의 경로를 알고

비트 맵을 서버로 보내기 전에 어딘가에 (외부 또는 내부 임시 저장소) 비트 맵을 저장합니다.

은 당신을 도움이되기를 바랍니다.

+0

어디에도 저장하고 싶지 않습니다. 나는 이미지를 얻기 위해 서비스를 실행하는 비 활동 배경이라는 것을 말했기 때문에 나중에 지울 필요가 있다고 생각합니다. 보이지 않는 것의 일종 – Saqib

0

회전 설정 코드가 너무 단순하기 때문에 일부 기기에서는 잘못된 작업을 수행 할 수 있습니다. 이것이 올바른 회전이라는 보장은 없습니다. 정답은 장치의 현재 방향과 장치의 센서 방향입니다. 당신은 활동이없는 경우

public void onOrientationChanged(int orientation) { 
    if (orientation == ORIENTATION_UNKNOWN) return; 
    android.hardware.Camera.CameraInfo info = 
     new android.hardware.Camera.CameraInfo(); 
    android.hardware.Camera.getCameraInfo(cameraId, info); 
    orientation = (orientation + 45)/90 * 90; 
    int rotation = 0; 
    if (info.facing == CameraInfo.CAMERA_FACING_FRONT) { 
    rotation = (info.orientation - orientation + 360) % 360; 
    } else { // back-facing camera 
    rotation = (info.orientation + orientation) % 360; 
    } 
    mParameters.setRotation(rotation); 
} 

하면, 당신은 장치의 현재 방향 다른 방법으로 활용하는 방법을 알아 내야 할 것이다, 그러나 당신 :

Camera.Parameters.setRotation에 대한 샘플 코드를 살펴 보자 귀하의 계산에 info.orientation을 포함시켜야합니다.

+0

예, 그것이 제가 활동을하지 않는다는 점입니다. 활동을 위해서 나는 약간의 코드 성공을 거둔다! – Saqib

관련 문제