java处理图片–图片的缩放,旋转和马赛克化详解编程语言

这是我自己结合网上的一些资料封装的java图片处理类,支持图片的缩放,旋转,马赛克化。(转载请注明出处:
http://blog.csdn.net/u012116457)

不多说,上代码:

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);*/ 
    } 
 
}

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/10518.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论