思路,1,首先選取部分要摳圖的樣式
,以此為模板,隨機選取x,y坐標點,從源圖
中根據模板圖片摳出你想要的樣式
效果如:摳出的圖:
背景圖:
源碼:
package com.rbao.east.JFrameStudy;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Iterator;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import javax.swing.ImageIcon;
import org.apache.commons.lang3.StringUtils;
/**
*
* @author HUXUHONG
*
*/
public class SliderPictureDeal {
/**
* 生成圖像矩陣
*
* @param path
* @return
* @throws Exception
*/
public static int[][] getData(BufferedImage bimg) throws Exception {
int[][] data = new int[bimg.getWidth()][bimg.getHeight()];
for (int i = 0; i < bimg.getWidth(); i++) {
for (int j = 0; j < bimg.getHeight(); j++) {
data[i][j] = bimg.getRGB(i, j);
}
}
return data;
}
/**
* 根據模板切圖
*
* @param pictureTemplatePath
* @param dealPicturePath
* @throws Exception
*/
public static void pictureTemplatesCut(String pictureTemplatePath, String dealPicturePath) throws Exception {
// 文件類型
String TemplateFiletype = pictureTemplatePath.substring(pictureTemplatePath.lastIndexOf(".") + 1);
String oriFiletype = dealPicturePath.substring(dealPicturePath.lastIndexOf(".") + 1);
if (StringUtils.isBlank(TemplateFiletype)) {
throw new RuntimeException("file type is empty");
}
// 源文件流
File Orifile = new File(dealPicturePath);
InputStream oriis = new FileInputStream(Orifile);
// BufferedImage oriImage = ImageIO.read(oriis);
// 模板圖
BufferedImage imageTemplate = ImageIO.read(new File(pictureTemplatePath));
int width = imageTemplate.getWidth();
int height = imageTemplate.getHeight();
/*
* //源文件寬度 int oriWidth = oriImage.getWidth(); //源文件高度 int oriHeight
* =oriImage.getHeight();
*/
// 源文件寬度
int oriWidth = 500;
// 源文件高度
int oriHeight = 375;
// 最終圖像
BufferedImage newImage = new BufferedImage(width, height, imageTemplate.getType());
Graphics2D graphics = newImage.createGraphics();
graphics.setBackground(Color.white);
// 隨機扣圖坐標點
Random random = new Random();
int x = random.nextInt(oriWidth - width) + 5;
int y = random.nextInt(oriHeight - height) + 5;
int bold = 5;
// 獲取感興趣的目標區域
BufferedImage targetImageNoDeal = getTargetArea(x, y, width, height, oriis, oriFiletype);
// 根據模板圖片摳圖
newImage = DealCutPictureByTemplate(targetImageNoDeal, imageTemplate, newImage);
BufferedImage oriImage = ImageIO.read(Orifile);
//BufferedImage ori_copy_image = new BufferedImage(oriImage.getWidth(), oriImage.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
// 源圖生成遮罩
BufferedImage ori_copy_image = DealOriPictureByTemplate(oriImage, imageTemplate, x, y);
// 設置“抗鋸齒”的屬性
graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
graphics.setStroke(new BasicStroke(bold, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL));
graphics.drawImage(newImage, 0, 0, null);
graphics.dispose();
ImageIO.write(newImage, TemplateFiletype, new File("D:/slider/111", "huxuhong." + TemplateFiletype));
/*Graphics2D g2D = ori_copy_image.createGraphics();
// 設置“抗鋸齒”的屬性
g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g2D.setStroke(new BasicStroke(bold, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL));
g2D.drawImage(ori_copy_image, 0, 0, null);
g2D.dispose();*/
//ImageIO.write(ori_copy_image, oriFiletype, new File("D:/slider/111", "huxuhongori." + TemplateFiletype));
}
/**
* 根據模板圖片摳圖
*
* @param oriImage
* @param templateImage
* @return
*/
public static BufferedImage DealCutPictureByTemplate(BufferedImage oriImage, BufferedImage templateImage,
BufferedImage targetImage) throws Exception {
// 源文件圖像矩陣
int[][] oriImageData = getData(oriImage);
// 模板圖像矩陣
int[][] templateImageData = getData(templateImage);
// 模板圖像寬度
for (int i = 0; i < templateImageData.length; i++) {
// 模板圖片高度
for (int j = 0; j < templateImageData[0].length; j++) {
// 如果模板圖像當前像素點不是白色 copy源文件信息到目標圖片中
if (templateImageData[i][j] != 0) {
targetImage.setRGB(i, j, oriImageData[i][j]);
}
}
}
return targetImage;
}
public static BufferedImage DealOriPictureByTemplate(BufferedImage oriImage, BufferedImage templateImage, int x,
int y) throws Exception {
// 源文件備份圖像矩陣 支持alpha通道的rgb圖像
BufferedImage ori_copy_image = new BufferedImage(oriImage.getWidth(), oriImage.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
// 源文件圖像矩陣
int[][] oriImageData = getData(oriImage);
// 模板圖像矩陣
int[][] templateImageData = getData(templateImage);
//copy 源圖做不透明處理
for (int i = 0; i < oriImageData.length; i++) {
for (int j = 0; j < oriImageData[0].length; j++) {
int rgb = oriImage.getRGB(i,j);
int r = (0xff & rgb);
int g = (0xff & (rgb >> 8));
int b = (0xff & (rgb >> 16));
//無透明處理
rgb = r + (g<<8) + (b<<16)+(255<<24);
ori_copy_image.setRGB(i, j, rgb);
}
}
for (int i = 0; i < templateImageData.length; i++) {
for (int j = 0; j < templateImageData[0].length; j++) {
int rgb = templateImage.getRGB(i, j);
//對源文件備份圖像(x+i,y+j)坐標點進行透明處理
if(rgb !=0){
int rgb_ori = ori_copy_image.getRGB(x+i,y+j);
int r = (0xff & rgb_ori);
int g = (0xff & (rgb_ori >> 8));
int b = (0xff & (rgb_ori >> 16));
rgb_ori = r + (g << 8) + (b << 16) + (150 << 24);
ori_copy_image.setRGB(x+i,y+j, rgb_ori);
}else{
//do nothing
}
}
}
ImageIO.write(ori_copy_image, "png", new File("D:/slider/111", "huxuhongori.png" ));
return ori_copy_image;
}
public static int color_range = 210;
public static boolean colorInRange(int color) {
int red = (color & 0xff0000) >> 16;
int green = (color & 0x00ff00) >> 8;
int blue = (color & 0x0000ff);
if (red >= color_range && green >= color_range && blue >= color_range)
return true;
return false;
}
/**
* 獲取目標區域
*
* @param x
* 隨機切圖坐標x軸位置
* @param y
* 隨機切圖坐標y軸位置
* @param targetWidth
* 切圖后目標寬度
* @param targetHeight
* 切圖后目標高度
* @param ois
* 源文件輸入流
* @return
* @throws Exception
*/
public static BufferedImage getTargetArea(int x, int y, int targetWidth, int targetHeight, InputStream ois,
String filetype) throws Exception {
Iterator<ImageReader> imageReaderList = ImageIO.getImageReadersByFormatName(filetype);
ImageReader imageReader = imageReaderList.next();
// 獲取圖片流
ImageInputStream iis = ImageIO.createImageInputStream(ois);
// 輸入源中的圖像將只按順序讀取
imageReader.setInput(iis, true);
ImageReadParam param = imageReader.getDefaultReadParam();
Rectangle rec = new Rectangle(x, y, targetWidth, targetHeight);
param.setSourceRegion(rec);
BufferedImage targetImage = imageReader.read(0, param);
return targetImage;
}
/*
* public static void main(String args[]){
* //ImageUtils.cut2("D:/slider/111/04.png", "D:/slider/111.jpg", 5,6); try
* { ImageUtils.getData("D:/slider/111/04.png"); } catch (Exception e) { //
* TODO Auto-generated catch block e.printStackTrace(); } try {
* ImageUtils.roundPicture(); } catch (Exception e) { e.printStackTrace(); }
* }
*/
public static void main(String[] args) throws Exception {
ImageUtils.pictureTemplatesCut("D:/slider/111/33.png","D:/slider/111/77.jpg");
}
}
問題:1,摳出的圖和背景圖有明顯的抗鋸齒未很好解決
未完,待續
