• 图片旋转和马赛克


    package img;
    
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.geom.AffineTransform;
    import java.awt.image.AffineTransformOp;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import javax.imageio.ImageIO;
    
    /**
     * 测试图片旋转和马赛克
     */
    public class TurnAndMasaike {
        public static void main(String[] args) throws Exception {  
            File file= new File("D:\test\map.jpg"); 
            File destFile = new File("D:\test\ggfgfgfgs.jpg");
            /*测试旋转*/
            spin(file, 90, destFile);
            /*测试马赛克*/
            //mosaic(file, 10, destFile);
        }
        
        /**
         * 旋转
         */
        public static void spin(File file, int degree, File destFile) throws Exception {
            int swidth = 0; // 旋转后的宽度
            int sheight = 0; // 旋转后的高度
            int x; // 原点横坐标
            int y; // 原点纵坐标
    
            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);
            ImageIO.write(spinImage, "jpg", destFile);  
        }
        
        /**
         * 马赛克化.
         * @param size  马赛克尺寸,即每个矩形的长宽
         * @return
         * @throws Exception
         */
        public static boolean mosaic(File file, int size, File destFile) throws Exception {
            if (!file.isFile()) {
                throw new Exception("ImageDeal>>>" + file + " 不是一个图片文件!");
            }
            BufferedImage bi = ImageIO.read(file); // 读取该图片
            @SuppressWarnings("static-access")
            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; // x方向绘制个数
            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();
            ImageIO.write(spinImage, "jpg", destFile); // 保存图片
            return true;
        }
    }
  • 相关阅读:
    [九、完整项目]31演示用户档案六个功能页面的使用
    [一、基础语法]3ObjectiveC语言的简介
    [一、基础语法]4创建和使用一个最简单的ObjectiveC类
    [一、基础语法]2解析第一个ObjectiveC程序的结构
    [一、基础语法]7基础数据类型之间的转换
    [一、基础语法]1使用模版创建一个空白的Command Line Tool
    [九、完整项目]28完成会员订阅页面的创建
    [一、基础语法]5ObjectiveC语言的基本语法
    [一、基础语法]6ObjectiveC语言的数据类型
    Umi 4 RC 发布
  • 原文地址:https://www.cnblogs.com/xieegai/p/8438775.html
Copyright © 2020-2023  润新知