Java实现的微信图片处理工具类【裁剪,合并,等比例缩放等】
本文实例讲述了Java实现的微信图片处理工具类。分享给大家供大家参考,具体如下:
现在外面核心,图片文章比较少,看了拷贝代码,而用不了,用相应jar包处理,很多等比例缩放,达不到想要的给予的期望:本工具类,是之前做微信打印机写的基于java自带的类,基于rgb。
packagecom.zjpz.util; importjava.awt.Color; importjava.awt.Graphics; importjava.awt.Graphics2D; importjava.awt.RenderingHints; importjava.awt.geom.AffineTransform; importjava.awt.image.BufferedImage; importjava.awt.image.ColorModel; importjava.awt.image.WritableRaster; importjava.io.File; importjava.io.IOException; importjavax.imageio.ImageIO; importorg.slf4j.Logger; importorg.slf4j.LoggerFactory; /** *微信图片处理工具 * *@authorzhuang.y * */ publicclassPictureTool{ protectedstaticLoggerlogger=LoggerFactory.getLogger(PictureTool.class); publicstaticvoidmain(String[]args)throwsIOException{ FilefileOne=newFile("c:\\1.jpg"); BufferedImageimageFirst=ImageIO.read(fileOne); intborder=0; imageFirst=crop(imageFirst,0,10,297,300); FileoutFile=newFile("d:\\2.jpg"); ImageIO.write(imageFirst,"jpg",outFile);//写图片 } /** *纵向合图的x坐标像素 */ privatefinalstaticinty_width=645; /** *标准图片的y坐标像素,920,是一般照片,1099是邮票照片 */ privatefinalstaticinty_height=920; /** *裁剪x坐标缩进像素 */ privatefinalstaticintx_retract=50; /** *裁剪y坐标缩进像素 */ privatefinalstaticinty_retract=50; /** *系统默认图片边框为20 */ publicfinalstaticintBORDER=20; /** *横向合成图片 */ publicstaticvoidxPic(Stringfirst,Stringsecond,Stringout){ try{ /*1读取第一张图片*/ FilefileOne=newFile(first); BufferedImageimageFirst=ImageIO.read(fileOne); intwidth=imageFirst.getWidth();//图片宽度 intheight=imageFirst.getHeight();//图片高度 int[]imageArrayFirst=newint[width*height];//从图片中读取RGB imageArrayFirst=imageFirst.getRGB(0,0,width,height,imageArrayFirst,0,width); /*1对第二张图片做相同的处理*/ FilefileTwo=newFile(second); BufferedImageimageSecond=ImageIO.read(fileTwo); intwidthTwo=imageSecond.getWidth();//图片宽度 intheightTwo=imageSecond.getHeight();//图片高度 int[]imageArraySecond=newint[widthTwo*heightTwo]; imageArraySecond=imageSecond.getRGB(0,0,widthTwo,heightTwo,imageArraySecond,0,widthTwo); inth=height; if(heightheight){ imageFirst=rotateImageLeft90(imageFirst); } //等比缩放 imageFirst=resize(imageFirst,y_width,t_height); //缩放后图片的大小 width=imageFirst.getWidth();//图片宽度 height=imageFirst.getHeight();//图片高度 //等比缩放后,图片还是太大,裁剪图片 booleana_w,a_h=false; if((a_w=(width>y_width))||(a_h=(height>t_height))){ //起始位置x,y坐标 ints_w=0,s_h=0; //裁剪x坐标时,缩进属性x_retract if(a_w){ inttemp=width-y_width; if(temp>x_retract){ temp=x_retract; }else{ temp=0; } s_w=s_w+temp; } //裁剪y坐标时,缩进属性y_retract if(a_h){ inttemp=height-t_height; if(temp>y_retract){ temp=y_retract; }else{ temp=0; } s_h=s_h+temp; } imageFirst=crop(imageFirst,s_w,s_h,y_width,t_height); width=imageFirst.getWidth(); height=imageFirst.getHeight(); } int[]imageArrayFirst=newint[(width-border)*height];//从图片中读取RGB imageArrayFirst=imageFirst.getRGB(border,0,(width-border),height,imageArrayFirst,0, (width-border)); /*2对第二张图片做相同的处理begin*/ int[]imageArraySecond=newint[widthTwo*heightTwo]; imageArraySecond=imageSecond.getRGB(0,0,widthTwo,heightTwo,imageArraySecond,0,widthTwo); intw=width; if(width height){ imageFirst=rotateImageLeft90(imageFirst); } //等比缩放 imageFirst=resize(imageFirst,y_width,y_height); //缩放后图片的大小 width=imageFirst.getWidth();//图片宽度 height=imageFirst.getHeight();//图片高度 //等比缩放后,图片还是太大,裁剪图片 booleana_w,a_h=false; if((a_w=(width>y_width))||(a_h=(height>y_height))){ //起始位置x,y坐标 ints_w=0,s_h=0; //裁剪x坐标时,缩进属性x_retract if(a_w){ inttemp=width-y_width; if(temp>x_retract){ temp=x_retract; }else{ temp=0; } s_w=s_w+temp; } //裁剪y坐标时,缩进属性y_retract if(a_h){ inttemp=height-y_height; if(temp>y_retract){ temp=y_retract; }else{ temp=0; } s_h=s_h+temp; } imageFirst=crop(imageFirst,s_w,s_h,y_width,y_height); width=imageFirst.getWidth(); height=imageFirst.getHeight(); } int[]imageArrayFirst=newint[(width-border)*height];//从图片中读取RGB imageArrayFirst=imageFirst.getRGB(border,0,(width-border),height,imageArrayFirst,0, (width-border)); //生成新图片 BufferedImageimageResult=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB); //解决黑色背景,默认的TYPE_INT_RGB都是0,都是黑色的 Graphics2Dg=(Graphics2D)imageResult.createGraphics(); g.setColor(Color.WHITE); g.fillRect(0,0,width,height);//填充整个屏幕 g.dispose(); //留边框 imageResult.setRGB(border,0,(width-border*2),height,imageArrayFirst,0,(width-border));//设置左半部分的RGB FileoutFile=newFile(out); ImageIO.write(imageResult,"jpg",outFile);//写图片 }catch(IOExceptione){ logger.error("全图打印,图片缩放、旋转处理失败....",e); isOk=false; } returnisOk; } /** *实现图像的等比缩放 * *@paramsource *待处理的图片流 *@paramtargetW *宽度 *@paramtargetH *高度 *@return */ publicstaticBufferedImageresize(BufferedImagesource,inttargetW,inttargetH){ intwidth=source.getWidth();//图片宽度 intheight=source.getHeight();//图片高度 returnzoomInImage(source,targetW,targetH); //图片宽高都太小时,强制放大图片 /* if(width h?(w-h)/2:(h-w)/2)); graphics2d.drawImage(bufferedimage,0,0,null); graphics2d.dispose(); returnimg; } /** *图片左转90度 * *@parambufferedimage *@return */ publicstaticBufferedImagerotateImageLeft90(BufferedImagebufferedimage){ intw=bufferedimage.getWidth(); inth=bufferedimage.getHeight(); inttype=bufferedimage.getColorModel().getTransparency(); BufferedImageimg; Graphics2Dgraphics2d; (graphics2d=(img=newBufferedImage(h,w,type)).createGraphics()).setRenderingHint( RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR); graphics2d.rotate(Math.toRadians(270),w/2,h/2+(w-h)/2); graphics2d.drawImage(bufferedimage,0,0,null); graphics2d.dispose(); returnimg; } /** *图片右转90度 * *@parambufferedimage *@return */ publicstaticBufferedImagerotateImageRight90(BufferedImagebufferedimage){ intw=bufferedimage.getWidth(); inth=bufferedimage.getHeight(); inttype=bufferedimage.getColorModel().getTransparency(); BufferedImageimg; Graphics2Dgraphics2d; (graphics2d=(img=newBufferedImage(h,w,type)).createGraphics()).setRenderingHint( RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR); graphics2d.rotate(Math.toRadians(90),w/2-(w-h)/2,h/2); graphics2d.drawImage(bufferedimage,0,0,null); graphics2d.dispose(); returnimg; } //对转 publicFilerotateImageOppo(Filefile)throwsException{ BufferedImagebufferedimage=ImageIO.read(file); intw=bufferedimage.getWidth(); inth=bufferedimage.getHeight(); inttype=bufferedimage.getColorModel().getTransparency(); BufferedImageimg; Graphics2Dgraphics2d; (graphics2d=(img=newBufferedImage(w,h,type)).createGraphics()).setRenderingHint( RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR); graphics2d.rotate(Math.toRadians(180),w/2,h/2); graphics2d.drawImage(bufferedimage,0,0,null); graphics2d.dispose(); ImageIO.write(img,"jpg",file); returnfile; } /*** *图片镜像处理 * *@paramfile *@paramFX *0为上下反转1为左右反转 *@return */ publicvoidimageMisro(Filefile,intFX){ try{ BufferedImagebufferedimage=ImageIO.read(file); intw=bufferedimage.getWidth(); inth=bufferedimage.getHeight(); int[][]datas=newint[w][h]; for(inti=0;i 更多java相关内容感兴趣的读者可查看本站专题:《Java图片操作技巧汇总》、《java日期与时间操作技巧汇总》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》及《Java数据结构与算法教程》。
希望本文所述对大家java程序设计有所帮助。