согласно 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)
{}
EDIT: я думаю, что байты «длина», не следует игнорировать, поскольку они представляют собой «Длина сегмента за исключением APP0 маркер ", поэтому, если он слишком мал, вы не можете прочитать часть плотности и можете читать вещи, которые не имеют ничего общего с плотностью.
Надеюсь, вы действительно поняли смысл, и его не так сложно исправить.
Почему это даже необходимо? данные DPI используются для печати, а не для экранов. когда вы помещаете файл в папки ресурсов, вы определяете, какую плотность использовать для изображения ... –
Мы создаем PDF-файлы, и мы используем DPI для определения размера изображения на странице. –
public static int dpToPixels (контекстный контекст, float dp) { \t final float scale = context.getResources(). GetDisplayMetrics(). Плотность; \t return (int) (dp * scale + 0.5f); \t} – JRowan