java实现图片缩放、旋转和马赛克化
程序员文章站
2022-06-11 12:08:32
本文是作者结合网上的一些资料封装的java图片处理类,支持图片的缩放,旋转,马赛克化。
不多说,上代码:
package deal;
import jav...
本文是作者结合网上的一些资料封装的java图片处理类,支持图片的缩放,旋转,马赛克化。
不多说,上代码:
package deal; import java.awt.color; import java.awt.graphics; import java.awt.graphics2d; import java.awt.image; import java.awt.geom.affinetransform; import java.awt.image.affinetransformop; import java.awt.image.bufferedimage; import java.io.file; import javax.imageio.imageio; /** * 图像处理类. * * @author nagsh * */ public class imagedeal { string openurl; // 原始图片打开路径 string saveurl; // 新图保存路径 string savename; // 新图名称 string suffix; // 新图类型 只支持gif,jpg,png public imagedeal(string openurl, string saveurl, string savename, string suffix) { this.openurl = openurl; this.savename = savename; this.saveurl = saveurl; this.suffix = suffix; } /** * 图片缩放. * * @param width * 需要的宽度 * @param height * 需要的高度 * @throws exception */ public void zoom(int width, int height) throws exception { double sx = 0.0; double sy = 0.0; file file = new file(openurl); if (!file.isfile()) { throw new exception("imagedeal>>>" + file + " 不是一个图片文件!"); } bufferedimage bi = imageio.read(file); // 读取该图片 // 计算x轴y轴缩放比例--如需等比例缩放,在调用之前确保参数width和height是等比例变化的 sx = (double) width / bi.getwidth(); sy = (double) height / bi.getheight(); affinetransformop op = new affinetransformop( affinetransform.getscaleinstance(sx, sy), null); file sf = new file(saveurl, savename + "." + suffix); image zoomimage = op.filter(bi, null); try { imageio.write((bufferedimage) zoomimage, suffix, sf); // 保存图片 } catch (exception e) { e.printstacktrace(); } } /** * 旋转 * * @param degree * 旋转角度 * @throws exception */ public void spin(int degree) throws exception { int swidth = 0; // 旋转后的宽度 int sheight = 0; // 旋转后的高度 int x; // 原点横坐标 int y; // 原点纵坐标 file file = new file(openurl); if (!file.isfile()) { throw new exception("imagedeal>>>" + file + " 不是一个图片文件!"); } bufferedimage bi = imageio.read(file); // 读取该图片 // 处理角度--确定旋转弧度 degree = degree % 360; if (degree < 0) degree = 360 + degree;// 将角度转换到0-360度之间 double theta = math.toradians(degree);// 将角度转为弧度 // 确定旋转后的宽和高 if (degree == 180 || degree == 0 || degree == 360) { swidth = bi.getwidth(); sheight = bi.getheight(); } else if (degree == 90 || degree == 270) { sheight = bi.getwidth(); swidth = bi.getheight(); } else { swidth = (int) (math.sqrt(bi.getwidth() * bi.getwidth() + bi.getheight() * bi.getheight())); sheight = (int) (math.sqrt(bi.getwidth() * bi.getwidth() + bi.getheight() * bi.getheight())); } x = (swidth / 2) - (bi.getwidth() / 2);// 确定原点坐标 y = (sheight / 2) - (bi.getheight() / 2); bufferedimage spinimage = new bufferedimage(swidth, sheight, bi.gettype()); // 设置图片背景颜色 graphics2d gs = (graphics2d) spinimage.getgraphics(); gs.setcolor(color.white); gs.fillrect(0, 0, swidth, sheight);// 以给定颜色绘制旋转后图片的背景 affinetransform at = new affinetransform(); at.rotate(theta, swidth / 2, sheight / 2);// 旋转图象 at.translate(x, y); affinetransformop op = new affinetransformop(at, affinetransformop.type_bicubic); spinimage = op.filter(bi, spinimage); file sf = new file(saveurl, savename + "." + suffix); imageio.write(spinimage, suffix, sf); // 保存图片 } /** * 马赛克化. * @param size 马赛克尺寸,即每个矩形的长宽 * @return * @throws exception */ public boolean mosaic(int size) throws exception { file file = new file(openurl); if (!file.isfile()) { throw new exception("imagedeal>>>" + file + " 不是一个图片文件!"); } bufferedimage bi = imageio.read(file); // 读取该图片 bufferedimage spinimage = new bufferedimage(bi.getwidth(), bi.getheight(), bi.type_int_rgb); if (bi.getwidth() < size || bi.getheight() < size || size <= 0) { // 马赛克格尺寸太大或太小 return false; } int xcount = 0; // 方向绘制个数 int ycount = 0; // y方向绘制个数 if (bi.getwidth() % size == 0) { xcount = bi.getwidth() / size; } else { xcount = bi.getwidth() / size + 1; } if (bi.getheight() % size == 0) { ycount = bi.getheight() / size; } else { ycount = bi.getheight() / size + 1; } int x = 0; //坐标 int y = 0; // 绘制马赛克(绘制矩形并填充颜色) graphics gs = spinimage.getgraphics(); for (int i = 0; i < xcount; i++) { for (int j = 0; j < ycount; j++) { //马赛克矩形格大小 int mwidth = size; int mheight = size; if(i==xcount-1){ //横向最后一个比较特殊,可能不够一个size mwidth = bi.getwidth()-x; } if(j == ycount-1){ //同理 mheight =bi.getheight()-y; } // 矩形颜色取中心像素点rgb值 int centerx = x; int centery = y; if (mwidth % 2 == 0) { centerx += mwidth / 2; } else { centerx += (mwidth - 1) / 2; } if (mheight % 2 == 0) { centery += mheight / 2; } else { centery += (mheight - 1) / 2; } color color = new color(bi.getrgb(centerx, centery)); gs.setcolor(color); gs.fillrect(x, y, mwidth, mheight); y = y + size;// 计算下一个矩形的y坐标 } y = 0;// 还原y坐标 x = x + size;// 计算x坐标 } gs.dispose(); file sf = new file(saveurl, savename + "." + suffix); imageio.write(spinimage, suffix, sf); // 保存图片 return true; } public static void main(string[] args) throws exception { imagedeal imagedeal = new imagedeal("e://1.jpg", "e://", "2", "jpg"); // 测试缩放 /* imagedeal.zoom(200, 300); */ // 测试旋转 /* imagedeal.spin(90); */ //测试马赛克 /*imagedeal.mosaic(4);*/ } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: spring mvc路径匹配原则详解
下一篇: jdk自带线程池实例详解