📄 imageinfo.java
字号:
package com.struts2.framework.util;
import java.io.*;
import java.util.Vector;
public class ImageInfo {
private void addComment(String s) {
if (comments == null)
comments = new Vector();
comments.addElement(s);
}
public boolean check() {
format = -1;
width = -1;
height = -1;
bitsPerPixel = -1;
numberOfImages = 1;
physicalHeightDpi = -1;
physicalWidthDpi = -1;
comments = null;
try {
int b1 = read() & 0xff;
int b2 = read() & 0xff;
if (b1 == 71 && b2 == 73)
return checkGif();
if (b1 == 137 && b2 == 80)
return checkPng();
if (b1 == 255 && b2 == 216)
return checkJpeg();
if (b1 == 66 && b2 == 77)
return checkBmp();
if (b1 == 10 && b2 < 6)
return checkPcx();
if (b1 == 70 && b2 == 79)
return checkIff();
if (b1 == 89 && b2 == 166)
return checkRas();
if (b1 == 80 && b2 >= 49 && b2 <= 54)
return checkPnm(b2 - 48);
if (b1 == 56 && b2 == 66)
return checkPsd();
if ((b1 == 70 || b1 == 67) && b2 == 87)
return checkSwf();
else
return false;
} catch (IOException ioexception) {
return false;
}
}
private boolean checkBmp() throws IOException {
byte a[] = new byte[44];
if (read(a) != a.length)
return false;
width = getIntLittleEndian(a, 16);
height = getIntLittleEndian(a, 20);
if (width < 1 || height < 1)
return false;
bitsPerPixel = getShortLittleEndian(a, 26);
if (bitsPerPixel != 1 && bitsPerPixel != 4 && bitsPerPixel != 8
&& bitsPerPixel != 16 && bitsPerPixel != 24
&& bitsPerPixel != 32)
return false;
int x = getIntLittleEndian(a, 36);
if (x > 0)
setPhysicalWidthDpi(x);
int y = getIntLittleEndian(a, 40);
if (y > 0)
setPhysicalHeightDpi(y);
format = 3;
return true;
}
private boolean checkGif() throws IOException {
byte GIF_MAGIC_87A[] = { 70, 56, 55, 97 };
byte GIF_MAGIC_89A[] = { 70, 56, 57, 97 };
byte a[] = new byte[11];
if (read(a) != 11)
return false;
if (!equals(a, 0, GIF_MAGIC_89A, 0, 4)
&& !equals(a, 0, GIF_MAGIC_87A, 0, 4))
return false;
format = 1;
width = getShortLittleEndian(a, 4);
height = getShortLittleEndian(a, 6);
int flags = a[8] & 0xff;
bitsPerPixel = (flags >> 4 & 7) + 1;
if (!determineNumberOfImages)
return true;
if ((flags & 0x80) != 0) {
int tableSize = (1 << (flags & 7) + 1) * 3;
skip(tableSize);
}
numberOfImages = 0;
int blockType;
do {
blockType = read();
switch (blockType) {
case 44: // ','
{
if (read(a, 0, 9) != 9)
return false;
flags = a[8] & 0xff;
int localBitsPerPixel = (flags & 7) + 1;
if (localBitsPerPixel > bitsPerPixel)
bitsPerPixel = localBitsPerPixel;
if ((flags & 0x80) != 0)
skip((1 << localBitsPerPixel) * 3);
skip(1);
int n;
do {
n = read();
if (n > 0)
skip(n);
else if (n == -1)
return false;
} while (n > 0);
numberOfImages++;
break;
}
case 33: // '!'
{
int extensionType = read();
int n;
if (collectComments && extensionType == 254) {
StringBuffer sb = new StringBuffer();
// int n;
do {
n = read();
if (n == -1)
return false;
if (n > 0) {
for (int i = 0; i < n; i++) {
int ch = read();
if (ch == -1)
return false;
sb.append((char) ch);
}
}
} while (n > 0);
} else {
do {
n = read();
if (n > 0)
skip(n);
else if (n == -1)
return false;
} while (n > 0);
}
break;
}
case 34: // '"'
case 35: // '#'
case 36: // '$'
case 37: // '%'
case 38: // '&'
case 39: // '\''
case 40: // '('
case 41: // ')'
case 42: // '*'
case 43: // '+'
case 45: // '-'
case 46: // '.'
case 47: // '/'
case 48: // '0'
case 49: // '1'
case 50: // '2'
case 51: // '3'
case 52: // '4'
case 53: // '5'
case 54: // '6'
case 55: // '7'
case 56: // '8'
case 57: // '9'
case 58: // ':'
default: {
return false;
}
case 59: // ';'
break;
}
} while (blockType != 59);
return true;
}
private boolean checkIff() throws IOException {
byte a[] = new byte[10];
if (read(a, 0, 10) != 10)
return false;
byte IFF_RM[] = { 82, 77 };
if (!equals(a, 0, IFF_RM, 0, 2))
return false;
int type = getIntBigEndian(a, 6);
if (type != 0x494c424d && type != 0x50424d20)
return false;
do {
if (read(a, 0, 8) != 8)
return false;
int chunkId = getIntBigEndian(a, 0);
int size = getIntBigEndian(a, 4);
if ((size & 1) == 1)
size++;
if (chunkId == 0x424d4844)
if (read(a, 0, 9) != 9) {
return false;
} else {
format = 5;
width = getShortBigEndian(a, 0);
height = getShortBigEndian(a, 2);
bitsPerPixel = a[8] & 0xff;
return width > 0 && height > 0 && bitsPerPixel > 0
&& bitsPerPixel < 33;
}
skip(size);
} while (true);
}
private boolean checkJpeg() throws IOException {
byte data[] = new byte[12];
do {
if (read(data, 0, 4) != 4)
return false;
int marker = getShortBigEndian(data, 0);
int size = getShortBigEndian(data, 2);
if ((marker & 0xff00) != 65280)
return false;
if (marker == 65504) {
if (size < 14)
return false;
if (read(data, 0, 12) != 12)
return false;
byte APP0_ID[] = { 74, 70, 73, 70, 0 };
if (equals(APP0_ID, 0, data, 0, 5))
if (data[7] == 1) {
setPhysicalWidthDpi(getShortBigEndian(data, 8));
setPhysicalHeightDpi(getShortBigEndian(data, 10));
} else if (data[7] == 2) {
int x = getShortBigEndian(data, 8);
int y = getShortBigEndian(data, 10);
setPhysicalWidthDpi((int) ((float) x * 2.54F));
setPhysicalHeightDpi((int) ((float) y * 2.54F));
}
skip(size - 14);
} else if (collectComments && size > 2 && marker == 65534) {
byte chars[] = new byte[size -= 2];
if (read(chars, 0, size) != size)
return false;
String comment = new String(chars, "iso-8859-1");
comment = comment.trim();
addComment(comment);
} else {
if (marker >= 65472 && marker <= 65487 && marker != 65476
&& marker != 65480)
if (read(data, 0, 6) != 6) {
return false;
} else {
format = 0;
bitsPerPixel = (data[0] & 0xff) * (data[5] & 0xff);
width = getShortBigEndian(data, 3);
height = getShortBigEndian(data, 1);
return true;
}
skip(size - 2);
}
} while (true);
}
private boolean checkPcx() throws IOException {
byte a[] = new byte[64];
if (read(a) != a.length)
return false;
if (a[0] != 1)
return false;
int x1 = getShortLittleEndian(a, 2);
int y1 = getShortLittleEndian(a, 4);
int x2 = getShortLittleEndian(a, 6);
int y2 = getShortLittleEndian(a, 8);
if (x1 < 0 || x2 < x1 || y1 < 0 || y2 < y1)
return false;
width = (x2 - x1) + 1;
height = (y2 - y1) + 1;
int bits = a[1];
int planes = a[63];
if (planes == 1 && (bits == 1 || bits == 2 || bits == 4 || bits == 8))
bitsPerPixel = bits;
else if (planes == 3 && bits == 8)
bitsPerPixel = 24;
else
return false;
setPhysicalWidthDpi(getShortLittleEndian(a, 10));
setPhysicalHeightDpi(getShortLittleEndian(a, 10));
format = 4;
return true;
}
private boolean checkPng() throws IOException {
byte PNG_MAGIC[] = { 78, 71, 13, 10, 26, 10 };
byte a[] = new byte[24];
if (read(a) != 24)
return false;
if (!equals(a, 0, PNG_MAGIC, 0, 6))
return false;
format = 2;
width = getIntBigEndian(a, 14);
height = getIntBigEndian(a, 18);
bitsPerPixel = a[22] & 0xff;
int colorType = a[23] & 0xff;
if (colorType == 2 || colorType == 6)
bitsPerPixel *= 3;
return true;
}
private boolean checkPnm(int id) throws IOException {
if (id < 1 || id > 6)
return false;
int PNM_FORMATS[] = { 7, 8, 9 };
format = PNM_FORMATS[(id - 1) % 3];
boolean hasPixelResolution = false;
String s;
do {
do {
s = readLine();
if (s != null)
s = s.trim();
} while (s == null || s.length() < 1);
if (s.charAt(0) == '#') {
if (collectComments && s.length() > 1)
addComment(s.substring(1));
continue;
}
if (hasPixelResolution)
break;
int spaceIndex = s.indexOf(' ');
if (spaceIndex == -1)
return false;
String widthString = s.substring(0, spaceIndex);
spaceIndex = s.lastIndexOf(' ');
if (spaceIndex == -1)
return false;
String heightString = s.substring(spaceIndex + 1);
try {
width = Integer.parseInt(widthString);
height = Integer.parseInt(heightString);
} catch (NumberFormatException numberformatexception1) {
return false;
}
if (width < 1 || height < 1)
return false;
if (format == 7) {
bitsPerPixel = 1;
return true;
}
hasPixelResolution = true;
} while (true);
int maxSample;
try {
maxSample = Integer.parseInt(s);
} catch (NumberFormatException numberformatexception) {
return false;
}
if (maxSample < 0)
return false;
for (int i = 0; i < 25; i++)
if (maxSample < 1 << i + 1) {
bitsPerPixel = i + 1;
if (format == 9)
bitsPerPixel *= 3;
return true;
}
return false;
}
private boolean checkPsd() throws IOException {
byte a[] = new byte[24];
if (read(a) != a.length)
return false;
byte PSD_MAGIC[] = { 80, 83 };
if (!equals(a, 0, PSD_MAGIC, 0, 2)) {
return false;
} else {
format = 10;
width = getIntBigEndian(a, 16);
height = getIntBigEndian(a, 12);
int channels = getShortBigEndian(a, 10);
int depth = getShortBigEndian(a, 20);
bitsPerPixel = channels * depth;
return width > 0 && height > 0 && bitsPerPixel > 0
&& bitsPerPixel <= 64;
}
}
private boolean checkRas() throws IOException {
byte a[] = new byte[14];
if (read(a) != a.length)
return false;
byte RAS_MAGIC[] = { 106, -107 };
if (!equals(a, 0, RAS_MAGIC, 0, 2)) {
return false;
} else {
format = 6;
width = getIntBigEndian(a, 2);
height = getIntBigEndian(a, 6);
bitsPerPixel = getIntBigEndian(a, 10);
return width > 0 && height > 0 && bitsPerPixel > 0
&& bitsPerPixel <= 24;
}
}
private boolean checkSwf() throws IOException {
byte a[] = new byte[6];
if (read(a) != a.length)
return false;
format = 11;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -