亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > WEB開發 > 正文

H5學習之路-圖片旋轉、壓縮處理

2024-04-27 15:09:13
字體:
來源:轉載
供稿:網友

最近一直在網上找關于圖片上傳、旋轉處理、壓縮處理等相關的資料,發現也不是很多。首先圖片處理還是挺復雜的,完全靠自己寫代碼實現,筆者感覺自己不具備這個實力,所以還是在網上找一些好的插件,然后綜合下,節省時間。 記得在上一篇博文就介紹了圖片上傳的方案,今天就來說說圖片旋轉和壓縮處理。因為這兩點還是挺重要的,之所以會處理旋轉這個問題,是由于ios拍照存在這個bug,導致上傳的圖片方向逆時針旋轉了90。那么,怎么解決呢?其實,上篇博文所使用的兩個前端插件都解決了旋轉的問題,所以這個就不用擔心了,雖然在后臺也可以處理,但是還是比較麻煩的,大家可以去研究下。壓縮的話,由于圖片太大了,不壓縮使用,會導致加載圖片太慢。那么是在后臺處理,還是前端處理呢?這一點我也不太清楚,需要結合性能和兼容性去選擇。由于thumbnailator這個后臺插件封裝了對圖片相關的處理,所以筆者就選用這個插件了,比較方便,下面筆者就來進行介紹。

一、maven依賴

<!-- 圖片處理插件 --> <dependency> <groupId>net.coobird</groupId> <artifactId>thumbnailator</artifactId> <version>0.4.8</version> </dependency> <!-- 圖片EXIF信息 --> <dependency> <groupId>com.drewnoakes</groupId> <artifactId>metadata-extractor</artifactId> <version>2.6.2</version> </dependency>

壓縮處理

筆者把代碼封裝到了一個工具類中,如下:

package com.qiyongkang.sys.util;import java.io.File;import java.io.IOException;import javax.imageio.ImageIO;import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;import com.drew.imaging.ImageMetadataReader;import com.drew.metadata.Directory;import com.drew.metadata.Metadata;import com.drew.metadata.exif.ExifIFD0Directory;import net.coobird.thumbnailator.Thumbnails;/** * * ClassName: ImageUtil <br/> * Function: 圖片處理. <br/> * date: 2017年2月6日 下午1:49:15 <br/> * * @author qiyongkang * @version * @since JDK 1.6 */public class ImageUtil { PRivate static Logger logger = LogManager.getLogger(ImageUtil.class); //寬 public static int IMAGE_WIDTH = 1; //高 public static int IMAGE_HEIGHT = 2; //方向 public static int ORIENTATION_ONE = 1; //正常 public static int ORIENTATION_THREE = 3; //180 public static int ORIENTATION_SIX = 6; //順時針90 public static int ORIENTATION_EIGHT = 8; //逆時針90,順時針270 /** * * getImageSize: 獲取圖片大小. <br/> * * @author qiyongkang * @return * @since JDK 1.6 */ public static int getImageSize(File file, int flag) { int size = 0; if (file == null || !file.exists()) return size; try { if (IMAGE_WIDTH == flag) { size = ImageIO.read(file).getWidth(); } else if (IMAGE_HEIGHT == flag) { size = ImageIO.read(file).getHeight(); } } catch (IOException e) { logger.error("獲取圖片的大小異常", e); e.printStackTrace(); } return size; } /** * * getImageOrientation: 獲取圖片的方向 <br/> * * @author qiyongkang * @param file * @return * @since JDK 1.6 */ public static int getImageOrientation(File file) { int orientation = ORIENTATION_ONE; try { Metadata metadata = ImageMetadataReader.readMetadata(file); Directory dr = metadata.getDirectory(ExifIFD0Directory.class); if (dr == null) { logger.info("沒有方向信息"); return orientation; } orientation = dr.getInt(ExifIFD0Directory.TAG_ORIENTATION); logger.info("orientation:" + orientation); } catch (Exception e) { logger.error("獲取圖片的方向異常", e); e.printStackTrace(); } return orientation; } /** * * rotateImage: 旋轉圖片到正常的方向. <br/> * * @author qiyongkang * @since JDK 1.6 */ public static void rotateImage(File file) { //計算方向 int orientation = getImageOrientation(file); double angle = 0d; if (orientation > ORIENTATION_ONE) { //進行圖片處理 switch (orientation) { case 3: //需要旋轉180度 angle = 180d; break; case 6: //需要旋轉270度 angle = 270d; break; case 8: //需要旋轉90度 angle = 90d; break; } } try { Thumbnails.of(file).scale(1).rotate(angle).toFile(file);; } catch (IOException e) { logger.error("旋轉圖片異常", e); e.printStackTrace(); } } /** * * impressImage: 壓縮圖片. <br/> * * @author qiyongkang * @param file * @param width * @param height * @since JDK 1.6 */ public static void impressImage(File file, int width, int height) { try { Thumbnails.of(file).size(width, height).toFile(file); } catch (IOException e) { e.printStackTrace(); logger.error("壓縮圖片異常:" + e); } } public static void main(String[] args) { File file = new File("C://Users//qiyongkang//Desktop//測試圖片//17251486371832020.jpg");// rotateImage(file); System.out.println("圖片的方向:" + getImageOrientation(file)); }}

使用例子

在上一篇博文已經貼出了上傳的代碼,這里就是加了點壓縮處理的代碼,如下:

/** * Project Name:qyk_testSpringMVC * File Name:FileController.java * Package Name:com.qiyongkang.sys.controller * Date:2016年11月6日下午3:12:05 * Copyright (c) 2016, Thinkive(http://www.thinkive.com/) All Rights Reserved. **/package com.qiyongkang.sys.controller;import java.io.File;import java.util.Date;import java.util.Iterator;import java.util.List;import javax.servlet.http.HttpServletRequest;import org.apache.commons.fileupload.FileItem;import org.apache.commons.fileupload.disk.DiskFileItemFactory;import org.apache.commons.fileupload.servlet.ServletFileUpload;import org.apache.commons.io.FileUtils;import org.apache.commons.io.FilenameUtils;import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import com.qiyongkang.sys.dto.ExtJsObject;import com.qiyongkang.sys.util.ImageUtil;/** * ClassName:FileController <br/> * Function: TODO ADD FUNCTION. <br/> * Reason: TODO ADD REASON. <br/> * Date: 2016年11月6日 下午3:12:05 <br/> * * @author qiyongkang * @version * @since JDK 1.6 * @see */@Controller@RequestMappingpublic class FileController { /** * 日志類 */ private static Logger log = LogManager.getLogger(FileController.class); private String tempPath = "/uploadImageTemp";// 臨時存儲目錄 private String savePath = "/userImage";// 存儲目錄 private String fileName = ""; // 文件名 private static int PICTURE_WIDTH = 100; //壓縮成的寬度 @RequestMapping @ResponseBody public ExtJsObject uploadImage(HttpServletRequest request) { ExtJsObject extJsObject = new ExtJsObject(); try { // 獲取臨時目錄 String tempPathDir = request.getsession().getServletContext().getRealPath(this.tempPath); File tempPathDirFile = new File(tempPathDir); if (!tempPathDirFile.exists()) { tempPathDirFile.mkdirs(); } // 存儲目錄 String realDir = request.getSession().getServletContext().getRealPath(this.savePath); File realDirFile = new File(realDir); if (!realDirFile.exists()) { realDirFile.mkdirs(); } // Create a factory for disk-based file items DiskFileItemFactory factory = new DiskFileItemFactory(); // Set factory constraints factory.setSizeThreshold(4096); // 設置緩沖區大小,這里是4kb factory.setRepository(tempPathDirFile);// 設置緩沖區目錄 // Create a new file upload handler ServletFileUpload upload = new ServletFileUpload(factory); // Set overall request size constraint upload.setSizeMax(4194304); // 設置最大文件尺寸,這里是4MB List<FileItem> items = upload.parseRequest(request);// 得到所有的文件 Iterator<FileItem> i = items.iterator(); while (i.hasNext()) { FileItem fi = (FileItem) i.next(); String fileName = fi.getName(); if (fileName != null) { // 這里加一個限制,如果不是圖片格式,則提示錯誤. (gif,jpg,jpeg,bmp,png) String suffixName = FilenameUtils.getExtension(fileName); if ("gif".equalsIgnoreCase(suffixName) || "jpg".equalsIgnoreCase(suffixName) || "jpeg".equalsIgnoreCase(suffixName) || "bmp".equalsIgnoreCase(suffixName) || "png".equalsIgnoreCase(suffixName)) { // 文件名 this.fileName = new Date().getTime() + "." + FilenameUtils.getExtension(fileName); File savedFile = new File(realDir, this.fileName); fi.write(savedFile); // 小圖片 File savedSmallFile = new File(realDir + "/small/", this.fileName); FileUtils.copyFile(savedFile, savedSmallFile); //壓縮一把 ImageUtil.impressImage(savedSmallFile, PICTURE_WIDTH, PICTURE_WIDTH); } else { extJsObject.setSuccess(false); extJsObject.setMsg("非圖片格式,請重新上傳!"); } } } extJsObject.setSuccess(true); extJsObject.setMsg("上傳成功!"); extJsObject.setResult(this.fileName); } catch (Exception e) { extJsObject.setSuccess(false); extJsObject.setMsg("上傳失敗!"); log.error("圖片上傳失敗", e); } return extJsObject; }}

好了,就介紹到這了,用起來還是比較簡單的,大家可以去試試,同時也歡迎分享更好的方式!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久久久久中文字| 日韩在线一区二区三区免费视频| 国内精品久久久久久| 一色桃子一区二区| 97婷婷大伊香蕉精品视频| 欧美日韩激情视频| 亚洲人成伊人成综合网久久久| 国产精品综合不卡av| 91精品国产自产91精品| 国产精品91久久久久久| 久久九九免费视频| 午夜美女久久久久爽久久| 亚洲欧洲免费视频| 久久久久久久久久久91| 欧美黑人一级爽快片淫片高清| 色妞欧美日韩在线| 夜夜躁日日躁狠狠久久88av| 性欧美xxxx视频在线观看| 国产99久久精品一区二区永久免费| 91久久精品国产91久久| 91久久综合亚洲鲁鲁五月天| 2019中文字幕全在线观看| 精品亚洲一区二区三区| 欧美第一黄色网| 一本一道久久a久久精品逆3p| 成人免费午夜电影| 久久精品国产一区二区电影| 国产精品福利观看| 2019最新中文字幕| 大胆欧美人体视频| 欧美大片网站在线观看| 欧美三级xxx| 亚洲精品成人久久| 精品久久久久国产| 91精品国产综合久久久久久久久| 97人人爽人人喊人人模波多| 亚洲少妇中文在线| 成人久久久久久久| 欧美人与性动交a欧美精品| 久久久成人精品视频| 亚洲第一精品自拍| 亚洲成人国产精品| 欧美一区二区三区四区在线| 日韩av一区二区在线观看| 成人在线激情视频| 亚洲精品免费av| 久久视频中文字幕| 亚洲一区美女视频在线观看免费| 久久久久久久久久久久久久久久久久av| 久久天天躁狠狠躁老女人| 亚洲韩国青草视频| 欧美午夜视频在线观看| 91精品国产高清久久久久久久久| 亚洲午夜未删减在线观看| 国产一区二区黄| 久久久综合免费视频| 国产精品吹潮在线观看| 成人av电影天堂| 久久免费福利视频| 欧美激情国内偷拍| 精品欧美国产一区二区三区| 91麻豆桃色免费看| 亚洲图片在线综合| 欧洲亚洲免费视频| 久久免费视频网| 日韩av最新在线| 国产69精品久久久久9999| 欧美最猛黑人xxxx黑人猛叫黄| 在线观看中文字幕亚洲| 国产精品精品国产| 久久夜色精品国产亚洲aⅴ| 精品久久中文字幕| 亚洲成人av在线播放| 欧美黄色片在线观看| 97欧美精品一区二区三区| 日韩在线观看视频免费| 成人中文字幕+乱码+中文字幕| 亚洲va码欧洲m码| 欧美日韩国产91| 欧美日韩性生活视频| 欧美亚洲国产日韩2020| 中文字幕精品在线| 热久久99这里有精品| 欧美性猛交xxxx偷拍洗澡| 国产精品揄拍500视频| 69久久夜色精品国产7777| 久久国产精品久久久久| 91免费视频网站| 亚洲国产精品久久久久久| 色视频www在线播放国产成人| 国产精品久久91| 欧美日韩黄色大片| 欧美香蕉大胸在线视频观看| 欧美巨乳美女视频| 国产精品va在线| 日韩一区二区在线视频| 亚洲精品久久久久| 97超级碰碰人国产在线观看| 日韩在线观看免费高清| 97国产在线视频| 久久久成人的性感天堂| 亚洲国产精品久久久久秋霞蜜臀| 国产精自产拍久久久久久蜜| 狠狠色香婷婷久久亚洲精品| 欧美国产日韩一区二区三区| 久久久免费观看| 日韩精品在线影院| 欧美精品久久久久久久| 97在线看免费观看视频在线观看| 欧美日韩国产精品一区二区三区四区| 日韩欧美视频一区二区三区| xx视频.9999.com| 日韩在线观看网站| 岛国av午夜精品| 午夜欧美大片免费观看| 日韩成人小视频| 日本欧美精品在线| 日韩网站在线观看| 欧美日韩一区二区三区| 国产精品美女网站| 亚洲视频在线播放| 国产男人精品视频| 中文字幕亚洲激情| 国产精品三级美女白浆呻吟| 精品国产美女在线| 日韩精品视频中文在线观看| 国产一区二区美女视频| 自拍偷拍亚洲区| 欧美性受xxxx白人性爽| 自拍偷拍亚洲一区| 中文字幕日韩欧美在线视频| 日韩一区二区三区在线播放| 蜜月aⅴ免费一区二区三区| 亚洲第一国产精品| 1769国内精品视频在线播放| 日本久久精品视频| 欧美日韩国产丝袜美女| 色综合色综合久久综合频道88| 青青久久av北条麻妃黑人| 91网站免费看| 日韩精品在线视频| 国产精品嫩草影院一区二区| 激情av一区二区| 久久国产色av| 国产精品嫩草影院久久久| 国产精品69久久久久| 日韩欧美精品免费在线| 精品国产依人香蕉在线精品| 日韩有码在线播放| 欧美日韩一区二区免费视频| 亚洲精品久久久久久久久久久| 欧美在线激情网| 欧美性xxxxhd| 一区二区在线免费视频| 91在线|亚洲| 日韩精品一区二区三区第95| 欧美壮男野外gaytube| 亚洲人成77777在线观看网| 91国产美女视频| 欧美成人在线影院| 国产亚洲一区精品| 91精品国产成人www| 在线免费观看羞羞视频一区二区| 丝袜美腿亚洲一区二区|