1.要想制作图片裁剪功能,可以使用网上的裁剪工具JCrop,网址是:https://github.com/tapmodo/Jcrop/
案例效果如下:
2.引入JCrop的js代码,具体要引入那些js可以参考JCrop案例:
3.编写的html代码如下:
<div id="light" class="white_content"> <div class="vatitlee"> 封面截取 <div class="guan"> <a href="javascript:void(0)" onClick="document.getElementById('light').style.display='none';document.getElementById('fade').style.display='none'">X</a> </div> </div>
<div class="tailoringc"> <div class="tailoringl"> <img id="jcrop_target" src="<c:url value="/resources/cartoon2/images/images/banner7.jpg"/>" width="280" height="553" /> </div>
<div class="tailoringr" style='overflow: hidden;'> <img id="cutImgId" src="<c:url value="/resources/cartoon2/images/images/banner7.jpg"/>" width="280" height="553" /> </div>
<div class="clear"></div> </div> <div class="tailoringb"> <a class="button" href="javascript:void(0)" onclick="saveUploadImg()">裁剪</a> <a href="javascript:void(0)" class="button" onclick="document.getElementById('light').style.display='none';document.getElementById('fade').style.display='none'">取消</a> </div> </div> |
4编写JS代码(注意这里的280和175表示的是我要一张长为280px像素高175px像素的图片):
//封面上传,截图 //上传后返回的文件名 var filename; var fileid; //裁剪主要用到了jcrop_api var jcrop_api,boundx,boundy; //原始文件名称 var originalfilename; //实际图片的宽高 var imgweight,imgheight; //dx:实际图片宽/显示宽度 //dy: 实际图片高/显示高度 //scale:最终缩放比 // var dx,dy,scale = 1; // var displayW = 175, displayH = 350; var imgObj = new Image();
$(function() { init(); });
function init() { //文件上传的js组件(FileUpload的js组件) $('#uploadCover').fileupload({ dataType: 'json', //autoUpload: true, url:'/contentAffix/upTemp',
done: function (e, data) { if(jcrop_api!=null){ jcrop_api.destroy(); } $.each(data.result, function (index, file) { if(index=='filedesc') { //获取文件名称 filename=file.filename; //实际的文件高度 imgweight = file.imgweight; //实际的文件宽度 imgheight = file.imgheight;
// //设置缩放比例 // dx = imgweight / displayW; // dy = imgheight / displayH; // if(dx > dy && dy > 1) { // scale = dx; // // } // if(dy > dx && dx > 1) { // scale = dy; // } // // displayW = imgweight / scale; // displayH = imgheight / scale;
// $("#jcrop_target").css({ // width:displayW + 'px', // height:displayH + 'px' // }); // $(".tailoringc .tailoringl").css({ // width:(displayW + 2) + 'px', // height:(displayH + 2) + 'px' // });
originalfilename = file.originalfilename; fileid=file.id; $('#light').show(); $('#fade').show();
var imgurl = file.filepath+'/'+file.filename; $('#jcrop_target').attr('src',imgurl); $('#cutImgId').attr('src',imgurl);
cutPic(); //重新加载图像到jcrop,才能小图上正确显示截图位置 //jcrop_api.setImage(imgurl); } }); }, }); $("#pickCover").click(function () { $("#uploadCover").trigger('click'); });
$('body').data('filelist', new Array()); }
//点击裁剪时做的操作 //传递到后台的是最终在实际图片上的位置和宽高 function saveUploadImg(){ c = jcrop_api.tellSelect(); if (parseInt(c.w) > 0) { $.ajax({ url:'/cartoon-web/contentAffix/cutimageAndSaveAffix', data :{"pointx":Math.round(c.x * imgweight / 280),"pointy":Math.round(c.y * imgheight / 350),"pointw":Math.round(c.w * imgweight / 280),"pointh":Math.round(c.h * imgheight / 350),"filename":filename,"fileid":fileid,"originalfilename":originalfilename}, dataType:'json',
success: function(data){ if(data.result == "success"){ $("#fmimg").attr('src', data.cropImgPath+"?r="+new Date().getTime());
$('input[type=hidden][name=coverAffixId]').val(fileid);
$('#light').hide(); $('#fade').hide();
displayW = 280; displayH = 350; }else{ alert("请选择图片"); } } }); } }
//保存上传后的文件名称 function saveReuploadImg(){ c = jcrop_api.tellSelect(); var affixId = $('#coverAffixId').val(); $.ajax({ url:'/cartoon-web/contentAffix/cutimageAndUpdateAffix', data :{ "pointx":Math.round(c.x), "pointy":Math.round(c.y), "pointw":Math.round(c.w), "pointh":Math.round(c.h), "filename":filename, "fileid":fileid, "originalfilename":originalfilename, "affixId":affixId }, dataType:'json', success: function(data){ if(data.result == "success") { $("#fmimg").attr('src', data.cropImgPath+"?r="+new Date().getTime()); $('input[type=hidden][name=coverAffixId]').val(fileid); $('#light').hide(); $('#fade').hide(); }else{ alert("请选择图片"); } } }); }
//显示预览 function showPreview(c){ if (parseInt(c.w) > 0) {
var rx = 280 / c.w; var ry = 175 / c.h; var bounds = jcrop_api.getBounds(); boundx = bounds[0]; boundy = bounds[1];
$('#cutImgId').css({ width:Math.round(rx * boundx) + 'px', height:Math.round(ry * boundy) + 'px', marginLeft:'-' + Math.round(rx * c.x) + 'px', marginTop:'-' + Math.round(ry * c.y) + 'px', }); } }
function cutPic(){ imgObj = new Image(); imgObj.src = jcrop_target.src;
jcrop_api = $.Jcrop('#jcrop_target',{ onChange: showPreview,//选框改变时的事件 onSelect: showPreview,//选框选定时的事件 handleSize:1,//缩放按钮大小 drawBorders:false,//绘制边框 aspectRatio: 280/175,//选框宽高比。说明:width/height allowResize:true, allowSelect:false, //允许新选框 // bgColor:"#ccc", //背景色 // minSize: [50,50], // allowMove: true, // allowResize:false, // allowSelect:true, //允许新选框 // cornerHandles:false, //允许边角缩放 // sideHandles:false, //允许四边缩放 // handleSize:9, // drawBorders:true, //绘制边框 dragEdges:true, //允许拖动边框 // //bgOpacity:0.9, //透明度 // onChange:showPreview, //当选择区域变化的时候,执行对应的回调函数 // onSelect:showPreview, //当选中区域的时候,执行对应的回调函数 // aspectRatio:1, //正方形 //setSelect:[300,300,300,300,0,0] });
//设置选择框默认位置 jcrop_api.animateTo([0,0,280,175]); }; |
5 编写后端代码:
/** * 上传图片的临时目录,截图前的预览,不保存 * * @param param * @param imageFile * @return */ @ResponseBody @RequestMapping(value = "/upTemp", method = RequestMethod.POST, produces = "application/json") public Map<String, Object> upTemp(@RequestParam Map<String, String> param, @RequestParam("file") MultipartFile imageFile) {
Map<String, Object> result = new HashMap<String, Object>(); if (!imageFile.isEmpty()) {
Map<String, String> filedesc = new HashMap<String, String>();
String uuid = FileUtils.genFileName();// uuid形成的文件名称
String filename = uuid; try { // 新文件名 String uuIDFileName = uuid;
// 存放路径 String path = CommonVar.getLocalTempPath() + FileUtils.genFilePathCover(FilePathType.COVER); path = path.replace("\\", "/").replace("//", "/");
// 原文件名 String srcName = imageFile.getOriginalFilename();
// 新文件名 String newFileName = uuIDFileName + srcName.substring(srcName.indexOf("."));
// 保存文件路径(临时文件夹下) String saveURL = path + "/" + newFileName; LOGGER.debug(saveURL);
// 写文件 InputStream fi = imageFile.getInputStream(); FileUtils.writeFile(fi, saveURL);
// 等比缩图 zoomOutImg(saveURL); int[] imgWH = getImageWH(saveURL);
String webpath = CommonVar.getWebTempPath() + FileUtils.genFilePathCover(FilePathType.COVER); webpath = webpath.replace("\\", "/");
filedesc.put("id", uuid); // filedesc.put("filetype", "3"); filedesc.put("contenttype", imageFile.getContentType()); filedesc.put("name", filename);// uuid filedesc.put("filename", newFileName);// 有后缀 filedesc.put("originalfilename", imageFile.getOriginalFilename()); filedesc.put("filepath", webpath); filedesc.put("imgweight", imgWH[0] + ""); filedesc.put("imgheight", imgWH[1] + "");
result.put("filedesc", filedesc);
} catch (Exception e) { e.printStackTrace(); } } return result; } |
6 获取图片的宽高的代码:
private int[] getImageWH(String saveURL) { int[] imgWH = { 0, 0 }; try { BufferedImage bimg = operatorImage.getBufferedImage(saveURL); imgWH[0] = bimg.getWidth(); imgWH[1] = bimg.getHeight(); } catch (IOException e) { e.printStackTrace(); }
return imgWH; } |
7 压缩与等比缩放的代码:
private void zoomOutImg(String saveURL) throws IOException { int ratio = operatorImage.getImgRatio(saveURL, CommonVar.LOGO_SCALE); operatorImage.reduceImageEqualProportion(saveURL, saveURL, ratio); } |
8 操作图片资源的工具类:
package com.kuman.cartoon.utils;
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.File; import java.io.FileInputStream; import java.io.FileOutputStream; 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 org.springframework.stereotype.Service;
import com.kuman.cartoon.common.CommonVar;
//import com.sun.image.codec.jpeg.JPEGCodec; //import com.sun.image.codec.jpeg.JPEGImageEncoder;
@Service 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);
String formatName = toImagePath.substring(toImagePath .lastIndexOf(".") + 1);
ImageIO.write(tag, /* "GIF" */formatName /* format desired */, new File(toImagePath) /* target */); } catch (Exception e) { e.printStackTrace(); } finally { // if (out != null) { // out.close(); // } } }
/** * @param srcImgPath * @return * @throws IOException */ public BufferedImage getBufferedImage(String srcImgPath) throws IOException { File file = new File(srcImgPath); // 构造Image对象 return javax.imageio.ImageIO.read(file); }
/** * 获得图片获得缩小比例,根据图片长宽, * * @param srcImgPath * 原始图片路径 * @param scale * 需要的图片大小 * @return (int)(min(width,height)/scale) */ public int getImgRatio(String srcImgPath, float scale) {
int defaultScale = 1;
try { BufferedImage src = getBufferedImage(srcImgPath); int width = src.getWidth(); int height = src.getHeight();
int minV = width > height ? height : width;
// 向下取整 double v = Math.floor(minV / scale); defaultScale = (int) v;
} catch (IOException e) { e.printStackTrace(); return defaultScale; } defaultScale = (defaultScale == 0) ? 1 : defaultScale; return defaultScale; }
/** * 获得图片获得缩小比例,根据图片宽度与高度,宽度大于高度以宽为标准,宽度小于高度以高度为标准缩小或放大 * * @param srcImgPath * 原始图片路径 * @param scale * 需要的图片大小 * @return (int)(width/scale) */ public int getImgRatioByWidthAndHeight(String srcImgPath) {
int defaultScale = 1;
try { BufferedImage src = getBufferedImage(srcImgPath); int width = src.getWidth(); int height = src.getHeight();
float scale = width > height ? CommonVar.COVER_WIDTH_SCALE : CommonVar.COVER_HEIGHT_SCALE;
int minV = width > height ? width : height;
// 向下取整 double v = Math.floor(minV / scale); defaultScale = (int) v;
} catch (IOException e) { e.printStackTrace(); return defaultScale; } defaultScale = (defaultScale == 0) ? 1 : defaultScale; return defaultScale; }
/** * 长高等比例缩小图片 * * @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);
String formatName = toImagePath.substring(toImagePath .lastIndexOf(".") + 1);
ImageIO.write(tag, /* "GIF" */formatName /* format desired */, new File(toImagePath) /* target */); } 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);
String formatName = toImagePath.substring(toImagePath .lastIndexOf(".") + 1);
ImageIO.write(tag, /* "GIF" */formatName /* format desired */, new File(toImagePath) /* target */); } 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); String formatName = toImagePath.substring(toImagePath .lastIndexOf(".") + 1); ImageIO.write(tag, /* "GIF" */formatName /* format desired */, new File(toImagePath) /* target */); } 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);
String formatName = toImagePath.substring(toImagePath .lastIndexOf(".") + 1);
ImageIO.write(tag, /* "GIF" */formatName /* format desired */, new File(toImagePath) /* target */); } 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);
String formatName = toPath.substring(toPath.lastIndexOf(".") + 1);
ImageIO.write(image, /* "GIF" */formatName /* format desired */, new File(toPath) /* target */);
} 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);
String formatName = toPath.substring(toPath.lastIndexOf(".") + 1);
ImageIO.write(image, /* "GIF" */formatName /* format desired */, new File(toPath) /* target */); } 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); //
String formatName = toPath.substring(toPath.lastIndexOf(".") + 1);
ImageIO.write(image, /* "GIF" */formatName /* format desired */, new File(toPath) /* target */); } 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);
String formatName = toPath.substring(toPath.lastIndexOf(".") + 1);
ImageIO.write(image, /* "GIF" */formatName /* format desired */, new File(toPath) /* target */); } 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);
String formatName = toPath.substring(toPath.lastIndexOf(".") + 1);
ImageIO.write(image, /* "GIF" */formatName /* format desired */, new File(toPath) /* target */); } 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);
String formatName = toPath.substring(toPath.lastIndexOf(".") + 1);
ImageIO.write(image, /* "GIF" */formatName /* format desired */, new File(toPath) /* target */); } 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);
String formatName = toPath.substring(toPath.lastIndexOf(".") + 1);
ImageIO.write(image, /* "GIF" */formatName /* format desired */, new File(toPath) /* target */); } 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);
String formatName = toPath.substring(toPath.lastIndexOf(".") + 1);
ImageIO.write(image, /* "GIF" */formatName /* format desired */, new File(toPath) /* target */); } 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);
String formatName = toPath.substring(toPath.lastIndexOf(".") + 1);
ImageIO.write(image, /* "GIF" */formatName /* format desired */, new File(toPath) /* target */); } 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);
String formatName = toPath.substring(toPath.lastIndexOf(".") + 1);
ImageIO.write(image, /* "GIF" */formatName /* format desired */, new File(toPath) /* target */); } 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 = "G:/dm/pic/1.JPG"; String toPath = "G:/dm/pic/10.JPG"; // imageObj.reduceImageByRatio(srcPath, toPath, 2, 1);// 按指定长和宽的比例缩小图形 // int ratio = imageObj.getImgRatio(srcPath,180); imageObj.reduceImageEqualProportion(srcPath, toPath, 2); // imageObj.enlargementImageByRatio(srcPath, toPath, 2, 2);// // 按指定长和宽的比例放大图形 // imageObj.enlargementImageEqualProportion(srcPath, toPath, 2);// // 长高等比例放大 // imageObj.resizeImage(srcPath, toPath, 400, 400);// 按指定的长宽重置图形大小
// imageObj.mergeBothImage(negativeImagePath, additionImagePath, x, y, // toPath); //按指定坐标合并图片
/* * int x = 233; int y = 201; int width = 166; int height = 166 ; 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); */
} } |