java實現對圖片打馬賽克


簡介

今天看到其他圖片處理工具的打碼功能,就想使用java實現一下,可以對指定區域打碼。

實現

原圖

打碼后的圖

代碼實現

import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.imageio.ImageIO;

/**
 * 圖片處理類 支持局部打碼
 */
public class ImageUtil {

  /**
   * 給圖片指定位置打馬賽克
   *
   * @param x 圖片要打碼區域左上角的橫坐標
   * @param y 圖片要打碼區域左上角的縱坐標
   * @param width 圖片要打碼區域的寬度
   * @param height 圖片要打碼區域的高度
   * @param mosaicSize 馬賽克尺寸,即每個矩形的長寬
   */
  public static boolean mosaic(InputStream source, OutputStream target,
      int x, int y, int width, int height, int mosaicSize) throws IOException {
    //讀取該圖片
    BufferedImage bi = ImageIO.read(source);
    //復制一份畫布,在新畫布上作畫,因為要用到原來畫布的顏色信息
    BufferedImage spinImage = new BufferedImage(bi.getWidth(),
        bi.getHeight(), BufferedImage.TYPE_INT_RGB);
    //馬賽克塊大小 不能大於圖片寬度和高度
    if (mosaicSize > bi.getWidth() || mosaicSize > bi.getHeight() || mosaicSize <= 0) {
      System.err.println("馬賽克尺寸設置不正確");
      return false;
    }
    //2. 設置各方向繪制的馬賽克塊個數
    int xcount = width / mosaicSize; // x方向繪制個數
    int ycount = height / mosaicSize; // y方向繪制個數
    if ((width % mosaicSize) != 0) {
      xcount++;
    }
    if ((height % mosaicSize) != 0) {
      ycount++;
    }
    //3. 繪制馬賽克(在指定范圍內繪制矩形並填充顏色)
    Graphics gs = spinImage.getGraphics();
    //將老畫布內容畫到新畫布上
    gs.drawImage(bi, 0, 0, null);
    int xTmp = x;
    int yTmp = y;
    for (int i = 0; i < xcount; i++) {
      for (int j = 0; j < ycount; j++) {
        //馬賽克矩形大小
        int mwidth = mosaicSize;
        int mheight = mosaicSize;
        if (i == xcount - 1) {   //橫向最后一個比較特殊,可能不夠一個size
          mwidth = width - xTmp;
        }
        if (j == ycount - 1) {  //同理
          mheight = height - yTmp;
        }
        //矩形顏色取中心像素點RGB值
        int centerX = xTmp;
        int centerY = yTmp;
        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(xTmp, yTmp, mwidth, mheight);
        yTmp += mosaicSize;// 計算下一個矩形的y坐標
      }
      yTmp = y;// 還原y坐標
      xTmp += mosaicSize;// 計算x坐標
    }
    gs.dispose();
    ImageIO.write(spinImage, "jpg", target); // 保存圖片
    return true;
  }

}

客戶端使用

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Main {

  public static void main(String[] args) {
    try {
      ImageUtil.mosaic(new FileInputStream("D:/testjar/aaa.jpg"),
          new FileOutputStream("D:/testjar/aaa_mosaic.jpg"), 400, 500, 200, 200, 10);
    } catch (IOException e) {
      System.err.println("出錯了!!!!");
      e.printStackTrace();
    }
  }

}

原理

以上面代碼中的區域為例,橫坐標400,縱坐標500,寬高都為200的一個正方形,用邊長為10的馬賽克塊填充,
顏色使用原圖中馬賽克塊中心位置的RGB顏色。總結來說就是將馬賽克塊中心位置的顏色擴展到整個馬賽克塊。

參考

Java實現給圖片局部打馬賽克
一個在線給圖片打碼的網站


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM