2013-05-09 1 views
1

jpg 파일 (like pngj for PNG)에서 DPI를 읽을 수있는 Java 라이브러리가 있습니까? 이것은 안드로이드에 대한 코드이므로 java.awt.image를 사용할 수 없습니다. *안드로이드에서 JPG 파일의 DPI를 읽으려면 어떻게해야합니까?

그리고 안드로이드 비트 맵 클래스로이를 수행하는 방법이 있다면 정말 멋지게 될 것입니다.

+0

왜 필요한가요? DPI 데이터는 화면이 아닌 인쇄에 사용됩니다. 파일을 자원 폴더에 넣으면 이미지에 사용할 밀도를 결정합니다. –

+0

우리는 PDF 파일을 생성하고 DPI를 사용하여 페이지의 이미지 크기를 결정합니다. –

+0

public static int dpToPixels (Context context, float dp) { \t final float scale = context.getResources(). getDisplayMetrics(). 밀도; \t return (int) (dp * scale + 0.5f); \t} – JRowan

답변

0

wikipedia에있어서, 이것은 JPEG 메타 작동 방법이다

제 2 바이트 (here를 지정된 SOI) 0xFFD8이다. 메타 데이터가있는 경우 0xFFE0 (2 바이트)

길이 세그먼트 (2 바이트) 식별자 세그먼트 (5 바이트 : 0x4A46494600)가 있으면 버전 세그먼트 (2 바이트) , 밀도 :

밀도 단위는 지정되지 않은 경우 1, PPI의 경우 1, PPC의 경우 2입니다.

그러면 x 밀도 (2 바이트)와 y 밀도 (2 바이트)를 얻게됩니다.

간단히 말해서 2 + 2 + 2 + 5 + 2 = 13 바이트를 건너 뛰고 밀도 단위 유형에 대해 1 바이트를 읽어야하며 0이 아닌 경우 밀도 값에 대해 다른 4 바이트를 읽습니다 (x와 y).

희망을 도울 수 있기를 바랍니다.


내가 궁금해서 조사해 보았습니다. 샘플 jpg 파일에서 멋진 스 니펫을 만들었습니다.

final InputStream inputStream=getResources().openRawResource(R.raw.tt); 
try 
    { 
    inputStream.skip(13); 
    final int densityType=inputStream.read(); 
    switch(densityType) 
    { 
    case 0: 
     Log.d("DEBUG","no density specified"); 
     break; 
    case 1: 
     Log.d("DEBUG","density in PPI"); 
     break; 
    case 2: 
     Log.d("DEBUG","density in PPC"); 
     break; 
    } 
    if(densityType!=0) 
    { 
    final byte[] densityValue=new byte[2]; 
    inputStream.read(densityValue); 
    final int xDensity=(densityValue[0]<<8)+densityValue[1]; 
    inputStream.read(densityValue); 
    final int yDensity=(densityValue[0]<<8)+densityValue[1]; 
    Log.d("DEBUG","xDensity:"+xDensity+" yDensity:"+yDensity); 
    } 
    } 
catch(final IOException e) 
    {} 
try 
    { 
    inputStream.close(); 
    } 
catch(final IOException e) 
    {} 

편집 : 내가 너무 잘 문서를 읽지 않은대로, 모든 파일을 위해 일하는 것이 희망 나는 그들이 세그먼트 제외 APP0의 "길이를 대표로"길이 "바이트 무시해서는 안됩니다 생각 마커 "이므로 너무 작 으면 밀도 부분을 읽을 수 없으며 밀도와 관련이없는 내용을 읽을 수 있습니다.

나는 당신이 요점을 얻길 희망하고, 내 코드를 고치는 것은 그리 어렵지 않다.

+0

jpeg 태그가 임의의 순서로 올 수 있고 데이터 위치에 대해 잘못된 가정을하기 때문에 샘플 코드가 모든 JPEG 파일에서 작동하지 않습니다. APP0 마커는 밀도 (DPI) 정보를 포함하지만 일반적으로 유효하지 않습니다. – BitBank

+0

글쎄, 그래서 내가 잘못 쓴 것이 있으면, 수정하기 위해 무엇을 바꾸어야하는지 알려주세요. 이후 jpeg (및 대부분의 파일 형식) 작성된 전문가가 아니기 때문에, 내가 한 모든 웹 사이트에서 읽고 샘플 코드를 작성합니다. 코드를 수정하는 방법을 알고 있다면 알려주십시오. –

+0

나는 기본적으로 이미 당신에게 대답을주었습니다. JPEG 태그 체인을 걸어보고 FFE0을 찾아야합니다. 그러면 코드가 모든 JPEG 파일에서 작동합니다. – BitBank