1. 程式人生 > >獲取圖片寬高、大小和圖片型別

獲取圖片寬高、大小和圖片型別

直接貼程式碼

public static void main(String[] args) {
        String picUrl = "http://placeimg.com/640/480/any.jpg";

        ByteArrayOutputStream out = null;
        InputStream inputStream = null, byteInput = null;
        ImageInputStream iis = null;
        try {
            URL url = new URL(picUrl);
            URLConnection connection = url.openConnection();

            int
buffSize = 4096; out = new ByteArrayOutputStream(buffSize); inputStream = connection.getInputStream(); byte[] temp = new byte[buffSize]; int size; while ((size = inputStream.read(temp)) != -1) { out.write(temp, 0, size); } byte
[] content = out.toByteArray(); //重新轉換成stream,轉換成imageIO byteInput = new ByteArrayInputStream(content); BufferedImage image = ImageIO.read(byteInput); System.out.println("圖片寬:" + image.getWidth()); System.out.println("圖片高:" + image.getHeight()); System.out
.println("圖片大小:" + content.length); //根據圖片字尾檢視圖片型別 System.out.println("圖片型別:"+ picUrl.substring(picUrl.lastIndexOf(".") + 1, picUrl.length())); //一下包含檢視圖片型別的方式 if (isGIF(content)) { System.out.println("圖片是GIF"); } if (isJPEGHeader(content)) { System.out.println("圖片是JPEG"); } } catch (Exception e) { e.printStackTrace(); } finally { if (out != null) { try { out.close(); } catch (IOException e) { //關閉流失敗 } } if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { //關閉流失敗 } } if (byteInput != null) { try { byteInput.close(); } catch (IOException e) { //關閉流失敗 } } } } private static boolean isBMP(byte[] buf){ byte[] markBuf = "BM".getBytes(); //BMP圖片檔案的前兩個位元組 return compare(buf, markBuf); } private static boolean isICON(byte[] buf) { byte[] markBuf = {0, 0, 1, 0, 1, 0, 32, 32}; return compare(buf, markBuf); } private static boolean isWEBP(byte[] buf) { byte[] markBuf = "RIFF".getBytes(); //WebP圖片識別符 return compare(buf, markBuf); } private static boolean isGIF(byte[] buf) { byte[] markBuf = "GIF89a".getBytes(); //GIF識別符 if(compare(buf, markBuf)) { return true; } markBuf = "GIF87a".getBytes(); //GIF識別符 if(compare(buf, markBuf)) { return true; } return false; } private static boolean isPNG(byte[] buf) { byte[] markBuf = {(byte) 0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A}; //PNG識別符 // new String(buf).indexOf("PNG")>0 //也可以使用這種方式 return compare(buf, markBuf); } private static boolean isJPEGHeader(byte[] buf) { byte[] markBuf = {(byte) 0xff, (byte) 0xd8}; //JPEG開始符 return compare(buf, markBuf); } private static boolean isJPEGFooter(byte[] buf)//JPEG結束符 { byte[] markBuf = {(byte) 0xff, (byte) 0xd9}; return compare(buf, markBuf); } private static boolean compare(byte[] buf, byte[] markBuf) { for (int i = 0; i < markBuf.length; i++) { byte b = markBuf[i]; byte a = buf[i]; if(a!=b){ return false; } } return true; }

稍微解釋一下: 1、程式碼中識別圖片的型別,使用了兩種方法,一種是根據圖片的字尾,另外一種是根據圖片的內容。嚴格的方式是根據圖片的內容,但是這樣就無法區分jpg和jpeg。 2、程式碼中識別圖片的大小是按照圖片的位元組數,單位是B。 3、程式碼中用到多個stream,因為接收完之後,需要再次將位元組轉換成inputstream,再次轉換成bufferImage,沒有找到直接將位元組轉換成bufferImage的方式,如果有哪位大神知道,希望能留言。