Java TGA loader

后端 未结 5 1429

I am looking for a small and free TGA image loading class or library for java. Ideally the result is a BufferedImage.

Yes, I have already googled, but most results a

5条回答
  •  太阳男子
    2021-01-05 02:54

    We use this class copied from some open source project to read TGA files. It's really old. It can only handle Targa files with most basic encoding. Give it a try.

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

提交回复
热议问题