2013-05-09 35 views
1

有沒有可以從jpg文件讀取DPI的java庫(like pngj for PNG)?這是對Android代碼,所以我不能使用java.awt.image中。*如何在Android上讀取JPG文件的DPI?

如果有一種方法與Android Bitmap類要做到這一點,那將是真棒。

+0

爲什麼它甚至需要? DPI數據用於打印,而不是屏幕。當您將文件放入資源文件夾時,您將決定使用什麼密度作爲圖像... – 2013-05-09 20:25:39

+0

我們正在生成PDF文件,我們使用DPI來確定頁面上圖像的大小。 – 2013-05-09 20:29:00

+0

公共靜態INT dpToPixels(上下文上下文中,浮子DP){ \t最終浮動規模= context.getResources()getDisplayMetrics()密度。; \t return(int)(dp * scale + 0.5f); \t} – JRowan 2013-05-09 20:50:35

回答

0

根據wikipedia,這是JPEG元數據是如何工作的:

前2個字節是0xFFD8(SOI作爲指定here)。如果有元數據,則得到0xFFE0(2字節)

如果存在元數據,則存在長度段(2字節)的標識符段(5字節:0x4A46494600),則版本段(2字節) ,則密度:

密度單位是1個字節:0爲無指定,1 PPI,2 PPC。

然後你得到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 2013-05-15 15:30:27

+0

那麼這就是爲什麼我寫道,如果你發現任何錯誤,請讓我知道要修改它要改變什麼。由於我不是jpeg編寫方式(和大多數文件類型)方面的專家,我所做的全部都是從某些網站讀取並寫入示例代碼。如果你知道如何修復代碼,請告訴我。 – 2013-05-15 19:06:18

+0

我基本上已經給你答案。你需要走一連串的JPEG標籤並找到FFE0。然後代碼將在所有JPEG文件上工作。 – BitBank 2013-05-15 20:54:42

相關問題