簡介
今天看到其他圖片處理工具的打碼功能,就想使用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顏色。總結來說就是將馬賽克塊中心位置的顏色擴展到整個馬賽克塊。