关于Java实现图片的叠加与拼接的文章网络上确实很多,碰巧小编开发工作中也遇到这些问题,就做了简要的梳理,作为笔记以备不时之需。
Java对图片的处理主要使用的是BufferedImage类。
子类描述具有可访问图像数据缓冲区的 。 由图像数据的 和 组成。 的 中 band 的数量和类型必须与 所要求的数量和类型相匹配,以表示其颜色和 alpha 分量。所有 对象的左上角坐标都为 (0, 0)。因此,用来构造 的任何 都必须满足:minX=0 且 minY=0。此类依靠 的数据获取方法、数据设置方法,以及 的颜色特征化方法。
以上主要来源于官方文档,我们来时直接写实践代码吧。
首先将文件转化为BufferedImage对象,这里给出两种读取文件并转化为BufferedImage对象的方法。
/**
*@paramfileUrl 文件绝对路径或相对路径
*@return读取到的缓存图像
*@throwsIOException 路径错误或者不存在该文件时抛出IO异常
*/
publicstaticBufferedImage getBufferedImage(String fileUrl)
throwsIOException {
File f=newFile(fileUrl);
returnImageIO.read(f);
}
/**
* 远程图片转BufferedImage
*@paramdestUrl 远程图片地址
*@return
*/
publicstaticBufferedImage getBufferedImageDestUrl(String destUrl) {
HttpURLConnection conn=null;
BufferedImage image=null;
try{
URL url=newURL(destUrl);
conn=(HttpURLConnection) url.openConnection();
if(conn.getResponseCode() == 200) {
image=ImageIO.read(conn.getInputStream());
returnimage;
}
}catch(Exception e) {
e.printStackTrace();
}finally{
conn.disconnect();
}
returnimage;
}
接下来是将BufferedImage对象保存到本地,具体方法如下:
/**
* 输出图片
*@parambuffImg 图像拼接叠加之后的BufferedImage对象
*@paramsavePath 图像拼接叠加之后的保存路径
*/
publicstaticvoidgenerateSaveFile(BufferedImage buffImg, String savePath) {
inttemp = savePath.lastIndexOf(".") + 1;
try{
File outFile=newFile(savePath);
if(!outFile.exists()){
outFile.createNewFile();
}
ImageIO.write(buffImg, savePath.substring(temp), outFile);
System.out.println("ImageIO write...");
}catch(IOException e) {
e.printStackTrace();
}
}
以上作为准备部分,现在开始图片叠加的实现方法:
/**
*
* @Title: 构造图片
* @Description: 生成水印并返回java.awt.image.BufferedImage
*@parambuffImg 源文件(BufferedImage)
*@paramwaterFile 水印文件(BufferedImage)
*@paramx 距离右下角的X偏移量
*@paramy 距离右下角的Y偏移量
*@paramalpha 透明度, 选择值从0.0~1.0: 完全透明~完全不透明
*@returnBufferedImage
*@throwsIOException
*/
publicstaticBufferedImage overlyingImage(BufferedImage buffImg, BufferedImage waterImg,intx,inty,floatalpha)throwsIOException {
//创建Graphics2D对象,用在底图对象上绘图
Graphics2D g2d =buffImg.createGraphics();
intwaterImgWidth = waterImg.getWidth();//获取层图的宽度
intwaterImgHeight = waterImg.getHeight();//获取层图的高度
//在图形和图像中实现混合和透明效果
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
//绘制
g2d.drawImage(waterImg, x, y, waterImgWidth, waterImgHeight,null);
g2d.dispose();//释放图形上下文使用的系统资源
returnbuffImg;
}
图片拼接的实现方法:
/**
* 待合并的两张图必须满足这样的前提,如果水平方向合并,则高度必须相等;如果是垂直方向合并,宽度必须相等。
* mergeImage方法不做判断,自己判断。
*@paramimg1 待合并的第一张图
*@paramimg2 带合并的第二张图
*@paramisHorizontal 为true时表示水平方向合并,为false时表示垂直方向合并
*@return返回合并后的BufferedImage对象
*@throwsIOException
*/
publicstaticBufferedImage mergeImage(BufferedImage img1,
BufferedImage img2,booleanisHorizontal)throwsIOException {
intw1 =img1.getWidth();
inth1 =img1.getHeight();
intw2 =img2.getWidth();
inth2 =img2.getHeight();
//从图片中读取RGB
int[] ImageArrayOne =newint[w1 *h1];
ImageArrayOne= img1.getRGB(0, 0, w1, h1, ImageArrayOne, 0, w1);//逐行扫描图像中各个像素的RGB到数组中
int[] ImageArrayTwo =newint[w2 *h2];
ImageArrayTwo= img2.getRGB(0, 0, w2, h2, ImageArrayTwo, 0, w2);
//生成新图片
BufferedImage DestImage =null;
if(isHorizontal) {//水平方向合并
DestImage =newBufferedImage(w1+w2, h1, BufferedImage.TYPE_INT_RGB);
DestImage.setRGB(0, 0, w1, h1, ImageArrayOne, 0, w1);//设置上半部分或左半部分的RGB
DestImage.setRGB(w1, 0, w2, h2, ImageArrayTwo, 0, w2);
}else{//垂直方向合并
DestImage =newBufferedImage(w1, h1 +h2, BufferedImage.TYPE_INT_RGB);
DestImage.setRGB(0, 0, w1, h1, ImageArrayOne, 0, w1);//设置上半部分或左半部分的RGB
DestImage.setRGB(0, h1, w2, h2, ImageArrayTwo, 0, w2);//设置下半部分的RGB
}
returnDestImage;
}
领取专属 10元无门槛券
私享最新 技术干货