Je recherche une classe ou une bibliothèque de chargement de TGA de petite et gratuite pour Java. Idéalement, le résultat est un bufferedimage. P>
Oui, j'ai déjà googlé, mais la plupart des résultats sont obsolètes ou sont des bibliothèques assez grandes qui contiennent beaucoup d'autres choses que je n'ai pas besoin. Je cherche quelque chose de petit et simple qui lit simplement des images TGA. P>
Merci! P>
5 Réponses :
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 le plus de codage de base. Essayez-le.
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; } }
Merci beaucoup! Un premier essai me donne une erreur ArrayoutOfboundsException dans cette ligne: pour (int i = 0; i <= nb; i ++) pixels [IDX ++] = v;
@Clamp Change <= NB sur
Mon résultat de mon image s'est retourné. aucun conseil?
J'ai eu des images Targa non compressées, alors dû modifier un code d'exemple. Voici mon édition, il devrait prendre en charge le BGR TARGA 24 bits non compressé 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; } }
Salut, que, es-tu toujours là? Merci de votre réponse, cela résolue presque parfaitement mon problème, mais il reste encore une petite défaut, c'est-à-dire, ne corrige jamais la direction des fichiers TGA.
Je suis ici, votre problème est une orientation est erronée / renversée / miroir? À l'écran ou enregistré dans le fichier PNG? Exemple de fichiers TGA disponibles?
Bonjour, voici mon problème et quelqu'un m'a offert la réponse ... merci.
J'ai ajouté une copie autonome de la bibliothèque de TGA image de réalité interactive interactive ici (LGPL):
Merci de le partager!
J'ai apporté des modifications pour améliorer les performances. Je ne fais que faire que BGRA 32 bits file Decrypt, mais cela peut aider les autres personnes. P>
Juste au cas où n'importe qui est à la recherche de la version Android de ceci (je devais remplacer bufferedimage code> avec
bitmap code>).
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;
}
}