1. 程式人生 > >利用ImageIO壓縮圖片

利用ImageIO壓縮圖片


import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Iterator;

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageInputStream;
import javax.imageio.stream.MemoryCacheImageInputStream;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

public class ImageTest {
	/**
	 * @param args
	 * @throws AWTException
	 * @throws IOException 
	 * @throws FileNotFoundException 
	 */
	public void getImageSize() throws AWTException, FileNotFoundException, IOException {
		java.awt.Robot rb = new java.awt.Robot();
		Dimension d = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
		Rectangle rt = new Rectangle(0, 0, (int) d.getWidth(), (int) d
				.getHeight());
		BufferedImage image= readMemoryImage(readBytes(new FileInputStream("C:/Users/Administrator/Desktop/2.jpg")));
		System.out.println(image.getHeight());
		byte[] picByte = bufferedImageTobytes(image, "gif");
		byte[] picByte2 = bufferedImageTobytes(image, "jpeg");
		byte[] picByte3 = bufferedImageTobytes(image, 0.9f);
		byte[] picByte4 = newCompressImage(image, 0.4f);
		FileOutputStream f=new FileOutputStream("C:/Users/Administrator/Desktop/2-1.gif");
		FileOutputStream f2=new FileOutputStream("C:/Users/Administrator/Desktop/2-2.jpg");
		FileOutputStream f3=new FileOutputStream("C:/Users/Administrator/Desktop/2-3.jpg");
		FileOutputStream f4=new FileOutputStream("C:/Users/Administrator/Desktop/2-4.jpg");
		f.write(picByte);
		f2.write(picByte2);
		f3.write(picByte3);
		f4.write(picByte4);
		f.close();
		f2.close();
		f3.close();
		f4.close();
	}
	
    /**
     * 從記憶體位元組陣列中讀取影象
     * 
     * @param imgBytes
     *            未解碼的影象資料
     * @return 返回 {@link BufferedImage}
     * @throws IOException
     *             當讀寫錯誤或不識別的格式時丟擲
     */
	  public static final BufferedImage readMemoryImage(byte[] imgBytes) throws IOException {
	        if (null == imgBytes || 0 == imgBytes.length)
	            throw new NullPointerException("the argument 'imgBytes' must not be null or empty");
	        // 將位元組陣列轉為InputStream,再轉為MemoryCacheImageInputStream
	        ImageInputStream imageInputstream = new MemoryCacheImageInputStream(new ByteArrayInputStream(imgBytes));
	        // 獲取所有能識別資料流格式的ImageReader物件
	        Iterator it = ImageIO.getImageReaders(imageInputstream);
	        // 迭代器遍歷嘗試用ImageReader物件進行解碼
	        while (it.hasNext()) {
	            ImageReader imageReader = it.next();
	            // 設定解碼器的輸入流
	            imageReader.setInput(imageInputstream, true, true);
	            // 影象檔案格式字尾
	            String suffix = imageReader.getFormatName().trim().toLowerCase();
	            // 影象寬度
	            int width = imageReader.getWidth(0);
	            // 影象高度
	            int height = imageReader.getHeight(0);
	            System.out.printf("format %s,%dx%d\n", suffix, width, height);
	            try {
	                // 解碼成功返回BufferedImage物件
	                // 0即為對第0張影象解碼(gif格式會有多張影象),前面獲取寬度高度的方法中的引數0也是同樣的意思
	                 return imageReader.read(0, imageReader.getDefaultReadParam());
	            } catch (Exception e) {
	                imageReader.dispose();
	                // 如果解碼失敗嘗試用下一個ImageReader解碼
	            }
	        }
	        imageInputstream.close();
	        // 沒有能識別此資料的影象ImageReader物件,丟擲異常
	        throw new IOException("unsupported image format");
	    }
	  
	    /**
	     * 從{@link InputStream}讀取位元組陣列
* 結束時會關閉{@link InputStream}
* {@code in}為{@code null}時丟擲{@link NullPointerException} * * @param in * @return 位元組陣列 * @throws IOException */ public static final byte[] readBytes(InputStream in) throws IOException { if (null == in) throw new NullPointerException("the argument 'in' must not be null"); try { int buffSize = Math.max(in.available(), 1024 * 8); byte[] temp = new byte[buffSize]; ByteArrayOutputStream out = new ByteArrayOutputStream(buffSize); int size = 0; while ((size = in.read(temp)) != -1) { out.write(temp, 0, size); } return out.toByteArray(); } finally { in.close(); } } /** * 用Format對應格式中ImageIO預設引數把IMAGE打包成BYTE[] * @param image * @return */ private byte[] bufferedImageTobytes(BufferedImage image, String format) { System.out.println(format + "格式開始打包" + getCurrentTime()); ByteArrayOutputStream out = new ByteArrayOutputStream(); try { ImageIO.write(image, format, out); } catch (IOException e) { e.printStackTrace(); } System.out.println(format + "格式完成打包-----" + getCurrentTime() + "----lenth------" + out.toByteArray().length); return out.toByteArray(); } /** * * 自己設定壓縮質量來把圖片壓縮成byte[] * * @param image * 壓縮源圖片 * @param quality * 壓縮質量,在0-1之間, * @return 返回的位元組陣列 */ private byte[] bufferedImageTobytes(BufferedImage image, float quality) { System.out.println("jpeg" + quality + "質量開始打包" + getCurrentTime()); // 如果圖片空,返回空 if (image == null) { return null; } // 得到指定Format圖片的writer Iterator iter = ImageIO .getImageWritersByFormatName("jpeg");// 得到迭代器 ImageWriter writer = (ImageWriter) iter.next(); // 得到writer // 得到指定writer的輸出引數設定(ImageWriteParam ) ImageWriteParam iwp = writer.getDefaultWriteParam(); iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); // 設定可否壓縮 iwp.setCompressionQuality(quality); // 設定壓縮質量引數 iwp.setProgressiveMode(ImageWriteParam.MODE_DISABLED); ColorModel colorModel = ColorModel.getRGBdefault(); // 指定壓縮時使用的色彩模式 iwp.setDestinationType(new javax.imageio.ImageTypeSpecifier(colorModel, colorModel.createCompatibleSampleModel(16, 16))); // 開始打包圖片,寫入byte[] ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); // 取得記憶體輸出流 IIOImage iIamge = new IIOImage(image, null, null); try { // 此處因為ImageWriter中用來接收write資訊的output要求必須是ImageOutput // 通過ImageIo中的靜態方法,得到byteArrayOutputStream的ImageOutput writer.setOutput(ImageIO .createImageOutputStream(byteArrayOutputStream)); writer.write(null, iIamge, iwp); } catch (IOException e) { System.out.println("write errro"); e.printStackTrace(); } System.out.println("jpeg" + quality + "質量完成打包-----" + getCurrentTime() + "----lenth----" + byteArrayOutputStream.toByteArray().length); return byteArrayOutputStream.toByteArray(); } /** * 自己定義格式,得到當前系統時間 * * @return */ private String getCurrentTime() { Calendar c = new GregorianCalendar(); int hour = c.get(Calendar.HOUR_OF_DAY); int min = c.get(Calendar.MINUTE); int second = c.get(Calendar.SECOND); int millsecond = c.get(Calendar.MILLISECOND); String time = hour + "點" + min + "分" + second + "秒" + millsecond; return time; } /** * 通過 com.sun.image.codec.jpeg.JPEGCodec提供的編碼器來實現影象壓縮 * @param image * @param quality * @return */ private byte[] newCompressImage(BufferedImage image, float quality) { // 如果圖片空,返回空 if (image == null) { return null; } // 開始開始,寫入byte[] ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); // 取得記憶體輸出流 // 設定壓縮引數 JPEGEncodeParam param = JPEGCodec.getDefaultJPEGEncodeParam(image); param.setQuality(quality, false); // 設定編碼器 JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder( byteArrayOutputStream, param); System.out.println("newCompressive" + quality + "質量開始打包" + getCurrentTime()); try { encoder.encode(image); } catch (Exception ef){ ef.printStackTrace(); } System.out.println("newCompressive" + quality + "質量打包完成" + getCurrentTime() + "----lenth----" + byteArrayOutputStream.toByteArray().length); return byteArrayOutputStream.toByteArray(); } public static void main(String args[]) throws Exception { ImageTest test = new ImageTest(); test.getImageSize(); } }

相關推薦

利用ImageIO壓縮圖片

import java.awt.AWTException; import java.awt.Dimension; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.awt.image.ColorModel;

HTML5利用canvas壓縮圖片(不改變圖片寬和高)

最近專案中有一個手機拍照上傳的需求,現在的智慧手機攝像頭畫素很高,拍出來的照片大小大都在5M左右,當手機在上傳圖片時遇到了問題,之前採用的方法是將圖片先進行Base64編碼,然後上傳到伺服器,結果因為圖片太大,導致伺服器老是回覆超時錯誤;權衡之下決定在圖片上傳之前先將圖片壓縮; 以下為我採用方法

利用canvas壓縮圖片並上傳

一 前言 最近負責的H5中,有個上傳照片的功能,照片是上傳到阿里雲。大家可能知道,手機拍到照片一般都較大,而伺服器限制了上傳圖片的大小(伺服器好像是可以設定這個大小的),於是開始研究利用canvas壓縮圖片,當然你也可以利用外掛。廢話不多說,只要你仔細看完,保證你能成功。 二 程式碼 HTML

利用ImageIo讀取圖片的元資料

  CGImageSourceRef imageSourceRef = CGImageSourceCreateWithURL((__bridge CFURLRef)url, NULL);                 CGImageMetadataRef metadataRef = CGImageSou

【機器學習七】利用K-means壓縮圖片

在學習機器的過程中,發現了K-means的一種應用,遂那這個例子,練練手,增加對K-means的理解。  # -- encoding:utf-8 -- """ Create by yexm on 2018/11/24 """ # coding:utf-8 import matplot

利用localResizeIMG將圖片壓縮轉為base64上傳

在進行圖片上傳的時候,因為有些圖片太大,為了減輕伺服器的壓力,我們需要將圖片進行壓縮上傳。今天總結一下利用localResizeIMG如何將圖片壓縮轉為base64上傳,其中localResizeIMG外掛已上傳csdn。 程式碼如下: <!doctype html> <

Android中利用Picasso實現圖片壓縮指定任意尺寸

之前做專案時,有個需求是指定照片壓縮到任意寬高尺寸上傳給伺服器。當時我自己寫了個圖片壓縮方法,但是不夠完美,小問題不斷(比如OOM之類的)。後來看到了神器Picasso不光能載入網路圖片,還能以任意尺寸載入本地圖片。於是我想,既然Picasso能任意尺寸載入本地圖片,那它肯

PHP 壓縮圖片 合併圖片和製作圓頭像利用gd庫

//按照寬高縮放圖片 public static function zoom($filename,$nw,$nh){ if(!file_exists(EXT.'qrcode/zoom/')){ mkdir(EXT.'qrcode/zoom/',0777,true);

利用Opencv儲存圖片,並生成JPG格式,調整壓縮質量。

         例如Photoshop軟體儲存JPG影象時有低、中、高和最佳的儲存選項設定,對應生成的影象的大小也不同。用OpenCV生成的影象相對較大,可能類似對應Photoshop最佳的那種儲存的,但是我想要相對小一些的影象,請問如何才能用OpenCV設定JPG影

利用LocalResizeIMG外掛壓縮圖片通過ajax上傳圖片(ASP版)

$(document).ready(function(e) { $('#uploadphoto').localResizeIMG({ width: 400, quality: 1, success: function (result) { v

JS上傳圖片,利用canvas實現圖片壓縮

操作 base64 itob 思考 旋轉角度 基礎 inpu url 一位 項目中的一個基礎功能-----手機上傳圖片 技術棧: 1、利用canvas進行壓縮(這個應該都比較熟悉)2、利用exif-js獲取照片旋轉角度屬性,因為有些手機機型會因為拍照時手機的方向使拍的照片帶

c# 無損高質量壓縮圖片代碼

++ osi name source 新路 public rip erp lan 最近,項目上涉及到了圖像壓縮,發現原有的圖像壓縮功能,雖然保證了圖像的大小300K以內,但是壓縮後的圖像看的不在清晰,並且,限定了圖片的Height或者是Width。 在CSDN上看到了一個

利用Selenium實現圖片文件上傳的兩種方式介紹

最簡 pfile 狀態 blog nbsp ftw fin send find 在實現UI自動化測試過程中,有一類需求是實現圖片上傳,這種需求根據開發的實現方式,UI的實現方式也會不同。 一、直接利用Selenium實現 這種方式是最簡單的一種實現方式,但是依賴於

php利用gd實現圖片的邊框

col spl tmp pic ora play 圖片 取圖 from 1 <?php 2 3 //實現兩張圖片合並 並內圖片有一定的邊框 4 5 $file = ‘image/qr_1047.png‘; 6 $logo = ‘image/log

使用 gulp 壓縮圖片

mage 可能 true 所有 fault ssi 4.2 cnblogs 提高 請務必理解如下章節後閱讀此章節: 安裝 Node 和 gulp 使用 gulp 壓縮 JS 壓縮 圖片文件可降低文件大小,提高圖片加載速度。 找到規律轉換為 gulp 代碼 規律 找到 i

利用cm壓縮包手動安裝cm和cdh

bin -s 數據 1.8 dvd jdk inux 安裝 linu 安裝準備: 1.操作系統為centos6.9   CentOS-6.9-x86_64-bin-DVD1to2 2.安裝Oracle JDK (1.8u121)   jdk-8u121-linux-x64.

Nodejs前端服務器壓縮圖片

res back gem callback nbsp 承擔 能力 true bsp Nodejs作為前端服務器,自然能承擔處理圖片的能力, 使用GM for nodejs 作為圖片處理器,調用ImageMagick處理圖片 使用ImageMagick var image

利用urllib下載圖片

原理 src .cn http ima pen 技術分享 eve 打開 # 爬蟲項目原理:打開網址---獲取源碼---找到圖片---匹配取出## urllib模塊:urlopen打開---read源碼# urlretrieve保存到文件,下載 利用urllib下載圖片

利用Python進行圖片發送與接收的兩種方法---包含客戶端和服務器端代碼

list() tmp span 客戶端 time() failed pri ucc out 第一種方法 opencv、requests、flask 此方法比較耗費時間 600毫秒左右 客戶端代碼 #coding:utf-8 import cv2 import json i

java利用ffmpeg把圖片轉成yuv格式

exceptio ioe ever readline filepath uid ont ati cep 安裝ffmpeg: 安裝目錄:/usr/share/ffmpeg 創建ffmpeg目錄,解壓ffmpeg-3.4.1.tar.bz2 tar -xjvf ffmpeg-3