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;i<additionImageList.size();i++){ //解析附加图片信息:x坐标、 y坐标、 additionImagePath附加图片路径 //图片信息存储在一个数组中 String[] additionImageInfo = (String[]) additionImageList.get(i); int x = Integer.parseInt(additionImageInfo[0]); int y = Integer.parseInt(additionImageInfo[1]); String additionImagePath = additionImageInfo[2]; //读取文件输入流,并合并图片 is2 = new FileInputStream(additionImagePath); //System.out.println(x+" : "+y+" : "+additionImagePath); image2 = ImageIO.read(is2); g.drawImage(image2,x,y,null); } } os = new FileOutputStream(toPath); ImageIO.write(image, imageFormat, os);//写图片 //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 additionImagePath 附加图片路径 * @param toPath 合成图片写入路径 * @throws IOException */ public void mergeBothImageTopleftcorner(String negativeImagePath,String additionImagePath,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,0,0,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 additionImagePath 附加图片路径 * @param toPath 合成图片写入路径 * @throws IOException */ public void mergeBothImageToprightcorner(String negativeImagePath,String additionImagePath,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,image.getWidth()-image2.getWidth(),0,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 additionImagePath 附加图片路径 * @param toPath 合成图片写入路径 * @throws IOException */ public void mergeBothImageLeftbottom(String negativeImagePath,String additionImagePath,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,0,image.getHeight()-image2.getHeight(),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 additionImagePath 附加图片路径 * @param toPath 合成图片写入路径 * @throws IOException */ public void mergeBothImageRightbottom(String negativeImagePath,String additionImagePath,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,image.getWidth()-image2.getWidth(),image.getHeight()-image2.getHeight(),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 additionImagePath 附加图片路径 * @param toPath 合成图片写入路径 * @throws IOException */ public void mergeBothImageCenter(String negativeImagePath,String additionImagePath,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,image.getWidth()/2-image2.getWidth()/2,image.getHeight()/2-image2.getHeight()/2,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 additionImagePath 附加图片路径 * @param toPath 合成图片写入路径 * @throws IOException */ public void mergeBothImageTopcenter(String negativeImagePath,String additionImagePath,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,image.getWidth()/2-image2.getWidth()/2,0,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 additionImagePath 附加图片路径 * @param toPath 合成图片写入路径 * @throws IOException */ public void mergeBothImageBottomcenter(String negativeImagePath,String additionImagePath,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,image.getWidth()/2-image2.getWidth()/2,image.getHeight()-image2.getHeight(),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 additionImagePath 附加图片路径 * @param toPath 合成图片写入路径 * @throws IOException */ public void mergeBothImageLeftcenter(String negativeImagePath,String additionImagePath,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,0,image.getHeight()/2-image2.getHeight()/2,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 additionImagePath 附加图片路径 * @param toPath 合成图片写入路径 * @throws IOException */ public void mergeBothImageRightcenter(String negativeImagePath,String additionImagePath,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,image.getWidth()-image2.getWidth(),image.getHeight()/2-image2.getHeight()/2,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 srcImage 读取图片路径 * @param toPath 写入灰化后的图片路径 * @param imageFormat 图片写入格式 */ public void grayImage(String srcImage,String toPath,String imageFormat){ try{ BufferedImage src = ImageIO.read(new File(srcImage)); ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY); ColorConvertOp op = new ColorConvertOp(cs, null); src = op.filter(src, null); ImageIO.write(src, imageFormat, new File(toPath)); }catch(Exception e){ e.printStackTrace(); } } /** * 在源图片上设置水印文字 * @param srcImagePath 源图片路径 * @param alpha 透明度(0<alpha<1) * @param font 字体(例如:宋体) * @param fontStyle 字体格式(例如:普通样式--Font.PLAIN、粗体--Font.BOLD ) * @param fontSize 字体大小 * @param color 字体颜色(例如:黑色--Color.BLACK) * @param inputWords 输入显示在图片上的文字 * @param x 文字显示起始的x坐标 * @param y 文字显示起始的y坐标 * @param imageFormat 写入图片格式(png/jpg等) * @param toPath 写入图片路径 * @throws IOException */ public void alphaWords2Image(String srcImagePath,float alpha, String font,int fontStyle,int fontSize,Color color, String inputWords,int x,int y,String imageFormat,String toPath) throws IOException{ FileOutputStream fos=null; try { BufferedImage image = ImageIO.read(new File(srcImagePath)); //创建java2D对象 Graphics2D g2d=image.createGraphics(); //用源图像填充背景 g2d.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null, null); //设置透明度 AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha); g2d.setComposite(ac); //设置文字字体名称、样式、大小 g2d.setFont(new Font(font, fontStyle, fontSize)); g2d.setColor(color);//设置字体颜色 g2d.drawString(inputWords, x, y); //输入水印文字及其起始x、y坐标 g2d.dispose(); fos=new FileOutputStream(toPath); ImageIO.write(image, imageFormat, fos); } catch (Exception e) { e.printStackTrace(); }finally{ if(fos!=null){ fos.close(); } } } /** * 在源图像上设置图片水印 * ---- 当alpha==1时文字不透明(和在图片上直接输入文字效果一样) * @param srcImagePath 源图片路径 * @param appendImagePath 水印图片路径 * @param alpha 透明度 * @param x 水印图片的起始x坐标 * @param y 水印图片的起始y坐标 * @param width 水印图片的宽度 * @param height 水印图片的高度 * @param imageFormat 图像写入图片格式 * @param toPath 图像写入路径 * @throws IOException */ public void alphaImage2Image(String srcImagePath,String appendImagePath, float alpha,int x,int y,int width,int height, String imageFormat,String toPath) throws IOException{ FileOutputStream fos = null; try { BufferedImage image = ImageIO.read(new File(srcImagePath)); //创建java2D对象 Graphics2D g2d=image.createGraphics(); //用源图像填充背景 g2d.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null, null); //设置透明度 AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha); g2d.setComposite(ac); //设置水印图片的起始x/y坐标、宽度、高度 BufferedImage appendImage = ImageIO.read(new File(appendImagePath)); g2d.drawImage(appendImage, x, y, width, height, null, null); g2d.dispose(); fos=new FileOutputStream(toPath); ImageIO.write(image, imageFormat, fos); } catch (Exception e) { e.printStackTrace(); }finally{ if(fos!=null){ fos.close(); } } } /** * 画单点 ---- 实际上是画一个填充颜色的圆 * ---- 以指定点坐标为中心画一个小半径的圆形,并填充其颜色来充当点 * @param srcImagePath 源图片颜色 * @param x 点的x坐标 * @param y 点的y坐标 * @param width 填充的宽度 * @param height 填充的高度 * @param ovalColor 填充颜色 * @param imageFormat 写入图片格式 * @param toPath 写入路径 * @throws IOException */ public void drawPoint(String srcImagePath,int x,int y,int width,int height,Color ovalColor,String imageFormat,String toPath) throws IOException{ FileOutputStream fos = null; try { //获取源图片 BufferedImage image = ImageIO.read(new File(srcImagePath)); //根据xy点坐标绘制连接线 Graphics2D g2d = image.createGraphics(); g2d.setColor(ovalColor); //填充一个椭圆形 g2d.fillOval(x, y, width, height); fos = new FileOutputStream(toPath); ImageIO.write(image, imageFormat, fos); } catch (IOException e) { e.printStackTrace(); }finally{ if(fos!=null){ fos.close(); } } } /** * 画一组(多个)点---- 实际上是画一组(多个)填充颜色的圆 * ---- 以指定点坐标为中心画一个小半径的圆形,并填充其颜色来充当点 * @param srcImagePath 原图片路径 * @param pointList 点列表 * @param width 宽度 * @param height 高度 * @param ovalColor 填充颜色 * @param imageFormat 写入图片颜色 * @param toPath 写入路径 * @throws IOException */ public void drawPoints(String srcImagePath,List pointList,int width,int height,Color ovalColor,String imageFormat,String toPath) throws IOException{ FileOutputStream fos = null; try { //获取源图片 BufferedImage image = ImageIO.read(new File(srcImagePath)); //根据xy点坐标绘制连接线 Graphics2D g2d = image.createGraphics(); g2d.setColor(ovalColor); //填充一个椭圆形 if(pointList != null){ for(int i=0;i<pointList.size();i++){ Point point = (Point)pointList.get(i); int x = (int) point.getX(); int y = (int) point.getY(); g2d.fillOval(x, y, width, height); } } fos = new FileOutputStream(toPath); ImageIO.write(image, imageFormat, fos); } catch (IOException e) { e.printStackTrace(); }finally{ if(fos!=null){ fos.close(); } } } /** * 画线段 * @param srcImagePath 源图片路径 * @param x1 第一个点x坐标 * @param y1 第一个点y坐标 * @param x2 第二个点x坐标 * @param y2 第二个点y坐标 * @param lineColor 线条颜色 * @param toPath 图像写入路径 * @param imageFormat 图像写入格式 * @throws IOException */ public void drawLine(String srcImagePath,int x1,int y1,int x2,int y2, Color lineColor,String toPath,String imageFormat) throws IOException{ FileOutputStream fos = null; try { //获取源图片 BufferedImage image = ImageIO.read(new File(srcImagePath)); //根据xy点坐标绘制连接线 Graphics2D g2d = image.createGraphics(); g2d.setColor(lineColor); g2d.drawLine( x1, y1, x2, y2); fos = new FileOutputStream(toPath); ImageIO.write(image, imageFormat, fos); } catch (IOException e) { e.printStackTrace(); }finally{ if(fos!=null){ fos.close(); } } } /** * 画折线 / 线段 * ---- 2个点即画线段,多个点画折线 * @param srcImagePath 源图片路径 * @param xPoints x坐标数组 * @param yPoints y坐标数组 * @param nPoints 点的数量 * @param lineColor 线条颜色 * @param toPath 图像写入路径 * @param imageFormat 图片写入格式 * @throws IOException */ public void drawPolyline(String srcImagePath,int[] xPoints, int[] yPoints, int nPoints,Color lineColor,String toPath,String imageFormat) throws IOException{ FileOutputStream fos = null; try { //获取源图片 BufferedImage image = ImageIO.read(new File(srcImagePath)); //根据xy点坐标绘制连接线 Graphics2D g2d = image.createGraphics(); //设置线条颜色 g2d.setColor(lineColor); g2d.drawPolyline(xPoints, yPoints, nPoints); //图像写出路径 fos = new FileOutputStream(toPath); ImageIO.write(image, imageFormat, fos); } catch (IOException e) { e.printStackTrace(); }finally{ if(fos!=null){ fos.close(); } } } /** * 绘制折线,并突出显示转折点 * @param srcImagePath 源图片路径 * @param xPoints x坐标数组 * @param yPoints y坐标数组 * @param nPoints 点的数量 * @param lineColor 连线颜色 * @param width 点的宽度 * @param height 点的高度 * @param ovalColor 点的填充颜色 * @param toPath 图像写入路径 * @param imageFormat 图像写入格式 * @throws IOException */ public void drawPolylineShowPoints(String srcImagePath,int[] xPoints, int[] yPoints, int nPoints,Color lineColor,int width,int height,Color ovalColor,String toPath,String imageFormat) throws IOException{ FileOutputStream fos = null; try { //获取源图片 BufferedImage image = ImageIO.read(new File(srcImagePath)); //根据xy点坐标绘制连接线 Graphics2D g2d = image.createGraphics(); //设置线条颜色 g2d.setColor(lineColor); //画线条 g2d.drawPolyline(xPoints, yPoints, nPoints); //设置圆点颜色 g2d.setColor(ovalColor); //画圆点 if(xPoints != null){ for(int i=0;i<xPoints.length;i++){ int x = xPoints[i]; int y = yPoints[i]; g2d.fillOval(x, y, width, height); } } //图像写出路径 fos = new FileOutputStream(toPath); ImageIO.write(image, imageFormat, fos); } catch (IOException e) { e.printStackTrace(); }finally{ if(fos!=null){ fos.close(); } } } /** * 绘制一个由 x 和 y 坐标数组定义的闭合多边形 * @param srcImagePath 源图片路径 * @param xPoints x坐标数组 * @param yPoints y坐标数组 * @param nPoints 坐标点的个数 * @param polygonColor 线条颜色 * @param imageFormat 图像写入格式 * @param toPath 图像写入路径 * @throws IOException */ public void drawPolygon(String srcImagePath,int[] xPoints,int[] yPoints,int nPoints,Color polygonColor,String imageFormat,String toPath) throws IOException { FileOutputStream fos = null; try { //获取图片 BufferedImage image = ImageIO.read(new File(srcImagePath)); //根据xy点坐标绘制闭合多边形 Graphics2D g2d = image.createGraphics(); g2d.setColor(polygonColor); g2d.drawPolygon(xPoints, yPoints, nPoints); fos = new FileOutputStream(toPath); ImageIO.write(image, imageFormat, fos); g2d.dispose(); } catch (Exception e) { e.printStackTrace(); }finally{ if(fos!=null){ fos.close(); } } } /** * 绘制并填充多边形 * @param srcImagePath 源图像路径 * @param xPoints x坐标数组 * @param yPoints y坐标数组 * @param nPoints 坐标点个数 * @param polygonColor 多边形填充颜色 * @param alpha 多边形部分透明度 * @param imageFormat 写入图形格式 * @param toPath 写入图形路径 * @throws IOException */ public void drawAndAlphaPolygon(String srcImagePath,int[] xPoints,int[] yPoints,int nPoints,Color polygonColor,float alpha,String imageFormat,String toPath) throws IOException{ FileOutputStream fos = null; try { //获取图片 BufferedImage image = ImageIO.read(new File(srcImagePath)); //根据xy点坐标绘制闭合多边形 Graphics2D g2d = image.createGraphics(); g2d.setColor(polygonColor); //设置透明度 AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha); g2d.setComposite(ac); g2d.fillPolygon(xPoints, yPoints, nPoints); fos = new FileOutputStream(toPath); ImageIO.write(image, imageFormat, fos); g2d.dispose(); } catch (Exception e) { e.printStackTrace(); }finally{ if(fos!=null){ fos.close(); } } } public static void main(String[] args)throws Exception{ OperateImage imageObj = new OperateImage(); /*String srcPath = "D:/test/fileSource/004.jpg"; String toPath = "D:/test/desk/+e004.jpg"; int x = 200; int y = 300; int width = 300; int height = 200 ; String readImageFormat = "jpg"; String writeImageFormat = "jpg"*/; //imageObj.cropImage(srcPath, toPath, x, y, width, height,readImageFormat,writeImageFormat);//剪切图片 //imageObj.resizeImage(srcPath, toPath, 400, 400);//按指定的长宽重置图形大小 //imageObj.reduceImageByRatio(srcPath, toPath, 3, 3);//按指定长和宽的比例缩小图形 //imageObj.enlargementImageByRatio(srcPath, toPath, 2, 2);//按指定长和宽的比例放大图形 //imageObj.reduceImageEqualProportion(srcPath, toPath, 4);//长高等比例缩小 //imageObj.enlargementImageEqualProportion(srcPath, toPath, 2);//长高等比例放大 /* String negativeImagePath = "D:/test/fileSource/004.jpg"; String additionImagePath = "D:/test/fileSource/005.jpg"; int x = 200; int y = 200; String toPath = "D:/test/desk/004+005-rightcenter.jpg";*/ //imageObj.mergeBothImage(negativeImagePath, additionImagePath, x, y, toPath); //按指定坐标合并图片 //imageObj.mergeBothImageTopleftcorner(negativeImagePath, additionImagePath, toPath);//合并到左上角 //imageObj.mergeBothImageToprightcorner(negativeImagePath, additionImagePath, toPath);//合并到右上角 //imageObj.mergeBothImageLeftbottom(negativeImagePath, additionImagePath, toPath);//合并到左下角 //imageObj.mergeBothImageRightbottom(negativeImagePath, additionImagePath, toPath);//合并到右下角 //imageObj.mergeBothImageCenter(negativeImagePath, additionImagePath, toPath);//合并到正中央 //imageObj.mergeBothImageTopcenter(negativeImagePath, additionImagePath, toPath);//合并到上边中央 //imageObj.mergeBothImageBottomcenter(negativeImagePath, additionImagePath, toPath);//合并到下边中央 //imageObj.mergeBothImageLeftcenter(negativeImagePath, additionImagePath, toPath);//合并到左边中央 //imageObj.mergeBothImageRightcenter(negativeImagePath, additionImagePath, toPath);//合并到右边中央 /* String srcImage = "D:/test/fileSource/001.jpg"; String toPath = "D:/test/desk/001-gray.jpg"; String imageFormat = "jpg"; imageObj.grayImage(srcImage, toPath, imageFormat);//图片灰化 */ /* String firstSrcImagePath = "D:/test/desk/003.jpg"; String secondSrcImagePath = "D:/test/desk/004.jpg"; String imageFormat = "jpg"; String toPath = "D:/test/desk/003-004-join.jpg"; imageObj.joinImagesHorizontal(firstSrcImagePath, secondSrcImagePath, imageFormat, toPath);//横向拼接图片 */ /* String firstSrcImagePath = "D:/test/desk/001-002-join.jpg"; String secondSrcImagePath = "D:/test/desk/003-004-join.jpg"; String imageFormat = "jpg"; String toPath = "D:/test/desk/all-join.jpg"; imageObj.joinImagesVertical(firstSrcImagePath, secondSrcImagePath, imageFormat, toPath);//纵向拼接图片 */ /*String srcImagePath = "D:/test/fileSource/002.jpg"; int[] xPoints = {20,100,160,270,500}; int[] yPoints = {30,150,172,295,615}; int nPoints = 5; String toPath = "D:/test/desk/polygon-002.png"; imageObj.drawPolygon(srcImagePath, xPoints, yPoints, nPoints, Color.MAGENTA, "jpg", toPath); //根据坐标数组绘制多边形 */ /*String srcImagePath = "D:/test/fileSource/004.jpg"; String appendImagePath = "D:/test/fileSource/005.jpg"; float alpha = 0.2F; String font = "宋体"; int fontStyle = Font.PLAIN; int fontSize = 32; Color color = Color.RED; String inputWords = "图片上设置水印文字 ---- 宋体 普通字体 32号字 红色 透明度0.5"; int x = 20; int y = 40; String imageFormat = "jpg"; String toPath = "D:/test/desk/alphaI2I-001.png";*/ //imageObj.alphaWords2Image(srcImagePath, alpha, font, fontStyle, fontSize, color, inputWords, x, y, imageFormat, toPath); //设置文字水印 //imageObj.alphaImage2Image(srcImagePath, appendImagePath, alpha, x, y, 300, 200, imageFormat, toPath);//设置图片水印 /* String srcImagePath = "D:/test/fileSource/003.jpg"; int[] xPoints = {100,150,200,240,300}; int[] yPoints = {200,60,280,160,100}; int nPoints = 5; Color lineColor = Color.RED; String toPath = "D:/test/desk/polyline-003.jpg"; String imageFormat = "jpg"; imageObj.drawPolyline(srcImagePath, xPoints, yPoints, nPoints, lineColor,toPath, imageFormat);//画折线 */ /* int x1 = 50; int y1 = 100; int x2 = 600; int y2 = 150; Color lineColor = Color.BLUE; imageObj.drawLine(srcImagePath, x1, y1, x2, y2, lineColor,toPath, imageFormat);//画线段 */ /* String srcImagePath = "D:/test/fileSource/002.jpg"; int x = 400; int y = 500; int width = 10; int height = 10; Color ovalColor = Color.RED; String imageFormat = "jpg"; String toPath = "D:/test/desk/point-002.jpg"; imageObj.drawPoint(srcImagePath, x, y, width, height, ovalColor, imageFormat, toPath);//画一个圆点 */ /*List pointList = new ArrayList(); Point p1 = new Point(60,80); pointList.add(p1); Point p2 = new Point(160,80); pointList.add(p2); Point p3 = new Point(60,180); pointList.add(p3); Point p4 = new Point(260,180); pointList.add(p4); Point p5 = new Point(460,380); pointList.add(p5); String srcImagePath = "D:/test/fileSource/004.jpg"; int width = 10; int height = 10; Color ovalColor = Color.RED; String imageFormat = "jpg"; String toPath = "D:/test/desk/points-004.jpg"; imageObj.drawPoints(srcImagePath, pointList, width, height, ovalColor, imageFormat, toPath);//画出一组(多个)点 */ /* int[] xPoints = {50,100,180,400,600}; int[] yPoints = {200,100,160,300,640}; int nPoints = 5; Color lineColor = Color.PINK; String srcImagePath = "D:/test/fileSource/003.jpg"; String toPath = "D:/test/desk/showpoints-003.jpg"; imageObj.drawPolylineShowPoints(srcImagePath, xPoints, yPoints, nPoints, lineColor, width, height, ovalColor, toPath, imageFormat);//画折线并突出显示点 */ /* String srcImagePath ="D:/test/fileSource/004.jpg"; int[] xPoints ={50,90,180,320,640}; int[] yPoints ={200,300,120,240,360}; int nPoints = 5; Color polygonColor = Color.PINK; float alpha = (float) 0.2; String imageFormat ="jpg"; String toPath ="D:/test/desk/drawalpha-004.jpg"; imageObj.drawAndAlphaPolygon(srcImagePath, xPoints, yPoints, nPoints, polygonColor, alpha, imageFormat, toPath); */ /* String negativeImagePath = "D:/test/fileSource/001.jpg"; String additionImagePath = "D:/test/fileSource/006.png"; String toPath = "D:/test/fileSource/001.jpg"; long start = System.currentTimeMillis(); for(int i=0;i<1000;i++){ Random rand = new Random(); int x = rand.nextInt(1024); int y = rand.nextInt(768); imageObj.mergeBothImage(negativeImagePath, additionImagePath, x, y, toPath);//每次附加合并一张图片(循环若干次) } long end = System.currentTimeMillis(); System.out.println(end-start);*/ //100 -- 45844 //1000 -- 411156 /*改进思路:将mergeBothImage方法 修改为mergeImageList方法, 通过将图片的坐标点装入list容器,然后再取出一来在方法中一次性与图片合并, 不再每次都打开底图、保存合成图片,关闭流*/ //叠加组合图像 /*String negativeImagePath = "D:/test/fileSource/001.jpg"; String toPath = "D:/test/fileSource/001.jpg"; String additionImagePath = "D:/test/fileSource/007.png"; List additionImageList = new ArrayList(); int count = 0; for(int i=0;i<100;i++){//为什么总是连续生成一样的随机数??? Random rand = new Random(); int x = rand.nextInt(1020); String xStr = x+""; int y = rand.nextInt(760); String yStr = y +""; String[] str = {xStr,yStr,additionImagePath}; additionImageList.add(str); count++; //System.out.println(xStr+" : "+yStr); } System.out.println(count); long start = System.currentTimeMillis(); imageObj.mergeImageList(negativeImagePath, additionImageList,"jpg", toPath); long end = System.currentTimeMillis(); System.out.println(end-start);*/ // 第一次 第二次 第三次 //100张耗时(毫秒) --2003 1792 1869 1747 1871 1793 //1000张耗时(毫秒) --15334 15200 15236 15903 16028 15545 //10000张耗时(毫秒) --153010 153340 152673 154978 156506 154854 //如果list.size()<=100,则调用此方法, //如果list.size()>100,则调用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 }
相关推荐
在Java编程中,图片处理是一项常见的任务,而`ImageIO`类是Java标准库提供用于读取、写入和操作图像的重要工具。本篇将详细探讨`ImageIO.read()`方法的相关知识点,以及如何解决可能遇到的问题。 `ImageIO`类位于`...
在Java开发领域,图像处理是一项不可或缺的任务,而Java自带的ImageIO类库虽然基础功能完备,但在处理某些特定格式或者需要高级功能时,其能力显得较为有限。此时,第三方库如TwelveMonkeys ImageIO就显得尤为重要。...
javaImageIo实现图片内容动态修改
关于图片ImageIO操作工具类 java程序ImageIO处理图像的封装
在Java开发中,处理图像尤其是来自移动设备如iPhone的照片时,常常会遇到一些特定的问题,例如照片上传时的旋转问题。这是因为iOS设备在拍摄照片时可能会记录照片的元数据(Exif信息),其中包括照片的旋转角度,这...
在Java中,对图片进行压缩和处理是一项常见的任务,特别是在开发涉及到图像上传、展示或者存储的应用程序时。`ImageIO` 类是Java标准库中用于读取、写入和处理图像的重要工具,它提供了灵活且高效的图像处理功能。...
在Java编程环境中,图片处理是一项常见的任务,但有时可能会遇到“javax.imageio.IIOException: Unsupported Image Type”的错误。这个异常通常表示Java的`ImageIO`类库无法识别或支持所尝试读取或写入的图像格式。...
Java图像处理主要涉及Java Advanced Imaging (JAI) API和Java Image I/O (JIO) API。JAI API是Sun Microsystems开发的一个高级图像处理工具,它作为Java Media Framework的一部分,为Java 2D API提供了扩展,专门...
首先,Java提供了丰富的图像处理API,主要集中在`java.awt.image`和`javax.imageio`这两个包中。`java.awt.image`包包含了用于创建、修改和显示图像的各种类,如BufferedImage、Graphics2D等。而`javax.imageio`则...
在标签中,作者列出了四个关键词:“java 处理图片背景颜色”、“java 图片背景颜色替换”、“java 图片背景颜色更改”、“java 蓝底寸照批量转换为白底”,这些关键词都与 Java 处理图片背景颜色相关。 在部分内容...
Java在图像处理方面主要依赖于`java.awt.image`和`javax.imageio`这两个包,它们提供了基本的图像读取、写入、显示以及处理功能。`java.awt.image.BufferedImage`类是处理图像的核心,它允许我们创建、修改和保存...
总结来说,"Java识别图片文字相关jar包 jai_imageio-1.1.1+swingx-1.6.1+ocr-1.11"提供了Java环境下实现OCR功能的基本工具,包括图像处理、用户界面构建和文本识别。开发者可以利用这些库开发出功能完善的OCR应用...
1. **Java图像处理**:Java标准库中的`java.awt.image`和`javax.imageio`包提供了基本的图像处理功能。例如,`BufferedImage`类用于创建和操作图像,`Graphics2D`允许在图像上绘制和修改元素。此外,`ImageIO`类提供...
本项目主要涉及的是如何在Java环境中将图片转换为WebP格式,这是一种由Google开发的高效图像文件格式,旨在提供更好的压缩效率,同时保持图像质量。下面我们将深入探讨这个Java Maven项目中的关键技术点。 首先,...
2. **ImageIO类**: `javax.imageio.ImageIO` 类是Java中处理图像的核心工具,它提供了读取、写入和转换多种图像格式(如JPEG、PNG、GIF)的能力。例如,使用 `ImageIO.read()` 方法可以读取一个图像文件,`ImageIO....
Java图片处理类是Java编程语言中用于操作和处理图像文件的核心技术,主要涉及Java的AWT(Abstract Window Toolkit)和Swing库。在Java课程设计中,学生通常会被要求掌握这些概念并应用到实际项目中,例如创建一个...
在Java中,我们可以使用`java.awt.image.BufferedImage`类来处理图像。为了等比例缩放图片,我们需要获取原始图片的宽高比,然后根据目标尺寸计算出新的宽高。关键代码可能如下: ```java BufferedImage source =...
Java图像处理可以使用Java的图像处理类库,例如BufferedImage类、ImageIO类等。也可以使用OpenCV库,OpenCV库是一个开源的计算机视觉库,提供了图像处理、物体检测、人脸识别等功能。 6. Java图像处理的实例 下面...
在Java中,处理图像主要依赖于`java.awt`和`javax.imageio`这两个包。`java.awt`提供了基本的图形绘制和颜色处理功能,而`javax.imageio`则用于图像的输入/输出操作。下面,我们将深入探讨Java图像处理的一些关键...
在Java中,我们可以使用内置的`java.awt.image`和`javax.imageio`包来处理图像。这两个包提供了基础的图像处理功能,如读取、写入、显示和修改图像。`BufferedImage`类是Java中处理图像的主要类,它可以存储和操作...