利用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