最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java實(shí)現(xiàn)圖片縮放、旋轉(zhuǎn)和馬賽克化

 更新時間:2022年04月22日 14:53:54   作者:Crazy光光  
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)圖片縮放、旋轉(zhuǎn)和馬賽克化,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文是作者結(jié)合網(wǎng)上的一些資料封裝的java圖片處理類,支持圖片的縮放,旋轉(zhuǎn),馬賽克化。

不多說,上代碼:

package deal;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

/**
 * 圖像處理類.
 * 
 * @author nagsh
 * 
 */
public class ImageDeal {

  String openUrl; // 原始圖片打開路徑
  String saveUrl; // 新圖保存路徑
  String saveName; // 新圖名稱
  String suffix; // 新圖類型 只支持gif,jpg,png

  public ImageDeal(String openUrl, String saveUrl, String saveName,
      String suffix) {
    this.openUrl = openUrl;
    this.saveName = saveName;
    this.saveUrl = saveUrl;
    this.suffix = suffix;
  }

  /**
   * 圖片縮放.
   * 
   * @param width
   *      需要的寬度
   * @param height
   *      需要的高度
   * @throws Exception
   */
  public void zoom(int width, int height) throws Exception {
    double sx = 0.0;
    double sy = 0.0;

    File file = new File(openUrl);
    if (!file.isFile()) {
      throw new Exception("ImageDeal>>>" + file + " 不是一個圖片文件!");
    }
    BufferedImage bi = ImageIO.read(file); // 讀取該圖片
    // 計(jì)算x軸y軸縮放比例--如需等比例縮放,在調(diào)用之前確保參數(shù)width和height是等比例變化的
    sx = (double) width / bi.getWidth();
    sy = (double) height / bi.getHeight();

    AffineTransformOp op = new AffineTransformOp(
        AffineTransform.getScaleInstance(sx, sy), null);
    File sf = new File(saveUrl, saveName + "." + suffix);
    Image zoomImage = op.filter(bi, null);
    try {
      ImageIO.write((BufferedImage) zoomImage, suffix, sf); // 保存圖片
    } catch (Exception e) {
      e.printStackTrace();
    }

  }

  /**
   * 旋轉(zhuǎn)
   * 
   * @param degree
   *      旋轉(zhuǎn)角度
   * @throws Exception
   */
  public void spin(int degree) throws Exception {
    int swidth = 0; // 旋轉(zhuǎn)后的寬度
    int sheight = 0; // 旋轉(zhuǎn)后的高度
    int x; // 原點(diǎn)橫坐標(biāo)
    int y; // 原點(diǎn)縱坐標(biāo)

    File file = new File(openUrl);
    if (!file.isFile()) {
      throw new Exception("ImageDeal>>>" + file + " 不是一個圖片文件!");
    }
    BufferedImage bi = ImageIO.read(file); // 讀取該圖片
    // 處理角度--確定旋轉(zhuǎn)弧度
    degree = degree % 360;
    if (degree < 0)
      degree = 360 + degree;// 將角度轉(zhuǎn)換到0-360度之間
    double theta = Math.toRadians(degree);// 將角度轉(zhuǎn)為弧度

    // 確定旋轉(zhuǎn)后的寬和高
    if (degree == 180 || degree == 0 || degree == 360) {
      swidth = bi.getWidth();
      sheight = bi.getHeight();
    } else if (degree == 90 || degree == 270) {
      sheight = bi.getWidth();
      swidth = bi.getHeight();
    } else {
      swidth = (int) (Math.sqrt(bi.getWidth() * bi.getWidth()
          + bi.getHeight() * bi.getHeight()));
      sheight = (int) (Math.sqrt(bi.getWidth() * bi.getWidth()
          + bi.getHeight() * bi.getHeight()));
    }

    x = (swidth / 2) - (bi.getWidth() / 2);// 確定原點(diǎn)坐標(biāo)
    y = (sheight / 2) - (bi.getHeight() / 2);

    BufferedImage spinImage = new BufferedImage(swidth, sheight,
        bi.getType());
    // 設(shè)置圖片背景顏色
    Graphics2D gs = (Graphics2D) spinImage.getGraphics();
    gs.setColor(Color.white);
    gs.fillRect(0, 0, swidth, sheight);// 以給定顏色繪制旋轉(zhuǎn)后圖片的背景

    AffineTransform at = new AffineTransform();
    at.rotate(theta, swidth / 2, sheight / 2);// 旋轉(zhuǎn)圖象
    at.translate(x, y);
    AffineTransformOp op = new AffineTransformOp(at,
        AffineTransformOp.TYPE_BICUBIC);
    spinImage = op.filter(bi, spinImage);
    File sf = new File(saveUrl, saveName + "." + suffix);
    ImageIO.write(spinImage, suffix, sf); // 保存圖片

  }
  /**
   * 馬賽克化.
   * @param size 馬賽克尺寸,即每個矩形的長寬
   * @return
   * @throws Exception
   */
  public boolean mosaic(int size) throws Exception {
    File file = new File(openUrl);
    if (!file.isFile()) {
      throw new Exception("ImageDeal>>>" + file + " 不是一個圖片文件!");
    }
    BufferedImage bi = ImageIO.read(file); // 讀取該圖片
    BufferedImage spinImage = new BufferedImage(bi.getWidth(),
        bi.getHeight(), bi.TYPE_INT_RGB);
    if (bi.getWidth() < size || bi.getHeight() < size || size <= 0) { // 馬賽克格尺寸太大或太小
      return false;
    }

    int xcount = 0; // 方向繪制個數(shù)
    int ycount = 0; // y方向繪制個數(shù)
    if (bi.getWidth() % size == 0) {
      xcount = bi.getWidth() / size;
    } else {
      xcount = bi.getWidth() / size + 1;
    }
    if (bi.getHeight() % size == 0) {
      ycount = bi.getHeight() / size;
    } else {
      ycount = bi.getHeight() / size + 1;
    }
    int x = 0;  //坐標(biāo)
    int y = 0;
    // 繪制馬賽克(繪制矩形并填充顏色)
    Graphics gs = spinImage.getGraphics();
    for (int i = 0; i < xcount; i++) {
      for (int j = 0; j < ycount; j++) {
        //馬賽克矩形格大小
         int mwidth = size;
         int mheight = size;
         if(i==xcount-1){  //橫向最后一個比較特殊,可能不夠一個size
           mwidth = bi.getWidth()-x;
         }
         if(j == ycount-1){ //同理
           mheight =bi.getHeight()-y;
         }
       // 矩形顏色取中心像素點(diǎn)RGB值
        int centerX = x;
        int centerY = y;
        if (mwidth % 2 == 0) {
          centerX += mwidth / 2;
        } else {
          centerX += (mwidth - 1) / 2;
        }
        if (mheight % 2 == 0) {
          centerY += mheight / 2;
        } else {
          centerY += (mheight - 1) / 2;
        }
        Color color = new Color(bi.getRGB(centerX, centerY));
        gs.setColor(color);
        gs.fillRect(x, y, mwidth, mheight);
        y = y + size;// 計(jì)算下一個矩形的y坐標(biāo)
      }
      y = 0;// 還原y坐標(biāo)
      x = x + size;// 計(jì)算x坐標(biāo)
    }
    gs.dispose();
    File sf = new File(saveUrl, saveName + "." + suffix);
    ImageIO.write(spinImage, suffix, sf); // 保存圖片
    return true;
  }

  public static void main(String[] args) throws Exception {
    ImageDeal imageDeal = new ImageDeal("e://1.jpg", "e://", "2", "jpg");
    // 測試縮放
    /* imageDeal.zoom(200, 300); */
    // 測試旋轉(zhuǎn)
    /* imageDeal.spin(90); */
    //測試馬賽克
    /*imageDeal.mosaic(4);*/
  }

}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java中Arthas的作用和使用方式

    java中Arthas的作用和使用方式

    Arthas 是由阿里巴巴開源的 Java 診斷工具,主要用于在生產(chǎn)環(huán)境中診斷和解決 Java 應(yīng)用問題,它提供實(shí)時監(jiān)控、類信息查看、動態(tài)追蹤、條件表達(dá)式斷點(diǎn)等功能,支持非侵入式設(shè)計(jì)和高擴(kuò)展性,通過 Arthas,開發(fā)者可以在不停止應(yīng)用的情況下,快速定位和解決問題
    2025-01-01
  • 如何基于Autowired對構(gòu)造函數(shù)進(jìn)行注釋

    如何基于Autowired對構(gòu)造函數(shù)進(jìn)行注釋

    這篇文章主要介紹了如何基于Autowired對構(gòu)造函數(shù)進(jìn)行注釋,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10
  • Java RabbitMQ的TTL和DLX全面精解

    Java RabbitMQ的TTL和DLX全面精解

    過期時間TTL表示可以對消息設(shè)置預(yù)期的時間,在這個時間內(nèi)都可以被消費(fèi)者接收獲取;過了之后消息將自動被刪除。DLX, 可以稱之為死信交換機(jī),當(dāng)消息在一個隊(duì)列中變成死信之后,它能被重新發(fā)送到另一個交換機(jī)中,這個交換機(jī)就是DLX ,綁定DLX的隊(duì)列就稱之為死信隊(duì)列
    2021-09-09
  • Java高級-反射&動態(tài)代理詳解

    Java高級-反射&動態(tài)代理詳解

    這篇文章主要介紹了Java高級-反射&動態(tài)代理詳解,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • spring boot Rabbit高級教程(最新推薦)

    spring boot Rabbit高級教程(最新推薦)

    RabbitMQ的消息過期是基于追溯方式來實(shí)現(xiàn)的,也就是說當(dāng)一個消息的TTL到期以后不一定會被移除或投遞到死信交換機(jī),而是在消息恰好處于隊(duì)首時才會被處理,本篇文章給大家介紹spring boot Rabbit高級教程,感興趣的朋友一起看看吧
    2023-10-10
  • Java讀取文件及基于正則表達(dá)式的獲取電話號碼功能詳解

    Java讀取文件及基于正則表達(dá)式的獲取電話號碼功能詳解

    這篇文章主要介紹了Java讀取文件及基于正則表達(dá)式的獲取電話號碼功能,結(jié)合實(shí)例形式詳細(xì)分析了正則匹配操作的相關(guān)語法及電話號碼匹配的原理與實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-09-09
  • redis防止重復(fù)提交的實(shí)現(xiàn)示例

    redis防止重復(fù)提交的實(shí)現(xiàn)示例

    在開發(fā)中我們都需要處理重復(fù)提交的問題,本文主要介紹了redis防止重復(fù)提交的實(shí)現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2024-06-06
  • uploadify上傳及后臺文件合法性驗(yàn)證的代碼解析

    uploadify上傳及后臺文件合法性驗(yàn)證的代碼解析

    這篇文章主要介紹了uploadify上傳及后臺文件合法性驗(yàn)證的代碼解析,整段代碼分為后臺上傳方法,文件合法性驗(yàn)證類,前端上傳js,非常不錯具有參考借鑒價值,需要的朋友可以參考下
    2016-11-11
  • Spring Cloud實(shí)戰(zhàn)技巧之使用隨機(jī)端口

    Spring Cloud實(shí)戰(zhàn)技巧之使用隨機(jī)端口

    這篇文章主要給大家介紹了關(guān)于Spring Cloud實(shí)戰(zhàn)技巧之使用隨機(jī)端口的相關(guān)資料,文中介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。
    2017-06-06
  • 詳解spring security之httpSecurity使用示例

    詳解spring security之httpSecurity使用示例

    這篇文章主要介紹了詳解spring security之httpSecurity使用示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08

最新評論

蒙自县| 分宜县| 高邮市| 林甸县| 北安市| 安乡县| 芜湖市| 巴楚县| 太湖县| 清丰县| 伊金霍洛旗| 全南县| 即墨市| 封丘县| 邵东县| 肃宁县| 涿州市| 离岛区| 湘潭县| 项城市| 乐昌市| 闻喜县| 鄂托克旗| 临海市| 中超| 安西县| 岳池县| 顺平县| 吉林省| 张掖市| 中牟县| 大埔区| 怀柔区| 铁岭县| 天津市| 当涂县| 江油市| 仪陇县| 大埔区| 贵定县| 外汇|