Java-Gaming.org    
Featured games (79)
games approved by the League of Dukes
Games in Showcase (475)
Games in Android Showcase (106)
games submitted by our members
Games in WIP (530)
games currently in development
News: Read the Java Gaming Resources, or peek at the official Java tutorials
 
    Home     Help   Search   Login   Register   
Pages: [1]
  ignore  |  Print  
  Image Dimensions from InputStream  (Read 645 times)
0 Members and 1 Guest are viewing this topic.
Online Riven
« League of Dukes »

JGO Overlord


Medals: 742
Projects: 4
Exp: 16 years


Hand over your head.


« Posted 2011-05-09 23:28:00 »

The following code reads the width, height and type (png/jpeg/etc..) of an image from an InputStream and closes it immediately.
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  
38  
39  
40  
41  
42  
43  
44  
45  
46  
47  
48  
49  
50  
51  
52  
53  
54  
55  
56  
57  
58  
59  
60  
61  
62  
63  
64  
65  
66  
67  
68  
69  
70  
71  
72  
73  
74  
75  
76  
77  
78  
79  
80  
81  
82  
83  
84  
85  
86  
87  
88  
89  
90  
91  
92  
93  
94  
95  
96  
97  
98  
99  
100  
101  
102  
103  
104  
105  
106  
107  
108  
109  
110  
111  
112  
113  
114  
115  
116  
117  
118  
119  
120  
121  
122  
123  
124  
125  
126  
127  
128  
129  
130  
131  
132  
133  
134  
135  
136  
137  
138  
139  
140  
141  
142  
143  
144  
145  
146  
147  
148  
149  
150  
151  
152  
153  
154  
155  
156  
157  
158  
159  
160  
161  
162  
163  
164  
165  
166  
167  
168  
169  
170  
171  
172  
173  
174  
175  
176  
177  
178  
179  
180  
181  
182  
   public enum ImageType
   {
      TGA, BMP, JPG, GIF, PNG;
   }

   public class ImageMetaData
   {
      public final ImageType type;
      public final int       width;
      public final int       height;

      public ImageMetaData(ImageType type, int width, int height)
      {
         this.type = type;
         this.width = width;
         this.height = height;
      }

      public Dimension getDimension()
      {
         return new Dimension(this.width, this.height);
      }

      public String toString()
      {
         return type.name() + ":" + this.width + "x" + this.height;
      }
   }

   public static Dimension getImageSize(InputStream in) throws IOException
   {
      ImageMetaData meta = getImageTypeAndSize(in);
      if(meta == null) return null;
      return new Dimension(meta.width, meta.height);
   }

   public static ImageMetaData getImageTypeAndSize(InputStream in) throws IOException
   {
      DataInputStream dis = new DataInputStream(new BufferedInputStream(in));

      try
      {
         int header = dis.readUnsignedShort();

         if (header == 0x8950)
         {
            // PNG!
           dis.readFully(new byte[(8 - 2) + 4 + 4]); // thanks Abuse

            return new ImageMetaData(ImageType.PNG, dis.readInt(), dis.readInt());
         }

         if (header == 0xffd8)
         {
            // JPG!

            while (true)
            {
               int marker = dis.readUnsignedShort();

               switch (marker)
               {
                  case 0xffd8: // SOI
                 case 0xffd0: // RST0
                 case 0xffd1: // RST1
                 case 0xffd2: // RST2
                 case 0xffd3: // RST3
                 case 0xffd4: // RST4
                 case 0xffd5: // RST5
                 case 0xffd6: // RST6
                 case 0xffd7: // RST7
                 case 0xffd9: // EOI
                    break;

                  case 0xffdd: // DRI
                    dis.readUnsignedShort();
                     break;

                  case 0xffe0: // APP0
                 case 0xffe1: // APP1
                 case 0xffe2: // APP2
                 case 0xffe3: // APP3
                 case 0xffe4: // APP4
                 case 0xffe5: // APP5
                 case 0xffe6: // APP6
                 case 0xffe7: // APP7
                 case 0xffe8: // APP8
                 case 0xffe9: // APP9
                 case 0xffea: // APPa
                 case 0xffeb: // APPb
                 case 0xffec: // APPc
                 case 0xffed: // APPd
                 case 0xffee: // APPe
                 case 0xffef: // APPf
                 case 0xfffe: // COM
                 case 0xffdb: // DQT
                 case 0xffc4: // DHT
                 case 0xffda: // SOS
                    dis.readFully(new byte[dis.readUnsignedShort() - 2]);
                     break;

                  case 0xffc0: // SOF0
                 case 0xffc2: // SOF2
                    dis.readUnsignedShort();
                     dis.readByte();
                     int height = dis.readUnsignedShort();
                     int width = dis.readUnsignedShort();
                     return new ImageMetaData(ImageType.JPG, width, height);

                  default:
                     throw new IllegalStateException("invalid jpg marker: " + Integer.toHexString(marker));
               }
            }
         }
         else if (header == 0x424D)
         {
            // BMP!
           dis.readFully(new byte[16]);

            int w = PrimIO.swap32(dis.readInt());
            int h = PrimIO.swap32(dis.readInt());
            return new ImageMetaData(ImageType.BMP, w, h);
         }
         else if (header == (('G' << 8) | ('I' << 0))) // GIF
        {
            // GIF!
           dis.readFully(new byte[4]);
            int w = PrimIO.swap16(dis.readUnsignedShort());
            int h = PrimIO.swap16(dis.readUnsignedShort());
            return new ImageMetaData(ImageType.GIF, w, h);
         }
         else
         // TGA?
        {
            // TGA doesn't have a magic number, try to parse
           byte[] tgaRemainingHeader = new byte[18 - 2];
            try
            {
               dis.readFully(tgaRemainingHeader);
            }
            catch (EOFException exc)
            {
               return null;
               //throw new IllegalStateException("unsupported image type. (header: " + Integer.toHexString(header) + ")");
           }

            try
            {
               if (tgaRemainingHeader[2 - 2] != 2) // uncompressed
                 throw new IllegalStateException();
               int w = 0, h = 0;
               w |= (tgaRemainingHeader[12 - 2] & 0xFF) << 0;
               w |= (tgaRemainingHeader[13 - 2] & 0xFF) << 8;
               h |= (tgaRemainingHeader[14 - 2] & 0xFF) << 0;
               h |= (tgaRemainingHeader[15 - 2] & 0xFF) << 8;
               if ((w | h) < 0)
                  throw new IllegalStateException();

               boolean alpha;
               if (tgaRemainingHeader[16 - 2] == 24)
                  alpha = false;
               else if (tgaRemainingHeader[16 - 2] == 32)
                  alpha = true;
               else
                  throw new IllegalStateException();
               if (tgaRemainingHeader[17 - 2] != ((alpha ? 8 : 0) & 15))
                  throw new IllegalStateException();

               return new ImageMetaData(ImageType.TGA, w, h);
            }
            catch (IllegalStateException exc)
            {
               return null;
               //throw new IllegalStateException("unsupported image type. (header: " + Integer.toHexString(header) + ")");
           }
         }
      }
      finally
      {
         dis.close();
      }
   }

Hi, appreciate more people! Σ ♥ = ¾
Learn how to award medals... and work your way up the social rankings
Pages: [1]
  ignore  |  Print  
 
 
You cannot reply to this message, because it is very, very old.

 

Add your game by posting it in the WIP section,
or publish it in Showcase.

The first screenshot will be displayed as a thumbnail.

ctomni231 (34 views)
2014-07-18 06:55:21

Zero Volt (30 views)
2014-07-17 23:47:54

danieldean (25 views)
2014-07-17 23:41:23

MustardPeter (27 views)
2014-07-16 23:30:00

Cero (42 views)
2014-07-16 00:42:17

Riven (44 views)
2014-07-14 18:02:53

OpenGLShaders (32 views)
2014-07-14 16:23:47

Riven (31 views)
2014-07-14 11:51:35

quew8 (30 views)
2014-07-13 13:57:52

SHC (66 views)
2014-07-12 17:50:04
HotSpot Options
by dleskov
2014-07-08 03:59:08

Java and Game Development Tutorials
by SwordsMiner
2014-06-14 00:58:24

Java and Game Development Tutorials
by SwordsMiner
2014-06-14 00:47:22

How do I start Java Game Development?
by ra4king
2014-05-17 11:13:37

HotSpot Options
by Roquen
2014-05-15 09:59:54

HotSpot Options
by Roquen
2014-05-06 15:03:10

Escape Analysis
by Roquen
2014-04-29 22:16:43

Experimental Toys
by Roquen
2014-04-28 13:24:22
java-gaming.org is not responsible for the content posted by its members, including references to external websites, and other references that may or may not have a relation with our primarily gaming and game production oriented community. inquiries and complaints can be sent via email to the info‑account of the company managing the website of java‑gaming.org
Powered by MySQL Powered by PHP Powered by SMF 1.1.18 | SMF © 2013, Simple Machines | Managed by Enhanced Four Valid XHTML 1.0! Valid CSS!