Java实现图片的叠加与拼接

关于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;

}

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20191205A0GJ2F00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券