是否有可以从 jpg 文件中读取 DPI 的 java 库(例如 pngj for PNG)?这是 Android 上的代码,所以我不能使用 java.awt.image.*
如果有办法用 Android Bitmap 类做到这一点,那就太棒了。
是否有可以从 jpg 文件中读取 DPI 的 java 库(例如 pngj for PNG)?这是 Android 上的代码,所以我不能使用 java.awt.image.*
如果有办法用 Android Bitmap 类做到这一点,那就太棒了。
根据维基百科,这就是 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 标记的段长度”,所以如果它太小,您将无法读取密度部分,并且可能会读取没有的内容任何与密度有关的东西。
我希望你能明白这一点,而且修复我的代码并不难。