有沒有可以從jpg文件讀取DPI的java庫(like pngj for PNG)?這是對Android代碼,所以我不能使用java.awt.image中。*如何在Android上讀取JPG文件的DPI?
如果有一種方法與Android Bitmap類要做到這一點,那將是真棒。
有沒有可以從jpg文件讀取DPI的java庫(like pngj for PNG)?這是對Android代碼,所以我不能使用java.awt.image中。*如何在Android上讀取JPG文件的DPI?
如果有一種方法與Android Bitmap類要做到這一點,那將是真棒。
根據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的長度的「長度」字節不應該被忽視標記「,所以如果它太小,則無法讀取密度部分,並可能讀取與密度無關的事物。
我希望你做雖然明白了吧,這並不難解決我的代碼。
示例代碼將不承擔任何JPEG文件工作,因爲JPEG廣告代碼有任何順序,你就數據的位置壞的假設。 APP0標記包含密度(DPI)信息,但通常無效。 – BitBank 2013-05-15 15:30:27
那麼這就是爲什麼我寫道,如果你發現任何錯誤,請讓我知道要修改它要改變什麼。由於我不是jpeg編寫方式(和大多數文件類型)方面的專家,我所做的全部都是從某些網站讀取並寫入示例代碼。如果你知道如何修復代碼,請告訴我。 – 2013-05-15 19:06:18
我基本上已經給你答案。你需要走一連串的JPEG標籤並找到FFE0。然後代碼將在所有JPEG文件上工作。 – BitBank 2013-05-15 20:54:42
爲什麼它甚至需要? DPI數據用於打印,而不是屏幕。當您將文件放入資源文件夾時,您將決定使用什麼密度作爲圖像... – 2013-05-09 20:25:39
我們正在生成PDF文件,我們使用DPI來確定頁面上圖像的大小。 – 2013-05-09 20:29:00
公共靜態INT dpToPixels(上下文上下文中,浮子DP){ \t最終浮動規模= context.getResources()getDisplayMetrics()密度。; \t return(int)(dp * scale + 0.5f); \t} – JRowan 2013-05-09 20:50:35