2012-02-09 2 views
0

저는 Galaxy Note 장치가 있으며 카메라에서 가져온 이미지를 가져 오는 응용 프로그램을 작성했습니다. 레이아웃을 가로로 설정 했으므로 장치로 이미지를 가져올 수 있습니다. 문제는 같은 프로그램을 다른 사람의 장치에서 실행할 때 발생합니다. 프로그램이 다른 장치에서도 동일하게 실행되지만 그림을 저장할 때 그림의 내용이 잘못되었습니다. 이미지 내용 대신 약간의 대각선 줄이 보입니다. 잘못된 피치 나 해상도로 저장된 이미지의 결과라고 생각합니다. 다른 장치의 "도청 된"그림의 축소판 그림은 일종의 이유가 있습니다. 내 장치와 다른 장치의 차이를 찾으려고했지만 해상도가 1280x800이고 다른 하나가 800x480 인 경우를 제외하고는 어떤 차이점도 발견하지 못했습니다. 두 경우 모두 Measur 및 Layout 함수는 90도 방향과 올바른 가로 해상도를가집니다. 두 경우 모두 이미지 형식은 JPEG입니다 (mCamera.getParameters(). getPictureFormat()). 하나의 장치가 올바른 JPEG 바이트 배열을 뱉어 내고 다른 하나가 정확한 데이터를 제공하지만 잘못된 방향으로 제공한다는 것을 제외하고는 모든 것이 동일하게 보이기 때문에 나는 무엇을 해야할지 잘 모릅니다. 또는 그렇게 보인다.HTC 장치의 섬네일 이미지 콘텐츠가 잘못되었습니다.

편집 : 원시 데이터를 JPEG 파일에 곧바로 저장해도 아무런 표시 나 디코딩이 필요하지 않은 것으로 나타났습니다. 갤러리 브라우저에서 JPEG 파일에 아티팩트가 있음을 알 수 있습니다. 어떻게 든 잘못되었습니다. A (JPEG) 파일로 카메라 데이터를 저장하는 내 코드는 다음과 같습니다 :

private File onJPGPreviewFrame(byte[] data, String Name) { 
    FileOutputStream outStream = null; 
    File f = null; 
    try { 
     if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { 
      File externalRoot = Environment.getExternalStorageDirectory(); 
      File tempDir = new File(externalRoot, Name); 
      tempDir.createNewFile(); 
      outStream = new FileOutputStream(tempDir); 
      outStream.write(data); 
      outStream.close(); 
      f = tempDir; 
     } 

     Log.d(TAG, "onPreviewFrame - wrote bytes: " + data.length); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
    } 
    return f; 
} 
+0

각 칩셋 제조사가 JPEG 이미지를 인코딩하고 있는지 여부가 아니라 EXIF ​​썸네일을 포함하는 방법을 결정 자신의 카메라 드라이버를 쓴다 : 는 여기가 최적의 화면 비율을 찾는 데 사용하는 코드입니다. JPEG 파일에는 피치 정보가 없으므로 표시된 이미지가 잘못된 피치 (대각선)를 나타내는 경우 디코드/표시 논리의 오류가 100 %입니다. – BitBank

+0

EXIF ​​방향 태그를 지원하는지 여부에 관계없이 카메라 드라이버 작성자에게 달려 있다는 점을 잊어 버렸습니다. 그럴 경우 EXIF ​​태그의 값을 사용하지 않으면 이미지를 표시하는 프로그램이 잘못된 방향으로 표시 될 수 있습니다. – BitBank

+0

내가 알기에, 디코딩이나 디스플레이를하기 전에 문제가 시작됩니다. 난 그냥 원시 데이터를 파일에 쓰고 JPEG 파일은 장치의 갤러리에서 보았을 때 여전히 잘못된 것처럼 보입니다. – user1097185

답변

0

장치의 화면 해상도는 장치의 카메라 해상도가 아닌 다른 화면 비율을 가지고있다. 미리보기에서 카메라의 가로 세로 비율과 동일한 가로 세로 비율을 사용하도록 선택하면 jpeg 바이트 배열 데이터가 "도청"되지 않습니다. 이 문제는 화면 미리보기 비율과 일치하지 않기 때문에 미리보기가 왜곡 될 수 있습니다.

private Size getOptimalPreviewSize(List<Size> sizes, int width, int height) 
{    
    Size optimalSize = null;         

    double targetRatio = (double) width/height; 
    int Max = 0; 

    for (Size size : sizes) 
    { 
     double ratio = (double) size.width/size.height; 
     int m = size.width * size.height; 
     if (m>Max && (ratio == targetRatio)) 
     { 
      Max = m; 
      optimalSize = size; 
     }     
    } 

    if (optimalSize == null) 
    { 
     // TODO : Backup in case we don't get a size. 
    } 

    return optimalSize; 
} 
관련 문제