2015-03-18 3 views
0

Je voudrais convertir des images sur SDcard en bitmap. J'utilise le code ci-dessousComment convertir un fichier image TIFF en Bitmap Android

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

Ce code fonctionne bien pour le fichier avec l'extension .jpg ou .png mais pas pour .tif ou .tiff. Pour les fichiers TIFF bm devient null aucune exception rien que tous les chemins de fichier sont valides.

Existe-t-il une limitation dans Android BitmapFactory en ce qui concerne le décodage des images TIFF?

Également essayé decodeByteArray and decodeStream, ressemble à une limitation pour moi. Je suis capable de lire le fichier image TIFF byte [] mais la conversion de l'octet [] ou un fichier flux d'entrée en tant que bitmap retourne null

S'il vous plaît laissez-moi savoir tout autre moyen de convertir le fichier image TIFF Bitmap.

+0

double possible de [Y at-il un équivalent de BitmapFactory.Options d'Android isDecodeBounds pour TIFF en Java/JAI?] (Http://stackoverflow.com/questions/ 15645174/is-there-a-equivalent-of-androids-bitmapfactory-options-isdecodebounds-for-tiff) – GreyBeardedGeek

+1

Je ne crois pas que 'BitMapFacotry' prenne en charge TIFF. Le format TIFF est un format de fichier assez complexe (prend en charge des combinaisons pratiquement illimitées de profondeurs de bits, nombre de canaux, algorithmes de compression, etc.). Vous voulez probablement utiliser libTiff, plutôt que de l'implémenter vous-même (sauf si vous aimez vraiment faire de telles choses, comme moi ... :-)). – haraldK

+0

@GreyBeardedGeek Non, je ne pense pas que ce soit lié. – haraldK

Répondre

0

Les fichiers TIFF ne sont pas pris en charge sous Android. Vérifiez la liste des supported media formats.

Si vous souhaitez prendre en charge les fichiers TIFF, vous devrez les décoder manuellement ou trouver une bibliothèque qui le fait pour vous.

0

Comme VERT9x dit fichiers TIFF ne sont pas pris en charge sur Android. Mais vous pouvez les convertir en utilisant la bibliothèque native Android comme https://github.com/puelocesar/android-lib-magick. Ceci est un exemple de code pour convertir jpg en tif. J'espère que cela t'aides.

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(); 
0

Pour décoder un simple fichier TIF couleur va comme ci-dessous:

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]; 
} 

Si vous souhaitez voir le code complet puis voir ici: Decode Tiff Image in Android Java Code