1

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

如果有办法用 Android Bitmap 类做到这一点,那就太棒了。

4

1 回答 1

0

根据维基百科,这就是 jpeg 元数据的工作方式:

前 2 个字节是 0xFFD8(此处指定的 SOI )。然后,如果有元数据,你会得到 0xFFE0(2 个字节)

如果有元数据,则有长度段(2 字节)标识符段(5 字节:0x4A46494600),然后是版本段(2 字节),然后是密度:

密度单位为 1 个字节:0 表示未指定,1 表示 PPI,2 表示 PPC。

然后你得到 x 密度(2 字节)和 y 密度(2 字节)。

所以,简而言之,你必须跳过 2+2+2+5+2=13 bytes ,读取 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 标记的段长度”,所以如果它太小,您将无法读取密度部分,并且可能会读取没有的内容任何与密度有关的东西。

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

于 2013-05-09T20:49:03.707 回答