from http://blog.csdn.net/hu_shengyang/article/details/7433988
package com.adam.dev.pic.easyImage; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Rectangle; import java.awt.color.ColorSpace; import java.awt.image.BufferedImage; import java.awt.image.ColorConvertOp; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Iterator; import java.util.List; import javax.imageio.ImageIO; import javax.imageio.ImageReadParam; import javax.imageio.ImageReader; import javax.imageio.stream.ImageInputStream; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGImageEncoder; /** * @author adam.胡升阳 * 创建日期 2012-2-29 */ public class OperateImage{ public OperateImage() { super(); } /** * 对图片裁剪,并把裁剪新图片保存 * @param srcPath 读取源图片路径 * @param toPath 写入图片路径 * @param x 剪切起始点x坐标 * @param y 剪切起始点y坐标 * @param width 剪切宽度 * @param height 剪切高度 * @param readImageFormat 读取图片格式 * @param writeImageFormat 写入图片格式 * @throws IOException */ public void cropImage(String srcPath,String toPath, int x,int y,int width,int height, String readImageFormat,String writeImageFormat) throws IOException{ FileInputStream fis = null ; ImageInputStream iis =null ; try{ //读取图片文件 fis = new FileInputStream(srcPath); Iterator it = ImageIO.getImageReadersByFormatName(readImageFormat); ImageReader reader = (ImageReader) it.next(); //获取图片流 iis = ImageIO.createImageInputStream(fis); reader.setInput(iis,true) ; ImageReadParam param = reader.getDefaultReadParam(); //定义一个矩形 Rectangle rect = new Rectangle(x, y, width, height); //提供一个 BufferedImage,将其用作解码像素数据的目标。 param.setSourceRegion(rect); BufferedImage bi = reader.read(0,param); //保存新图片 ImageIO.write(bi, writeImageFormat, new File(toPath)); }finally{ if(fis!=null) fis.close(); if(iis!=null) iis.close(); } } /** * 按倍率缩小图片 * @param srcImagePath 读取图片路径 * @param toImagePath 写入图片路径 * @param widthRatio 宽度缩小比例 * @param heightRatio 高度缩小比例 * @throws IOException */ public void reduceImageByRatio(String srcImagePath,String toImagePath,int widthRatio,int heightRatio) throws IOException{ FileOutputStream out = null; try{ //读入文件 File file = new File(srcImagePath); // 构造Image对象 BufferedImage src = javax.imageio.ImageIO.read(file); int width = src.getWidth(); int height = src.getHeight(); // 缩小边长 BufferedImage tag = new BufferedImage(width / widthRatio, height / heightRatio, BufferedImage.TYPE_INT_RGB); // 绘制 缩小 后的图片 tag.getGraphics().drawImage(src, 0, 0, width / widthRatio, height / heightRatio, null); out = new FileOutputStream(toImagePath); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); encoder.encode(tag); }catch(Exception e){ e.printStackTrace(); }finally{ if(out != null){ out.close(); } } } /** * 长高等比例缩小图片 * @param srcImagePath 读取图片路径 * @param toImagePath 写入图片路径 * @param ratio 缩小比例 * @throws IOException */ public void reduceImageEqualProportion(String srcImagePath,String toImagePath,int ratio) throws IOException{ FileOutputStream out = null; try{ //读入文件 File file = new File(srcImagePath); // 构造Image对象 BufferedImage src = javax.imageio.ImageIO.read(file); int width = src.getWidth(); int height = src.getHeight(); // 缩小边长 BufferedImage tag = new BufferedImage(width / ratio, height / ratio, BufferedImage.TYPE_INT_RGB); // 绘制 缩小 后的图片 tag.getGraphics().drawImage(src, 0, 0, width / ratio, height / ratio, null); out = new FileOutputStream(toImagePath); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); encoder.encode(tag); }catch(Exception e){ e.printStackTrace(); }finally{ if(out != null){ out.close(); } } } /** * 按倍率放大图片 * @param srcImagePath 读取图形路径 * @param toImagePath 写入入行路径 * @param widthRatio 宽度放大比例 * @param heightRatio 高度放大比例 * @throws IOException */ public void enlargementImageByRatio(String srcImagePath,String toImagePath,int widthRatio,int heightRatio) throws IOException{ FileOutputStream out = null; try{ //读入文件 File file = new File(srcImagePath); // 构造Image对象 BufferedImage src = javax.imageio.ImageIO.read(file); int width = src.getWidth(); int height = src.getHeight(); // 放大边长 BufferedImage tag = new BufferedImage(width * widthRatio, height * heightRatio, BufferedImage.TYPE_INT_RGB); //绘制放大后的图片 tag.getGraphics().drawImage(src, 0, 0, width * widthRatio, height * heightRatio, null); out = new FileOutputStream(toImagePath); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); encoder.encode(tag); }catch(Exception e){ e.printStackTrace(); }finally{ if(out != null){ out.close(); } } } /** * 长高等比例放大图片 * @param srcImagePath 读取图形路径 * @param toImagePath 写入入行路径 * @param ratio 放大比例 * @throws IOException */ public void enlargementImageEqualProportion(String srcImagePath,String toImagePath,int ratio) throws IOException{ FileOutputStream out = null; try{ //读入文件 File file = new File(srcImagePath); // 构造Image对象 BufferedImage src = javax.imageio.ImageIO.read(file); int width = src.getWidth(); int height = src.getHeight(); // 放大边长 BufferedImage tag = new BufferedImage(width * ratio, height * ratio, BufferedImage.TYPE_INT_RGB); //绘制放大后的图片 tag.getGraphics().drawImage(src, 0, 0, width * ratio, height * ratio, null); out = new FileOutputStream(toImagePath); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); encoder.encode(tag); }catch(Exception e){ e.printStackTrace(); }finally{ if(out != null){ out.close(); } } } /** * 重置图形的边长大小 * @param srcImagePath * @param toImagePath * @param width * @param height * @throws IOException */ public void resizeImage(String srcImagePath,String toImagePath,int width,int height) throws IOException{ FileOutputStream out = null; try{ //读入文件 File file = new File(srcImagePath); // 构造Image对象 BufferedImage src = javax.imageio.ImageIO.read(file); // 放大边长 BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); //绘制放大后的图片 tag.getGraphics().drawImage(src, 0, 0, width, height, null); out = new FileOutputStream(toImagePath); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); encoder.encode(tag); }catch(Exception e){ e.printStackTrace(); }finally{ if(out != null){ out.close(); } } } /** * 横向拼接图片(两张) * @param firstSrcImagePath 第一张图片的路径 * @param secondSrcImagePath 第二张图片的路径 * @param imageFormat 拼接生成图片的格式 * @param toPath 拼接生成图片的路径 */ public void joinImagesHorizontal(String firstSrcImagePath, String secondSrcImagePath,String imageFormat, String toPath){ try { //读取第一张图片 File fileOne = new File(firstSrcImagePath); BufferedImage imageOne = ImageIO.read(fileOne); int width = imageOne.getWidth();//图片宽度 int height = imageOne.getHeight();//图片高度 //从图片中读取RGB int[] imageArrayOne = new int[width*height]; imageArrayOne = imageOne.getRGB(0,0,width,height,imageArrayOne,0,width); //对第二张图片做相同的处理 File fileTwo = new File(secondSrcImagePath); BufferedImage imageTwo = ImageIO.read(fileTwo); int width2 = imageTwo.getWidth(); int height2 = imageTwo.getHeight(); int[] ImageArrayTwo = new int[width2*height2]; ImageArrayTwo = imageTwo.getRGB(0,0,width,height,ImageArrayTwo,0,width); //ImageArrayTwo = imageTwo.getRGB(0,0,width2,height2,ImageArrayTwo,0,width2); //生成新图片 //int height3 = (height>height2 || height==height2)?height:height2; BufferedImage imageNew = new BufferedImage(width*2,height,BufferedImage.TYPE_INT_RGB); //BufferedImage imageNew = new BufferedImage(width+width2,height3,BufferedImage.TYPE_INT_RGB); imageNew.setRGB(0,0,width,height,imageArrayOne,0,width);//设置左半部分的RGB imageNew.setRGB(width,0,width,height,ImageArrayTwo,0,width);//设置右半部分的RGB //imageNew.setRGB(width,0,width2,height2,ImageArrayTwo,0,width2);//设置右半部分的RGB File outFile = new File(toPath); ImageIO.write(imageNew, imageFormat, outFile);//写图片 } catch (Exception e) { e.printStackTrace(); } } /** * 横向拼接一组(多张)图像 * @param pics 将要拼接的图像 * @param type 图像写入格式 * @param dst_pic 图像写入路径 * @return */ public boolean joinImageListHorizontal(String[] pics, String type, String dst_pic) { try { int len = pics.length; if (len < 1) { System.out.println("pics len < 1"); return false; } File[] src = new File[len]; BufferedImage[] images = new BufferedImage[len]; int[][] imageArrays = new int[len][]; for (int i = 0; i < len; i++) { src[i] = new File(pics[i]); images[i] = ImageIO.read(src[i]); int width = images[i].getWidth(); int height = images[i].getHeight(); imageArrays[i] = new int[width * height];// 从图片中读取RGB imageArrays[i] = images[i].getRGB(0, 0, width, height, imageArrays[i], 0, width); } int dst_width = 0; int dst_height = images[0].getHeight(); for (int i = 0; i < images.length; i++) { dst_height = dst_height > images[i].getHeight() ? dst_height : images[i].getHeight(); dst_width += images[i].getWidth(); } //System.out.println(dst_width); //System.out.println(dst_height); if (dst_height < 1) { System.out.println("dst_height < 1"); return false; } /* * 生成新图片 */ BufferedImage ImageNew = new BufferedImage(dst_width, dst_height, BufferedImage.TYPE_INT_RGB); int width_i = 0; for (int i = 0; i < images.length; i++) { ImageNew.setRGB(width_i, 0, images[i].getWidth(), dst_height, imageArrays[i], 0, images[i].getWidth()); width_i += images[i].getWidth(); } File outFile = new File(dst_pic); ImageIO.write(ImageNew, type, outFile);// 写图片 } catch (Exception e) { e.printStackTrace(); return false; } return true; } /** * 纵向拼接图片(两张) * @param firstSrcImagePath 读取的第一张图片 * @param secondSrcImagePath 读取的第二张图片 * @param imageFormat 图片写入格式 * @param toPath 图片写入路径 */ public void joinImagesVertical(String firstSrcImagePath, String secondSrcImagePath,String imageFormat, String toPath){ try { //读取第一张图片 File fileOne = new File(firstSrcImagePath); BufferedImage imageOne = ImageIO.read(fileOne); int width = imageOne.getWidth();//图片宽度 int height = imageOne.getHeight();//图片高度 //从图片中读取RGB int[] imageArrayOne = new int[width*height]; imageArrayOne = imageOne.getRGB(0,0,width,height,imageArrayOne,0,width); //对第二张图片做相同的处理 File fileTwo = new File(secondSrcImagePath); BufferedImage imageTwo = ImageIO.read(fileTwo); int width2 = imageTwo.getWidth(); int height2 = imageTwo.getHeight(); int[] ImageArrayTwo = new int[width2*height2]; ImageArrayTwo = imageTwo.getRGB(0,0,width,height,ImageArrayTwo,0,width); //ImageArrayTwo = imageTwo.getRGB(0,0,width2,height2,ImageArrayTwo,0,width2); //生成新图片 //int width3 = (width>width2 || width==width2)?width:width2; BufferedImage imageNew = new BufferedImage(width,height*2,BufferedImage.TYPE_INT_RGB); //BufferedImage imageNew = new BufferedImage(width3,height+height2,BufferedImage.TYPE_INT_RGB); imageNew.setRGB(0,0,width,height,imageArrayOne,0,width);//设置上半部分的RGB imageNew.setRGB(0,height,width,height,ImageArrayTwo,0,width);//设置下半部分的RGB //imageNew.setRGB(0,height,width2,height2,ImageArrayTwo,0,width2);//设置下半部分的RGB File outFile = new File(toPath); ImageIO.write(imageNew, imageFormat, outFile);//写图片 } catch (Exception e) { e.printStackTrace(); } } /** * 纵向拼接一组(多张)图像 * @param pics 将要拼接的图像数组 * @param type 写入图像类型 * @param dst_pic 写入图像路径 * @return */ public boolean joinImageListVertical(String[] pics, String type, String dst_pic) { try { int len = pics.length; if (len < 1) { System.out.println("pics len < 1"); return false; } File[] src = new File[len]; BufferedImage[] images = new BufferedImage[len]; int[][] imageArrays = new int[len][]; for (int i = 0; i < len; i++) { //System.out.println(i); src[i] = new File(pics[i]); images[i] = ImageIO.read(src[i]); int width = images[i].getWidth(); int height = images[i].getHeight(); imageArrays[i] = new int[width * height];// 从图片中读取RGB imageArrays[i] = images[i].getRGB(0, 0, width, height, imageArrays[i], 0, width); } int dst_height = 0; int dst_width = images[0].getWidth(); for (int i = 0; i < images.length; i++) { dst_width = dst_width > images[i].getWidth() ? dst_width : images[i].getWidth(); dst_height += images[i].getHeight(); } //System.out.println(dst_width); //System.out.println(dst_height); if (dst_height < 1) { System.out.println("dst_height < 1"); return false; } /* * 生成新图片 */ BufferedImage ImageNew = new BufferedImage(dst_width, dst_height, BufferedImage.TYPE_INT_RGB); int height_i = 0; for (int i = 0; i < images.length; i++) { ImageNew.setRGB(0, height_i, dst_width, images[i].getHeight(), imageArrays[i], 0, dst_width); height_i += images[i].getHeight(); } File outFile = new File(dst_pic); ImageIO.write(ImageNew, type, outFile);// 写图片 } catch (Exception e) { e.printStackTrace(); return false; } return true; } /** * 合并图片(按指定初始x、y坐标将附加图片贴到底图之上) * @param negativeImagePath 背景图片路径 * @param additionImagePath 附加图片路径 * @param x 附加图片的起始点x坐标 * @param y 附加图片的起始点y坐标 * @param toPath 图片写入路径 * @throws IOException */ public void mergeBothImage(String negativeImagePath,String additionImagePath,int x,int y,String toPath ) throws IOException{ InputStream is= null; InputStream is2= null; OutputStream os = null; try{ is=new FileInputStream(negativeImagePath); is2=new FileInputStream(additionImagePath); BufferedImage image=ImageIO.read(is); BufferedImage image2=ImageIO.read(is2); Graphics g=image.getGraphics(); g.drawImage(image2,x,y,null); os = new FileOutputStream(toPath); JPEGImageEncoder enc=JPEGCodec.createJPEGEncoder(os); enc.encode(image); }catch(Exception e){ e.printStackTrace(); }finally{ if(os != null){ os.close(); } if(is2 != null){ is2.close(); } if(is != null){ is.close(); } } } /** * 将一组图片一次性附加合并到底图上 * @param negativeImagePath 源图像(底图)路径 * @param additionImageList 附加图像信息列表 * @param imageFormat 图像写入格式 * @param toPath 图像写入路径 * @throws IOException */ public void mergeImageList(String negativeImagePath,List additionImageList,String imageFormat, String toPath) throws IOException{ InputStream is= null; InputStream is2= null; OutputStream os = null; try{ is=new FileInputStream(negativeImagePath); BufferedImage image=ImageIO.read(is); //Graphics g=image.getGraphics(); Graphics2D g = image.createGraphics();; BufferedImage image2 = null; if(additionImageList != null){ for(int i=0;i100,则调用Jmagick的方法。 /*List iamgePathList = new ArrayList(); // D:/test/16a/ iamgePathList.add("D:/test/16a/12384_2492.jpg"); iamgePathList.add("D:/test/16a/12384_2493.jpg"); iamgePathList.add("D:/test/16a/12384_2494.jpg"); iamgePathList.add("D:/test/16a/12384_2495.jpg"); iamgePathList.add("D:/test/16a/12384_2496.jpg"); iamgePathList.add("D:/test/16a/12384_2497.jpg"); iamgePathList.add("D:/test/16a/12384_2498.jpg"); iamgePathList.add("D:/test/16a/12384_2499.jpg"); iamgePathList.add("D:/test/16a/12384_2500.jpg"); iamgePathList.add("D:/test/16a/12384_2501.jpg"); iamgePathList.add("D:/test/16a/12384_2502.jpg");*/ //String imageFormat = "jpg"; //String toPath = "D:/test/desk/16a_v1.jpg"; //imageObj.joinImageListHorizontal(iamgePathList, imageFormat, toPath); /*String imageFormat = "jpg"; String[] pics1 = {"D:/test/16a/12384_2502.jpg","D:/test/16a/12384_2501.jpg", "D:/test/16a/12384_2500.jpg","D:/test/16a/12384_2499.jpg","D:/test/16a/12384_2498.jpg", "D:/test/16a/12384_2497.jpg","D:/test/16a/12384_2496.jpg","D:/test/16a/12384_2495.jpg", "D:/test/16a/12384_2494.jpg","D:/test/16a/12384_2493.jpg","D:/test/16a/12384_2492.jpg"}; String[] pics2 = {"D:/test/16a/12385_2502.jpg","D:/test/16a/12385_2501.jpg", "D:/test/16a/12385_2500.jpg","D:/test/16a/12385_2499.jpg","D:/test/16a/12385_2498.jpg", "D:/test/16a/12385_2497.jpg","D:/test/16a/12385_2496.jpg","D:/test/16a/12385_2495.jpg", "D:/test/16a/12385_2494.jpg","D:/test/16a/12385_2493.jpg","D:/test/16a/12385_2492.jpg"}; String[] pics3 = {"D:/test/16a/12386_2502.jpg","D:/test/16a/12386_2501.jpg", "D:/test/16a/12386_2500.jpg","D:/test/16a/12386_2499.jpg","D:/test/16a/12386_2498.jpg", "D:/test/16a/12386_2497.jpg","D:/test/16a/12386_2496.jpg","D:/test/16a/12386_2495.jpg", "D:/test/16a/12386_2494.jpg","D:/test/16a/12386_2493.jpg","D:/test/16a/12386_2492.jpg"}; String[] pics4 = {"D:/test/16a/12387_2502.jpg","D:/test/16a/12387_2501.jpg", "D:/test/16a/12387_2500.jpg","D:/test/16a/12387_2499.jpg","D:/test/16a/12387_2498.jpg", "D:/test/16a/12387_2497.jpg","D:/test/16a/12387_2496.jpg","D:/test/16a/12387_2495.jpg", "D:/test/16a/12387_2494.jpg","D:/test/16a/12387_2493.jpg","D:/test/16a/12387_2492.jpg"}; String[] pics5 = {"D:/test/16a/12388_2502.jpg","D:/test/16a/12388_2501.jpg", "D:/test/16a/12388_2500.jpg","D:/test/16a/12388_2499.jpg","D:/test/16a/12388_2498.jpg", "D:/test/16a/12388_2497.jpg","D:/test/16a/12388_2496.jpg","D:/test/16a/12388_2495.jpg", "D:/test/16a/12388_2494.jpg","D:/test/16a/12388_2493.jpg","D:/test/16a/12388_2492.jpg"}; String[] pics6 = {"D:/test/16a/12389_2502.jpg","D:/test/16a/12389_2501.jpg", "D:/test/16a/12389_2500.jpg","D:/test/16a/12389_2499.jpg","D:/test/16a/12389_2498.jpg", "D:/test/16a/12389_2497.jpg","D:/test/16a/12389_2496.jpg","D:/test/16a/12389_2495.jpg", "D:/test/16a/12389_2494.jpg","D:/test/16a/12389_2493.jpg","D:/test/16a/12389_2492.jpg"}; String toPath1 = "D:/test/desk/16a_v1.jpg"; String toPath2 = "D:/test/desk/16a_v2.jpg"; String toPath3 = "D:/test/desk/16a_v3.jpg"; String toPath4 = "D:/test/desk/16a_v4.jpg"; String toPath5 = "D:/test/desk/16a_v5.jpg"; String toPath6 = "D:/test/desk/16a_v6.jpg"; String[] pics7 = {toPath1,toPath2,toPath3,toPath4,toPath5,toPath6}; String toPath7 = "D:/test/desk/16a_h1.jpg"; long start = System.currentTimeMillis(); imageObj.joinImageListVertical(pics1, imageFormat, toPath1); imageObj.joinImageListVertical(pics2, imageFormat, toPath2); imageObj.joinImageListVertical(pics3, imageFormat, toPath3); imageObj.joinImageListVertical(pics4, imageFormat, toPath4); imageObj.joinImageListVertical(pics5, imageFormat, toPath5); imageObj.joinImageListVertical(pics6, imageFormat, toPath6); imageObj.joinImageListHorizontal(pics7, imageFormat, toPath7); long end = System.currentTimeMillis(); System.out.println(end-start);*/ String str = "北京\n上海\n广州\n深圳"; System.out.println(str); String path = "c:/relevantdata.txt"; FileOutputStream fops = new FileOutputStream(path); fops.write(str.getBytes()); BufferedReader inputStream = new BufferedReader(new FileReader(new File(path))); String mrMsg = ""; while((mrMsg = inputStream.readLine())!=null){ System.out.println(mrMsg); } } //数量 11 11x6 //纵向 375 //横向 391 3250 }