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(widthheight){
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(widthh?(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程序设计有所帮助。