public class ImageUtil { public static Dimension getImageDimension(File file) throws IOException { return ImageUtil.getImageDimension(new FileInputStream(file)); } public static Dimension getImageDimension(InputStream in) throws IOException { DataInputStream dis = new DataInputStream(in); try { int header = dis.readUnsignedShort(); if (header == 0x8950) { // PNG dis.readFully(new byte[(8 - 2) + 4 + 4]); // thanks Abuse return new Dimension(dis.readInt(), dis.readInt()); } if (header == 0xffd8) { // JPG (see below) } else if (header == 0x424D) { // BMP dis.readFully(new byte[16]); int w = dis.read() | (dis.read() << 8) | (dis.read() << 16) | (dis.read() << 24); int h = dis.read() | (dis.read() << 8) | (dis.read() << 16) | (dis.read() << 24); return new Dimension(w, h); } else if (header == (('G' << 8) | ('I' << 0))) // GIF { // GIF dis.readFully(new byte[4]); int w = dis.read() | (dis.read() << 8); int h = dis.read() | (dis.read() << 8); return new Dimension(w, h); } else { throw new IllegalStateException("unexpected header: " + Integer.toHexString(header)); } while (true) // JPG is not so straight forward { 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 Dimension(width, height); default: throw new IllegalStateException("invalid jpg marker: " + Integer.toHexString(marker)); } } } finally { dis.close(); } } }
2009-10-26
Image :: read size of JPG/PNG/BMP/GIF
If you would believe Google, everybody is searching for code that reads the dimensions of an image,without loading all those colorful pixels. Oh well, without further ado....
Subscribe to:
Posts (Atom)