1. 程式人生 > >java圖片裁剪和java生成縮圖

java圖片裁剪和java生成縮圖

一、縮圖

在瀏覽相簿的時候,可能需要生成相應的縮圖。
直接上程式碼:

public class ImageUtil {

    private Logger log = LoggerFactory.getLogger(getClass());

    private static String DEFAULT_PREVFIX = "thumb_";
    private static Boolean DEFAULT_FORCE = false;//建議該值為false

    /**
     * <p>Title: thumbnailImage</p>
     * <p>Description: 根據圖片路徑生成縮圖 </p>
     * @param
imagePath 原圖片路徑 * @param w 縮圖寬 * @param h 縮圖高 * @param prevfix 生成縮圖的字首 * @param force 是否強制按照寬高生成縮圖(如果為false,則生成最佳比例縮圖) */
public void thumbnailImage(String imagePath, int w, int h, String prevfix, boolean force){ File imgFile = new
File(imagePath); if(imgFile.exists()){ try { // ImageIO 支援的圖片型別 : [BMP, bmp, jpg, JPG, wbmp, jpeg, png, PNG, JPEG, WBMP, GIF, gif] String types = Arrays.toString(ImageIO.getReaderFormatNames()); String suffix = null; // 獲取圖片字尾
if(imgFile.getName().indexOf(".") > -1) { suffix = imgFile.getName().substring(imgFile.getName().lastIndexOf(".") + 1); }// 型別和圖片字尾全部小寫,然後判斷後綴是否合法 if(suffix == null || types.toLowerCase().indexOf(suffix.toLowerCase()) < 0){ log.error("Sorry, the image suffix is illegal. the standard image suffix is {}." + types); return ; } log.debug("target image's size, width:{}, height:{}.",w,h); Image img = ImageIO.read(imgFile); if(!force){ // 根據原圖與要求的縮圖比例,找到最合適的縮圖比例 int width = img.getWidth(null); int height = img.getHeight(null); if((width*1.0)/w < (height*1.0)/h){ if(width > w){ h = Integer.parseInt(new java.text.DecimalFormat("0").format(height * w/(width*1.0))); log.debug("change image's height, width:{}, height:{}.",w,h); } } else { if(height > h){ w = Integer.parseInt(new java.text.DecimalFormat("0").format(width * h/(height*1.0))); log.debug("change image's width, width:{}, height:{}.",w,h); } } } BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); Graphics g = bi.getGraphics(); g.drawImage(img, 0, 0, w, h, Color.LIGHT_GRAY, null); g.dispose(); String p = imgFile.getPath(); // 將圖片儲存在原目錄並加上字首 ImageIO.write(bi, suffix, new File(p.substring(0,p.lastIndexOf(File.separator)) + File.separator + prevfix +imgFile.getName())); log.debug("縮圖在原路徑下生成成功"); } catch (IOException e) { log.error("generate thumbnail image failed.",e); } }else{ log.warn("the image is not exist."); } } public static void main(String[] args) { new ImageUtil().thumbnailImage("C:/Users/cm/Desktop/我的頁面/images/girlNoImg.jpg", 100, 150,DEFAULT_PREVFIX,DEFAULT_FORCE); } }

直接執行main方法,填入相對應的引數即可。

二、配合 js 生成裁剪圖片

在我們修改個人微博、qq資料的時候可以上傳個人頭像,並可以剪裁個人頭像然後上傳。剪裁圖片的大小樣式是通過javascript實現的,但是它並不能生成一個新的圖片。但是js剪裁圖片提供圖片的x,y座標以及寬高,通過這四個引數我們可以根據原圖片生成新的剪裁圖片。
步驟:
1、首先通過頁面利用js實現圖片剪下瀏覽功能,我參照慕課網提供的資料並稍微更改了一下。另外我們也可以使用外掛,比如Jcrop是款很不錯的圖片裁剪外掛。

這裡寫圖片描述
最後效果圖如上,左側可以拖動拖拉,右側是預覽圖。
2、java生成並儲存剪下圖片

public class ImageUtil2 {

    private Logger log = LoggerFactory.getLogger(getClass());

    private static String DEFAULT_CUT_PREVFIX = "cut_";

    /**
     * Description: 根據原圖與裁切size擷取區域性圖片
     * @param srcImg 源圖片
     * @param output 圖片輸出流
     * @param rect 需要擷取部分的座標和大小
     */
    public void cutImage(File srcImg, OutputStream output,java.awt.Rectangle rect) {
        if (srcImg.exists()) {
            java.io.FileInputStream fis = null;
            ImageInputStream iis = null;
            try {
                fis = new FileInputStream(srcImg);
                // ImageIO 支援的圖片型別 : [BMP, bmp, jpg, JPG, wbmp, jpeg, png, PNG,
                // JPEG, WBMP, GIF, gif]
                String types = Arrays.toString(ImageIO.getReaderFormatNames())
                        .replace("]", ",");
                String suffix = null;
                // 獲取圖片字尾
                if (srcImg.getName().indexOf(".") > -1) {
                    suffix = srcImg.getName().substring(srcImg.getName().lastIndexOf(".") + 1);
                }// 型別和圖片字尾全部小寫,然後判斷後綴是否合法
                if (suffix == null
                        || types.toLowerCase().indexOf(suffix.toLowerCase() + ",") < 0) {
                    log.error("Sorry, the image suffix is illegal. the standard image suffix is {}."+ types);
                    return;
                }
                // 將FileInputStream 轉換為ImageInputStream
                iis = ImageIO.createImageInputStream(fis);
                // 根據圖片型別獲取該種類型的ImageReader
                ImageReader reader = ImageIO.getImageReadersBySuffix(suffix).next();
                reader.setInput(iis, true);
                ImageReadParam param = reader.getDefaultReadParam();
                param.setSourceRegion(rect);
                BufferedImage bi = reader.read(0, param);
                ImageIO.write(bi, suffix, output);
                log.info("圖片生成成功,請到目錄下檢視");
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (fis != null)
                        fis.close();
                    if (iis != null)
                        iis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } else {
            log.warn("the src image is not exist.");
        }
    }


    //生成目標檔案路徑
    public void cutImage(File srcImg, String destImgPath,java.awt.Rectangle rect) {
        File destImg = new File(destImgPath);
        if (destImg.exists()) {
            String p = destImg.getPath();
            try {
                if (!destImg.isDirectory())
                    p = destImg.getParent();
                if (!p.endsWith(File.separator))
                    p = p + File.separator;
                cutImage(srcImg,new java.io.FileOutputStream(p + DEFAULT_CUT_PREVFIX+ "_"+ srcImg.getName()), rect);
            } catch (FileNotFoundException e) {
                log.warn("the dest image is not exist.");
            }
        } else
            log.warn("the dest image folder is not exist.");
    }


    public void cutImage(String srcImg, String destImg, int x, int y, int width,
            int height) {
        cutImage(new File(srcImg), destImg, new java.awt.Rectangle(x, y, width, height));
    }


    public static void main(String[] args) {
        new ImageUtil2().cutImage("C:/Users/cm/Desktop/我的頁面/images/boyNoImg.jpg", "C:/Users/cm/Desktop/我的頁面/images/imgs",0, 0, 61, 166);
        //new ImageUtil2().cutImage("C:/Users/cm/Desktop/Jcrop-master/demos/demo_files/sago.jpg", "C:/Users/cm/Desktop/我的頁面/images/imgs",124, 110, 196, 176);
    }
}

該方法可以直接在main裡執行。傳入的四個引數分別為影象路徑、left值、top值,長度、寬度。

下面分析一下怎麼獲取這四個引數:
1、以我的js剪下為例,通過F12獲得如下:
這裡寫圖片描述
圖片中紅色部分就是圖片剪下的div,我們可以通過拖拽剪裁區大小寬度等來觀察改變了哪些引數,然後確定具體對應的引數值分別對應哪個引數值。如圖片中我的x/y/width/height分別為40,28,224,228。

注意:在js中我將該div和圖片的長寬都定義為300*300,為配合測試所以我下載的圖片也為300*300。如果你測試的圖片大小不為300*300,那麼你直接在上面java中測試的效果會和你前端看到的不一樣,因為你前端的圖片寬高我定義為300*300,而你實際圖片(即java中的圖片)不是。

那麼這個問題如果處理呢?

在你的java程式碼中獲取原圖片的長寬,然後判斷原圖片的長寬是不是300*300,如果不是就生成該圖片的300*300的縮圖,然後將該300*300的縮圖作為裁剪的圖片原型。(我的程式碼中沒有處理,需要的自己處理,用完圖片之後刪除縮圖)

2、Jcrop獲取引數
這裡寫圖片描述

如圖,Jcrop直接提供了引數,可以直接使用。但是它有個缺點就是在前端頁面的圖片大小區域不固定,如果你有個大畫素圖片,那麼會非常醜,比如我在對應檔案裡有個圖片soga_bak.jpg,換成這個圖片就不好了。

所以綜上建議用第一個js,然後判斷原圖片的長寬是不是300,不是的生成300*300縮圖,然後將縮圖作為裁剪原型圖,用完了再刪除縮圖。

相關推薦

java圖片裁剪java生成

一、縮圖 在瀏覽相簿的時候,可能需要生成相應的縮圖。 直接上程式碼: public class ImageUtil { private Logger log = LoggerFactory.getLogger(getClass());

Java例項】使用Thumbnailator生成放、旋轉、裁剪、水印)

1 需求 表哥需要給兒子報名考試,系統要求上傳不超過30KB的圖片,而現在的手機隨手一拍就是幾MB的,怎麼弄一個才30KB的圖片呢? 一個簡單的辦法是在電腦上把圖片縮小,然後截圖小圖片,但現在的電腦螢幕解析度很高,而且截圖大小不好控制;同樣解析度在不同圖片格式下,大小也相差很大。試了一下微信截圖工具,輸出的圖

Android之通過ContentResolver獲取手機圖片視訊的路徑生成路徑

1 問題 獲取手機所有圖片和視訊的路徑和生成圖片和視訊的縮圖和縮圖路徑 生成縮圖我們用的系統函式 public static Bitmap getThumbnail(ContentResolver cr, long origId, int kind, Opti

java按比例之原生成

package com.wxp.test; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import jav

Java 學習筆記之jfreechart 生成折線,餅

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android系統詳解之獲取圖片視訊的

從Android 2.2開始系統新增了一個縮圖ThumbnailUtils類,位於framework的android.media.ThumbnailUtils位置,可以幫助我們從mediaprovider中獲取系統中的視訊或圖片檔案的縮圖,該類提供了三種靜態方法可以直接呼

thinkphp上傳圖片生成

Image.php &lt;?php /** * 實現圖片上傳,圖片縮小, 增加水印 * 需要定義以下常量 * define('ERR_INVALID_IMAGE', 1); * define('ERR_NO_GD',

thinkphp上傳圖片生成

一、上傳圖片的HTML程式碼 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> &

運用tp5上傳圖片,並生成

最近想做個相簿,需要用到上傳影象,並且考慮到效能問題,還要生成縮圖,就學習下。在網上看了很多大神寫的文章,經過各種除錯總算出來了,分享下。不好之處,多多指教 ps:運用tp5圖片類生成縮圖時,一直無法找到圖片檔案。經過查詢,原來上傳的臨時檔案路徑被刪了,後改為上傳後

dedecms不生成提取第一張圖片最為

<?php /*1. 配置好你的資料庫連線2. 注意資料表名的字首 預設為dede_3. 一定要先備份你的資料庫 或備份dede_archives表 如產生損失本人概不負責*///資料庫連線設定$ip="localhost"; //地址$user="root"; //使用者名稱$pw=""; //密碼$

php上傳圖片自動生成方法函式

$file_name='C:\AppServ\www\_MG_9888.jpg'; $file_new='C:\AppServ\www\bbbb.jpg'; scal_pic($file_name,$file_new); function scal_pic($file_n

使用ASP.net(C#)批量上傳圖片並自動生成,文字水印,圖片水印

因本網站上傳圖片的需要,參考很多成熟的經驗,在ASP.net平臺上使用C#語言,做了這一自動批量上傳圖片的.ASPX檔案,並經除錯成功,在本網站上使用,現發出來供大家參考,也希望高手多加指點。 本程式主要功能有: (1)可以根據自己的需要更改上傳到伺服器上的目錄,上傳

thinkphp5上傳圖片生成公共方法

直接上程式碼,可以寫在公共檔案common和繼承的基礎類中,方便呼叫 /* * $name為表單上傳的name值 * $filePath為為儲存在入口資料夾public下面uploads/下面的資料夾名稱,沒有的話會自動建立 * $width指

js上傳圖片,同時生成

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE> New Document </TITLE&

將動易文章內容裡的所有圖片生成的外掛

使用動易系統的朋友都有這樣的經歷,每次在後臺編輯器裡傳圖片的時候(或者從外站複製內容),如果圖片太大的話,動易系統沒有將圖片自動縮略成指定的寬度,如果大圖傳的多了,這樣很影響網頁的開啟速度,影響使用者的瀏覽,會失去很多沒有耐心的潛在客戶。現在有了非凡自動縮略文章內容圖片程式,這個外掛可以方便地將編輯器裡上傳

上傳圖片生成(ASP.NET+VB.NET)

    Sub upimages()        Dim iname As String        If Not (fileup.PostedFile Is Nothing) Then            Dim namestr1 As String = (fileu

c#圖片生成,保持最高清的圖片

1.生成縮圖的主要程式碼 /// <summary> /// 圖片顯示成縮圖 /// </summary>

nginx使用image_filter生成 -- fasdfs海量圖片整合

1 http_image_filter_module http_image_filter_module是nginx提供的整合圖片處理模組,支援nginx-0.7.54以後的版本,在網站訪問量不是很高磁

c#實現圖片生成

1,判斷圖片的寬和高的比例,然後進行縮放,以便於使縮圖不變形。 2,DrawImage方法為縮圖繪製邊框,這樣,瀏覽起來比較美觀。 3,呼叫Save方法將生成的縮圖儲存到指定的目錄下。 private void MakeThumbnail(string source

tp5上傳圖片生成

<?php namespace app\common\controller; use app\common\model\Goods; class Tools { public stati