Как преобразовать файл изображения TIFF в Bitmap Android

Я хочу преобразовать изображения на SD-карте в растровое изображение. Я использую код ниже

String filepath = "/storage/emulated/0/Download/sample2.tif";
    Bitmap bm = BitmapFactory.decodeFile(filepath);

Этот код отлично работает для файлов с расширением .jpg или .png, но не для файлов .tif или .tiff. Для файлов TIFF bm становится нулевым без исключений ничего, все пути к файлам действительны.

Есть ли в Android BitmapFactory какие-либо ограничения в отношении декодирования изображений TIFF?

Также пробовал decodeByteArray and decodeStream, похоже на ограничение для меня. Я могу читать файл изображения TIFF как byte [], но преобразование байта [] или входного потока файла, поскольку растровое изображение возвращает значение null

Сообщите мне о любом другом способе преобразования файла изображения TIFF в растровое изображение.


person Ganesh K    schedule 18.03.2015    source источник
comment
возможный дубликат Есть ли эквивалент BitmapFactory для Android .Options isDecodeBounds для TIFF в Java / JAI?   -  person GreyBeardedGeek    schedule 18.03.2015
comment
Я не верю, что BitMapFacotry поддерживает TIFF. Формат TIFF - довольно сложный формат файла (поддерживает практически неограниченные комбинации битовой глубины, количества каналов, алгоритмов сжатия и т. Д.). Вероятно, вы захотите использовать libTiff, а не реализовывать его самостоятельно (если вам не нравится делать такие вещи, как я ... :-)).   -  person Harald K    schedule 18.03.2015
comment
@GreyBeardedGeek Нет, я не думаю, что это связано.   -  person Harald K    schedule 18.03.2015


Ответы (4)


Файлы TIFF изначально не поддерживаются на Android. Проверьте список поддерживаемых форматов мультимедиа.

Если вы хотите поддерживать файлы TIFF, вам придется декодировать их вручную или найти библиотеку, которая сделает это за вас.

person VERT9x    schedule 18.03.2015

Как сказал VERT9x, файлы TIFF не поддерживаются на Android. Но вы можете конвертировать их туда и обратно, используя собственную библиотеку Android, например https://github.com/puelocesar/android-lib-magick. Это пример кода для преобразования jpg в tif. Надеюсь это поможет.

MagickImage Image = new MagickImage(new ImageInfo(IMAGE_PATH));
// Image = Image.scaleImage(800, 800);
Image.setImageFormat("tif");
Image.setFileName(str);
ImageInfo localImageInfo = new ImageInfo(str);
localImageInfo.setMagick("tif");
Image.writeImage(localImageInfo);
// store as tif
byte[] blob = Image.imageToBlob(localImageInfo);
FileOutputStream localFileOutputStream = new FileOutputStream(str);
localFileOutputStream.write(blob);
localFileOutputStream.close();
person Community    schedule 09.06.2015

Чтобы декодировать простой цветной файл tif, выполните следующие действия:

    String taginfo="";String strVal=""; //These are Tiff Tags

    FileInputStream fis;BufferedInputStream bis;DataInputStream dis;

    path=Environment.getExternalStorageDirectory().getPath();   
    path=path+"/DCIM"+"/fileName.tif";  //whatever is your file-name.tif

    try{
         fis=new FileInputStream(path);
         bis=new bufferedInputStream(fis);
         dis=new DataInputStream(bis);

         dis.skip(4);              //skip 4 byte marker of TIFF+endian
         ifd=myInt(dis.readInt()); //read the 4 byte IFD-location

         txt="TIFF-IFD: "; //txt is the final text displayed in textView
         txt=txt+ifd;
         dis.skip(ifd-8); 
         entries=myShort(dis.readShort()); //read in your endian-style  
         txt=txt+"\nNo.OfEntries="+entries;

         for(int i=0;i<=entries;i++)
           {    
            tag=myShort( dis.readShort() );
            taginfo=tagInfo(tag); //tagInfo function returns info associated 
                                   //with tag
            type=myShort( dis.readShort() );
            count=myInt( dis.readInt() );
            value=myInt( dis.readInt() ); 

            if(type==3)strVal="Value="; else strVal="Offset=";

            if( strVal.equals("Offset=") )
            {
                if( taginfo.equals("StripOffsets") )   //image is stored as
                    {stripAt=value;stripCount=count;}  // strips of rows

                if( taginfo.equals("StripBytes")   )
                    {stripBytesAt=value;}
            }

            if( taginfo.equals("width") ){cols=value;}

            if( taginfo.equals("length") ){rows=value;}

            txt=txt+"\ntag="+tag+"" + tagInfo(tag) + ",type=" + type +  
                    ",count=" + count + strVal + value;
           }
         dis.close();bis.close();fis.close(); 

        }catch(Exception e)     { txt = txt + "\nerror=" + e.toString(); }

    txt=txt+"\nNo.OfStrips="+stripCount+",array of strip locations at: 
        "+stripAt+" and array of bytesPerStrip at "+stripBytesAt ;

    extractBMP(); // a function you will define to combine all strips to 
                   //bitmap image
}


public int myShort(short sh)
{   int i;
    ByteBuffer shortBuff=ByteBuffer.allocate(4);
    shortBuff.order(ByteOrder.BIG_ENDIAN);shortBuff.putShort(sh);shortBuff.rewind();
    shortBuff.order(ByteOrder.LITTLE_ENDIAN);sh=shortBuff.getShort();
    if(sh<0)i=(int)(sh+32768); else i=(int)sh;
    return i;
}
public long myInt(int i)
{    long l=0L;
     ByteBuffer intBuff=ByteBuffer.allocate(4);
     intBuff.order(ByteOrder.BIG_ENDIAN);intBuff.putInt(i);intBuff.rewind();
     intBuff.order(ByteOrder.LITTLE_ENDIAN); i=intBuff.getInt();
     if(i<0)l=(long)(i+2147483648L);     else l=(long)i; 
     return l;
}
public String tagInfo(int tag)
{   int i=0;
    switch(tag)
    {case 256: i=0;break;case 257: i=1;break;case 258: i=2;break;case 259: i=3;break;case 262: i=4;break;case 266: i=5;break;
        case 273: i=6;break;case 277: i=7;break;case 278: i=8;break;case 279: i=9;break;case 282: i=10;break;case 283: i=11;break;
        case 284: i=12;break;case 296: i=13;break;case 1496: i=14;break;case 0: i=15;break;
    }
    return info[i];
}

Если вы хотите увидеть полный код, см. Здесь: Декодировать Изображение Tiff в коде Java для Android

person Animesh Shrivastav    schedule 09.10.2017

Попробуйте использовать мою библиотеку. Он поддерживает прямое преобразование из tiff в jpg / png / bmp https://github.com/Beyka/Android-TiffBitmapFactory

person Beyka    schedule 01.02.2018