java 将图片分割成9张_将多张图片合并成一张,代码(可垂直和水平方向合并)...

importjava.awt.image.BufferedImage;importjava.io.File;importjava.io.IOException;importjavax.imageio.ImageIO;/***@authoroucq

*@versionAug 3, 2016 6:13:55 PM

*

* 该类实现了图片的合并功能,可以选择水平合并或者垂直合并。*/

public classImageUtil {/***@paramfileUrl

* 文件绝对路径或相对路径

*@return读取到的缓存图像

*@throwsIOException

* 路径错误或者不存在该文件时抛出IO异常*/

public static BufferedImage getBufferedImage(String fileUrl) throwsIOException {

File f= newFile(fileUrl);returnImageIO.read(f);

}/***@paramsavedImg

* 待保存的图像

*@paramsaveDir

* 保存的目录

*@paramfileName

* 保存的文件名,必须带后缀,比如 "beauty.jpg"

*@paramformat

* 文件格式:jpg、png或者bmp

*@return

*/

public static booleansaveImage(BufferedImage savedImg, String saveDir, String fileName, String format) {boolean flag = false;//先检查保存的图片格式是否正确

String[] legalFormats = { "jpg", "JPG", "png", "PNG", "bmp", "BMP"};int i = 0;for (i = 0; i < legalFormats.length; i++) {if(format.equals(legalFormats[i])) {break;

}

}if (i == legalFormats.length) { //图片格式不支持

System.out.println("不是保存所支持的图片格式!");return false;

}//再检查文件后缀和保存的格式是否一致

String postfix = fileName.substring(fileName.lastIndexOf('.') + 1);if (!postfix.equalsIgnoreCase(format)) {

System.out.println("待保存文件后缀和保存的格式不一致!");return false;

}

String fileUrl= saveDir +fileName;

File file= newFile(fileUrl);try{

flag=ImageIO.write(savedImg, format, file);

}catch(IOException e) {

e.printStackTrace();

}returnflag;

}/*** 待合并的两张图必须满足这样的前提,如果水平方向合并,则高度必须相等;如果是垂直方向合并,宽度必须相等。

* mergeImage方法不做判断,自己判断。

*

*@paramimg1

* 待合并的第一张图

*@paramimg2

* 带合并的第二张图

*@paramisHorizontal

* 为true时表示水平方向合并,为false时表示垂直方向合并

*@return返回合并后的BufferedImage对象

*@throwsIOException*/

public static BufferedImage mergeImage(booleanisHorizontal, BufferedImage img1, BufferedImage img2)throwsIOException {int w1 =img1.getWidth();int h1 =img1.getHeight();int w2 =img2.getWidth();int h2 =img2.getHeight();//从图片中读取RGB

int[] ImageArrayOne = new int[w1 *h1];

ImageArrayOne= img1.getRGB(0, 0, w1, h1, ImageArrayOne, 0, w1); //逐行扫描图像中各个像素的RGB到数组中

int[] ImageArrayTwo = new int[w2 *h2];

ImageArrayTwo= img2.getRGB(0, 0, w2, h2, ImageArrayTwo, 0, w2);//生成新图片

BufferedImage DestImage = null;if (isHorizontal) { //水平方向合并

DestImage = new BufferedImage(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 = new BufferedImage(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;

}/**合并任数量的图片成一张图片

*@paramisHorizontal true代表水平合并,fasle代表垂直合并

*@paramimgs 欲合并的图片数组

*@return*@throwsIOException*/

public static BufferedImage mergeImage(boolean isHorizontal, BufferedImage... imgs) throwsIOException {//生成新图片

BufferedImage DestImage = null;//计算新图片的长和高

int allw = 0, allh = 0, allwMax = 0, allhMax = 0;for(BufferedImage img : imgs) {

allw+=img.getWidth();

allh+=img.getHeight();if (img.getWidth() >allwMax) {

allwMax=img.getWidth();

}

;if (img.getHeight() >allhMax) {

allhMax=img.getHeight();

}

;

}//创建新图片

if(isHorizontal) {

DestImage= newBufferedImage(allw, allhMax, BufferedImage.TYPE_INT_RGB);

}else{

DestImage= newBufferedImage(allwMax, allh, BufferedImage.TYPE_INT_RGB);

}//合并所有子图片到新图片

int wx = 0, wy = 0;for (int i = 0; i < imgs.length; i++) {

BufferedImage img=imgs[i];int w1 =img.getWidth();int h1 =img.getHeight();//从图片中读取RGB

int[] ImageArrayOne = new int[w1 *h1];

ImageArrayOne= img.getRGB(0, 0, w1, h1, ImageArrayOne, 0, w1); //逐行扫描图像中各个像素的RGB到数组中

if (isHorizontal) { //水平方向合并

DestImage.setRGB(wx, 0, w1, h1, ImageArrayOne, 0, w1); //设置上半部分或左半部分的RGB

} else { //垂直方向合并

DestImage.setRGB(0, wy, w1, h1, ImageArrayOne, 0, w1); //设置上半部分或左半部分的RGB

}

wx+=w1;

wy+=h1;

}returnDestImage;

}public static voidmain(String[] args) {//读取待合并的文件

BufferedImage bi1 = null;

BufferedImage bi2= null;try{

bi1= getBufferedImage("src/one.jpg");

bi2= getBufferedImage("src/two.jpg");

}catch(IOException e) {

e.printStackTrace();

}//调用mergeImage方法获得合并后的图像

BufferedImage destImg = null;try{

destImg= mergeImage(false, bi1, bi2, bi2);

}catch(IOException e) {

e.printStackTrace();

}//保存图像

saveImage(destImg, "src/", "allv.jpg", "jpg");

System.out.println("垂直合并完毕!");// System.out.println("下面是水平合并的情况:");try{

bi1= getBufferedImage("src/one.jpg");

bi2= getBufferedImage("src/two.jpg");

}catch(IOException e) {

e.printStackTrace();

}//调用mergeImage方法获得合并后的图像

try{

destImg= mergeImage(true, bi1, bi2, bi2);

}catch(IOException e) {

e.printStackTrace();

}//保存图像

saveImage(destImg, "src/", "allh.jpg", "jpg");

System.out.println("水平合并完毕!");

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值