是否有可以从jpg文件(like pngj for PNG)读取DPI的java库?这是Android上的代码所以我不能使用java.awt.image。*
如果有一种方法可以使用Android Bitmap类,那就太棒了。
答案 0 :(得分: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标记的片段长度”,所以如果它太小,你就无法读取密度部分并且可能会阅读与密度无关。
我希望你能明白这一点,并不是很难修复我的代码。