2009-10-03 14 views
7

Je suis à la recherche d'une classe ou bibliothèque de chargement d'images TGA petite et gratuite pour Java. Idéalement, le résultat est une image tamponnée.Java TGA loader

Oui, j'ai déjà googlé, mais la plupart des résultats sont dépassés, ou sont de grandes bibliothèques qui contiennent beaucoup d'autres choses dont je n'ai pas besoin. Je cherche quelque chose de petit et simple qui lit juste des images de TGA.

Merci!

Répondre

8

Nous utilisons cette classe copiée depuis un projet open source pour lire des fichiers TGA. C'est vraiment vieux. Il ne peut gérer que les fichiers Targa avec l'encodage le plus basique. Essaie.

public class TargaReader 
{ 
     public static Image getImage(String fileName) throws IOException 
     { 
       File f = new File(fileName); 
       byte[] buf = new byte[(int)f.length()]; 
       BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f)); 
       bis.read(buf); 
       bis.close(); 
       return decode(buf); 
     } 

     private static int offset; 

     private static int btoi(byte b) 
     { 
       int a = b; 
       return (a<0?256+a:a); 
     } 

     private static int read(byte[] buf) 
     { 
       return btoi(buf[offset++]); 
     } 

     public static Image decode(byte[] buf) throws IOException 
     { 
       offset = 0; 

       // Reading header 
       for (int i=0;i<12;i++) 
         read(buf); 
       int width = read(buf)+(read(buf)<<8); 
       int height = read(buf)+(read(buf)<<8); 
       read(buf); 
       read(buf); 

       // Reading data 
       int n = width*height; 
       int[] pixels = new int[n]; 
       int idx=0; 

       while (n>0) 
       { 
         int nb = read(buf); 
         if ((nb&0x80)==0) 
         { 
           for (int i=0;i<=nb;i++) 
           { 
             int b = read(buf); 
             int g = read(buf); 
             int r = read(buf); 
             pixels[idx++] = 0xff000000 | (r<<16) | (g<<8) | b; 
           } 
         } 
         else 
         { 
           nb &= 0x7f; 
           int b = read(buf); 
           int g = read(buf); 
           int r = read(buf); 
           int v = 0xff000000 | (r<<16) | (g<<8) | b; 
           for (int i=0;i<=nb;i++) 
             pixels[idx++] = v; 
         } 
         n-=nb+1; 
       } 

       BufferedImage bimg = new BufferedImage(width,height,BufferedImage.TYPE_INT_ARGB); 
       bimg.setRGB(0,0,width,height,pixels,0,width); 
       return bimg; 
     } 
} 
+1

merci beaucoup! un premier essai me donne un arrayoutofboundsexception dans cette ligne: \t \t \t \t for (int i = 0; i <= nb; i ++) \t \t \t \t \t pixels [IDX ++] = v; – clamp

+0

@clamp change <= nb à throwaway

+0

Mon résultat d'image a été retourné vers le bas. aucun conseil? – squallbayu

9

J'avais des images targa non compressées, donc je devais modifier un exemple de code. Voici ma modifier il devrait soutenir BGR non compressé targa 24bit et 32bit BGRA

// http://paulbourke.net/dataformats/tga/ 
// little endian multi-byte integers: "low-order byte,high-order byte" 
//   00,04 -> 04,00 -> 1024 
class TargaReader { 
     public static BufferedImage getImage(String fileName) throws IOException { 
       File f = new File(fileName); 
       byte[] buf = new byte[(int)f.length()]; 
       BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f)); 
       bis.read(buf); 
       bis.close(); 
       return decode(buf); 
     } 

     private static int offset; 

     private static int btoi(byte b) { 
       int a = b; 
       return (a<0?256+a:a); 
     } 

     private static int read(byte[] buf) { 
       return btoi(buf[offset++]); 
     } 

     public static BufferedImage decode(byte[] buf) throws IOException { 
       offset = 0; 

       // Reading header bytes 
       // buf[2]=image type code 0x02=uncompressed BGR or BGRA 
       // buf[12]+[13]=width 
       // buf[14]+[15]=height 
       // buf[16]=image pixel size 0x20=32bit, 0x18=24bit 
       // buf{17]=Image Descriptor Byte=0x28 (00101000)=32bit/origin upperleft/non-interleaved 
       for (int i=0;i<12;i++) 
         read(buf); 
       int width = read(buf)+(read(buf)<<8); // 00,04=1024 
       int height = read(buf)+(read(buf)<<8); // 40,02=576 
       read(buf); 
       read(buf); 

       int n = width*height; 
       int[] pixels = new int[n]; 
       int idx=0; 

       if (buf[2]==0x02 && buf[16]==0x20) { // uncompressed BGRA 
        while(n>0) { 
         int b = read(buf); 
         int g = read(buf); 
         int r = read(buf); 
         int a = read(buf); 
         int v = (a<<24) | (r<<16) | (g<<8) | b; 
         pixels[idx++] = v; 
         n-=1; 
        } 
       } else if (buf[2]==0x02 && buf[16]==0x18) { // uncompressed BGR 
        while(n>0) { 
         int b = read(buf); 
         int g = read(buf); 
         int r = read(buf); 
         int a = 255; // opaque pixel 
         int v = (a<<24) | (r<<16) | (g<<8) | b; 
         pixels[idx++] = v; 
         n-=1; 
        } 
       } else { 
        // RLE compressed 
        while (n>0) { 
         int nb = read(buf); // num of pixels 
         if ((nb&0x80)==0) { // 0x80=dec 128, bits 10000000 
          for (int i=0;i<=nb;i++) { 
           int b = read(buf); 
           int g = read(buf); 
           int r = read(buf); 
           pixels[idx++] = 0xff000000 | (r<<16) | (g<<8) | b; 
          } 
         } else { 
          nb &= 0x7f; 
          int b = read(buf); 
          int g = read(buf); 
          int r = read(buf); 
          int v = 0xff000000 | (r<<16) | (g<<8) | b; 
          for (int i=0;i<=nb;i++) 
           pixels[idx++] = v; 
         } 
         n-=nb+1; 
        } 
       } 

       BufferedImage bimg = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); 
       bimg.setRGB(0, 0, width,height, pixels, 0,width); 
       return bimg; 
     } 
} 
+0

Salut, Qui es-tu encore là? merci pour votre réponse, il a presque parfaitement résolu mon problème, mais il y a toujours une petite tache, c'est-à-dire, jamais corriger la direction du fichier tga. –

+0

Im ici, votre problème est une orientation est faux/retourné/en miroir? À l'écran ou enregistré dans un fichier png? Exemple de fichiers tga disponibles? – Whome

+0

Salut Whome, voici mon problème et quelqu'un m'a offert la réponse ... Merci. http://stackoverflow.com/questions/29845136/how-to-get-the-direction-of-tga-file-in-java –

4

J'ai ajouté une copie autonome de la réalité bibliothèque ImageIO TGA Interactive ici (LGPL):

https://github.com/tmyroadctfig/com.realityinteractive.imageio.tga


Ajoutez simplement le fichier jar à votre chemin de classe et enregistrez-vous avec ImageIO:

IIORegistry registry = IIORegistry.getDefaultInstance(); 
registry.registerServiceProvider(
    new com.realityinteractive.imageio.tga.TGAImageReaderSpi()); 
1

Merci de l'avoir Partager!

J'ai apporté quelques modifications pour améliorer les performances. Je ne fais que décrypter le fichier BGRA 32 bits, mais il peut aider les autres.

public static BufferedImage createTGAImage(byte[] buff) throws IOException { 
    int offset = 0, width = 0, height = 0; 
    int[] tgaBuffer = null; 

    if (buff[2] == 0x02) { // BGRA File 

     offset = 12; 
     width = (buff[offset + 1] << 8 | buff[offset]); 

     offset = 14; 
     height = (buff[offset + 1] << 8 | buff[offset]); 

     int colorDepth = buff[offset + 2]; 

     if (colorDepth == 0x20) { // 32 bits depth 
      offset = 18; 

      int count = width * height; 
      tgaBuffer = new int[count]; 

      for (int i = 0; i < count; i++) { 
       byte b = buff[offset++]; //This is for didatic prupose, you can remove it and make inline covert. 
       byte g = buff[offset++]; 
       byte r = buff[offset++]; 
       byte a = buff[offset++]; 

       tgaBuffer[i] = ((a & 0xFF) << 24 | (r & 0xFF) << 16 | (g & 0xFF)<< 8 | b & 0xFF); 
      } 
     } 
    } 

    BufferedImage result = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); 
    result.setRGB(0, 0, width, height, tgaBuffer, 0, width); 

    return result; 
} 
4

Juste au cas où quelqu'un est à la recherche de la version Android de ce (que je devais remplacer BufferedImage avec Bitmap).

class TargaReader { 
    public static Bitmap getImage(String fileName) throws IOException { 
     File f = new File(fileName); 
     byte[] buf = new byte[(int) f.length()]; 
     BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f)); 
     bis.read(buf); 
     bis.close(); 
     return decode(buf); 
    } 

    private static int offset; 

    private static int btoi(byte b) { 
     int a = b; 
     return (a < 0 ? 256 + a : a); 
    } 

    private static int read(byte[] buf) { 
     return btoi(buf[offset++]); 
    } 

    public static Bitmap decode(byte[] buf) throws IOException { 
     offset = 0; 

     // Reading header bytes 
     // buf[2]=image type code 0x02=uncompressed BGR or BGRA 
     // buf[12]+[13]=width 
     // buf[14]+[15]=height 
     // buf[16]=image pixel size 0x20=32bit, 0x18=24bit 
     // buf{17]=Image Descriptor Byte=0x28 (00101000)=32bit/origin 
     //   upperleft/non-interleaved 
     for (int i = 0; i < 12; i++) 
      read(buf); 
     int width = read(buf) + (read(buf) << 8); // 00,04=1024 
     int height = read(buf) + (read(buf) << 8); // 40,02=576 
     read(buf); 
     read(buf); 

     int n = width * height; 
     int[] pixels = new int[n]; 
     int idx = 0; 

     if (buf[2] == 0x02 && buf[16] == 0x20) { // uncompressed BGRA 
      while (n > 0) { 
       int b = read(buf); 
       int g = read(buf); 
       int r = read(buf); 
       int a = read(buf); 
       int v = (a << 24) | (r << 16) | (g << 8) | b; 
       pixels[idx++] = v; 
       n -= 1; 
      } 
     } else if (buf[2] == 0x02 && buf[16] == 0x18) { // uncompressed BGR 
      while (n > 0) { 
       int b = read(buf); 
       int g = read(buf); 
       int r = read(buf); 
       int a = 255; // opaque pixel 
       int v = (a << 24) | (r << 16) | (g << 8) | b; 
       pixels[idx++] = v; 
       n -= 1; 
      } 
     } else { 
      // RLE compressed 
      while (n > 0) { 
       int nb = read(buf); // num of pixels 
       if ((nb & 0x80) == 0) { // 0x80=dec 128, bits 10000000 
        for (int i = 0; i <= nb; i++) { 
         int b = read(buf); 
         int g = read(buf); 
         int r = read(buf); 
         pixels[idx++] = 0xff000000 | (r << 16) | (g << 8) | b; 
        } 
       } else { 
        nb &= 0x7f; 
        int b = read(buf); 
        int g = read(buf); 
        int r = read(buf); 
        int v = 0xff000000 | (r << 16) | (g << 8) | b; 
        for (int i = 0; i <= nb; i++) 
         pixels[idx++] = v; 
       } 
       n -= nb + 1; 
      } 
     } 

     Bitmap bimg = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
     bimg.setPixels(pixels, 0, width, 0, 0, width, height); 
     return bimg; 
    } 
}