Java如何實(shí)現(xiàn)圖片裁剪預(yù)覽功能
在項(xiàng)目中,我們需要做些類似頭像上傳,圖片裁剪的功能,ok看下面文章!
需要插件:jQuery Jcrop
后端代碼:
package org.csg.upload; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Iterator; import javax.imageio.ImageIO; import javax.imageio.ImageReadParam; import javax.imageio.ImageReader; import javax.imageio.stream.ImageInputStream; public class Upload { /** * @author 小夜的傳說(shuō) * @param path1 圖片原路徑 * @param path2 裁剪后存儲(chǔ)的路徑 * @param x x軸 * @param y y軸 * @param w * @param h */ public static void CutImage(String path1,String path2,int x,int y,int w,int h){ FileInputStream fileInputStream=null; ImageInputStream iis=null; try { //讀取圖片文件,建立文件輸入流 fileInputStream=new FileInputStream(path1); //創(chuàng)建圖片的文件流 迭代器 Iterator<ImageReader> it = ImageIO.getImageReadersByFormatName("jpg"); ImageReader reader=it.next(); //獲取圖片流 建立文圖 文件流 iis=ImageIO.createImageInputStream(fileInputStream); //獲取圖片默認(rèn)參數(shù) reader.setInput(iis, true); ImageReadParam param=reader.getDefaultReadParam(); //定義裁剪區(qū)域 Rectangle rect=new Rectangle(x,y,w,h); param.setSourceRegion(rect); BufferedImage bi=reader.read(0,param); ImageIO.write(bi, "jpg", new File(path2)); } catch (Exception e) { e.printStackTrace(); System.out.println("裁剪失敗"); }finally{ try { if(fileInputStream!=null){ fileInputStream.close(); } if(iis!=null){ iis.close(); } } catch (IOException e) { e.printStackTrace(); } } } }
訪問(wèn)代碼:
<%@ page language="java" import="java.util.*,org.csg.upload.*" pageEncoding="utf-8"%> <% //圖片的相對(duì)路徑 String imagPath=request.getParameter("imgPath"); String relPath=request.getRealPath("/");//獲取圖片服務(wù)器絕對(duì)地址 String newFileName=new Date().getTime()+".jpg"; //實(shí)際圖片路徑 String path1=relPath+imagPath; //裁剪后存儲(chǔ)到服務(wù)器的圖片路徑 String path2=relPath+"/images/"+newFileName; int x=Integer.parseInt(request.getParameter("x")); int y=Integer.parseInt(request.getParameter("y")); int w=Integer.parseInt(request.getParameter("w")); int h=Integer.parseInt(request.getParameter("h")); try{ Upload.CutImage(path1, path2, x, y, w, h); out.print("<img src='images/"+newFileName+"'/>"); }catch(Exception e){ e.printStackTrace(); out.print("圖片裁剪失敗"); } %>
jsp代碼:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Jsp開(kāi)發(fā)頭像裁剪</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <link rel="stylesheet" href="css/jquery.Jcrop.css" type="text/css" /> <script type="text/javascript" src="js/jquery.min.js"></script> <script type="text/javascript" src="js/jquery.Jcrop.min.js"></script> <style type="text/css"> *{margin: 0;padding: 0;} .cut{ margin-top: 20px; } #preview-pane { display: block; position: absolute; z-index: 2000; top: 10px; right: -280px; padding: 6px; border: 1px rgba(0,0,0,.4) solid; background-color: white; -webkit-border-radius: 6px; -moz-border-radius: 6px; border-radius: 6px; -webkit-box-shadow: 1px 1px 5px 2px rgba(0, 0, 0, 0.2); -moz-box-shadow: 1px 1px 5px 2px rgba(0, 0, 0, 0.2); box-shadow: 1px 1px 5px 2px rgba(0, 0, 0, 0.2); } #preview-pane .preview-container { width: 250px; height: 170px; overflow: hidden; } </style> <script type="text/javascript"> $(function(){ var jcrop_api, boundx="", boundy="", $preview = $('#preview-pane'), $pcnt = $('#preview-pane .preview-container'), $pimg = $('#preview-pane .preview-container img'), xsize = $pcnt.width(), ysize = $pcnt.height(); $('#cutImage').Jcrop({ onChange:showCoords,//獲取選中的值 onSelect:showCoords,//獲取拖拽的值 aspectRatio: xsize / ysize },function(){ var bounds = this.getBounds(); boundx = bounds[0]; boundy = bounds[1]; jcrop_api = this; $preview.appendTo(jcrop_api.ui.holder); }); function showCoords(c){ var x=c.x; var y=c.y; var w=c.w; var h=c.h; $("#x1").val(parseInt(x)); $("#y1").val(parseInt(y)); $("#w").val(parseInt(w)); $("#h").val(parseInt(h)); if (parseInt(c.w) > 0){ var rx = xsize / c.w; var ry = ysize / c.h; $pimg.css({ width: Math.round(rx * boundx) + 'px', height: Math.round(ry * boundy) + 'px', marginLeft: '-' + Math.round(rx * c.x) + 'px', marginTop: '-' + Math.round(ry * c.y) + 'px' }); } } }); </script> </head> <body> <h1>Java開(kāi)發(fā)QQ頭像裁剪系統(tǒng)</h1> <div class="cut"> <img id="cutImage" alt="" src="images/1.jpg" > <div id="preview-pane"> <div class="preview-container"> <img src="images/1.jpg" class="jcrop-preview" alt="Preview" /> </div> </div> </div> <form action="success.jsp" method="post" > <input type="text" value="images/1.jpg" name="imgPath"> x軸:<input type="text" size="4" id="x1" name="x" /> y軸:<input type="text" size="4" id="y1" name="y"/> 寬度:<input type="text" size="4" id="w" name="w"/> 高度:<input type="text" size="4" id="h" name="h"/> <input type="submit" value="裁剪"/> </form> </body> </html>
效果圖:
以上就是本文的全部?jī)?nèi)容,希望大家能夠喜歡。
相關(guān)文章
SpringBoot集成JWT實(shí)現(xiàn)Token登錄驗(yàn)證的示例代碼
隨著技術(shù)的發(fā)展,分布式web應(yīng)用的普及,通過(guò)session管理用戶登錄狀態(tài)成本越來(lái)越高,因此慢慢發(fā)展成為token的方式做登錄身份校驗(yàn),本文就來(lái)介紹一下SpringBoot集成JWT實(shí)現(xiàn)Token登錄驗(yàn)證的示例代碼,感興趣的可以了解一下2023-12-12Java8中CompletableFuture使用場(chǎng)景與實(shí)現(xiàn)原理
CompletableFuture是java8引入的新類,該類實(shí)現(xiàn)了Future接口和 CompletionStage接口,封裝了future、forkjoin相關(guān)類來(lái)執(zhí)行異步,這篇文章主要給大家介紹了關(guān)于Java8中CompletableFuture使用場(chǎng)景與實(shí)現(xiàn)原理的相關(guān)資料,需要的朋友可以參考下2022-02-02Java通過(guò)exchange協(xié)議發(fā)送郵件
這篇文章主要為大家詳細(xì)介紹了Java通過(guò)exchange協(xié)議發(fā)送郵件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02Activiti進(jìn)階之組任務(wù)實(shí)現(xiàn)示例詳解
這篇文章主要為大家介紹了Activiti進(jìn)階之組任務(wù)實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08java 合并排序算法、冒泡排序算法、選擇排序算法、插入排序算法、快速排序算法的描述
算法是程序設(shè)計(jì)的精髓,程序設(shè)計(jì)的實(shí)質(zhì)就是構(gòu)造解決問(wèn)題的算法,將其解釋為計(jì)算機(jī)語(yǔ)言。2009-06-06詳解Idea 2019.2 安裝lombok插件失效問(wèn)題解決
這篇文章主要介紹了詳解Idea 2019.2 安裝lombok插件失效問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10java兩個(gè)integer數(shù)據(jù)判斷相等用==還是equals
本文主要介紹了java兩個(gè)integer數(shù)據(jù)判斷相等用==還是equals,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12Java 回調(diào)機(jī)制(CallBack) 詳解及實(shí)例代碼
這篇文章主要介紹了 Java 回調(diào)機(jī)制(CallBack) 詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-02-02