⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imageinfo.java

📁 struts spring ibatis
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
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 + -