如何在Android上阅读JPG文件的DPI?

时间:2013-05-09 20:23:58

标签: android jpeg dpi

是否有可以从jpg文件(like pngj for PNG)读取DPI的java库?这是Android上的代码所以我不能使用java.awt.image。*

如果有一种方法可以使用Android Bitmap类,那就太棒了。

1 个答案:

答案 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标记的片段长度”,所以如果它太小,你就无法读取密度部分并且可能会阅读与密度无关。

我希望你能明白这一点,并不是很难修复我的代码。