package com.wtsrui.utils;
import java.awt.Color;  
import sun.misc.BASE64Encoder;
import java.awt.Graphics2D;  
import java.awt.Image;  
import java.awt.RenderingHints;  
import java.awt.geom.Ellipse2D;  
import java.awt.image.BufferedImage;  
import java.io.File;  
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;  
import java.net.MalformedURLException;  
import java.net.ProtocolException;  
import java.net.URL;  
 
import javax.imageio.ImageIO;

import com.wtsrui.dao.BSONObject;
import com.wtsrui.dao.Bmob;
import com.wtsrui.test.TestDemo;  
import sun.misc.BASE64Decoder;
public class ToCirclePicture{  
    public static void main1(String[] args) {  
        
        try {  
            
            // 是头像地址  
            // 获取图片的流  
            法一:
             BufferedImage url =  
           getUrlByBufferedImage("某云端自动生成的图片地址");  
            
            法二:获取磁盘上的图片
                    /* BufferedImage src=*/
                    // ImageIO.read(new File("c://20.jpg"));
             int min;//若是长方形图片则按照边短的去裁剪成圆,如果没有这个就会变成椭圆
             if(url.getWidth()>url.getHeight()){
                 min=url.getHeight();
             }else{
                 min=url.getWidth();
             }
        // BufferedImage url = (BufferedImage) src;  
            // 处理图片将其压缩成正方形的小图  
            BufferedImage convertImage = scaleByPercentage(url,100,100);  
            // 裁剪成圆形 (传入的图像必须是正方形的 才会 圆形 如果是长方形的比例则会变成椭圆的)  
            convertImage = convertCircular(url,min);  
            // 生成的图片位置  
            String imagePath = "Imag.png";  
           //File file = new File(imagePath);
            ImageIO.write(convertImage, imagePath.substring(imagePath.lastIndexOf(".") + 1), new File(imagePath));  
            TestDemo.initBmob();
            Bmob.uploadFile(imagePath);
            
            System.out.println("ok");  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
 
    /**
     * 缩小Image,此方法返回源图像按给定宽度、高度限制下缩放后的图像
     *  
     * @param inputImage
     * @param maxWidth
     *            :压缩后宽度
     * @param maxHeight
     *            :压缩后高度
     * @throws java.io.IOException
     *             return
     */  
    public static BufferedImage scaleByPercentage(BufferedImage inputImage, int newWidth, int newHeight) throws Exception {  
        // 获取原始图像透明度类型  
        int type = inputImage.getColorModel().getTransparency();  
        int width = inputImage.getWidth();  
        int height = inputImage.getHeight();  
        // 开启抗锯齿  
        RenderingHints renderingHints = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);  
        // 使用高质量压缩  
        renderingHints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);  
        BufferedImage img = new BufferedImage(newWidth, newHeight, type);  
        Graphics2D graphics2d = img.createGraphics();  
       // graphics2d.setRenderingHints(renderingHints);  
        graphics2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);  
        graphics2d.drawImage(inputImage, 0, 0, newWidth, newHeight, 0, 0, width, height, null);  
        graphics2d.dispose();  
        return img;  
    }  
 
    /**
     * 通过网络获取图片
     *  
     * @param url
     * @return
     */  
    public static BufferedImage getUrlByBufferedImage(String url) {  
        try {  
            URL urlObj = new URL(url);  
            HttpURLConnection conn = (HttpURLConnection) urlObj.openConnection();  
            // 连接超时  
            conn.setDoInput(true);  
            conn.setDoOutput(true);  
            conn.setConnectTimeout(25000);  
            // 读取超时 --服务器响应比较慢,增大时间  
            conn.setReadTimeout(25000);  
            conn.setRequestMethod("GET");  
            conn.addRequestProperty("Accept-Language", "zh-cn");  
            conn.addRequestProperty("Content-type", "image/jpeg");  
            conn.addRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727)");  
            conn.connect();  
            BufferedImage bufImg = ImageIO.read(conn.getInputStream());  
            conn.disconnect();  
            return bufImg;  
        } catch (MalformedURLException e) {  
            e.printStackTrace();  
        } catch (ProtocolException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        return null;  
    }  
 
    /**
     * 传入的图像必须是正方形的 才会 圆形 如果是长方形的比例则会变成椭圆的
     *  
     * @param url
     *            用户头像地址
     * @return
     * @throws IOException
     */  
    public static BufferedImage convertCircular(BufferedImage bi1,int min) throws IOException {  
          
//      BufferedImage bi1 = ImageIO.read(new File(url));  
          
        // 这种是黑色底的  
//      BufferedImage bi2 = new BufferedImage(bi1.getWidth(), bi1.getHeight(), BufferedImage.TYPE_INT_RGB);  
 
        // 透明底的图片  
        BufferedImage bi2 = new BufferedImage(min, min, BufferedImage.TYPE_4BYTE_ABGR);  
        Ellipse2D.Double shape = new Ellipse2D.Double(0, 0,min,min);  
        Graphics2D g2 = bi2.createGraphics();  
        g2.setClip(shape);  
        // 使用 setRenderingHint 设置抗锯齿  
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.drawImage(bi1, 0, 0, null);  
        // 设置颜色  
        g2.setBackground(Color.green);  
        g2.dispose();  
        return bi2;  
    }  
    public static String getBase64(String str){
        byte[] b=null;
        String s=null;
        try {
            b = str.getBytes("utf-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        if(b!=null){
            s=new BASE64Encoder().encode(b);
        }
        return s;
    }
}

不涉及框架纯java实现将图片裁成圆形的更多相关文章

  1. Java实现把图片转成字符画

    1,先看效果图:

  2. java将白色背景图片转换成无色

    package com.cxf.dao; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.Buffer ...

  3. java将白色背景图片转换成透明图片

    package evecom.image; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.Buffe ...

  4. GDI+ 如何将图片绘制成圆形的图片

    大概意思就是不生成新的图片,而是将图片转换为圆形图片. 实现代码如下: private Image CutEllipse(Image img, Rectangle rec, Size size) { ...

  5. 微信小程序canvas把正方形图片绘制成圆形

    wxml代码: <view class="result-page"> <canvas canvas-id='firstCanvas' style='width:1 ...

  6. GDI+ 怎样将图片绘制成圆形的图片

    大概意思就是不生成新的图片,而是将图片转换为圆形图片. 实现代码例如以下: private Image CutEllipse(Image img, Rectangle rec, Size size) ...

  7. C#实现将图片设置成圆形形式显示

    首先在Form中添加一个控件,然后将控件的背景BackColor设置成透明 . 然后分别设置控件的Image: Image image = Image.FromFile(UserLoginInfor. ...

  8. 微信小程序裁剪图片成圆形

    代码地址如下:http://www.demodashi.com/demo/14453.html 前言 最近在开发小程序,产品经理提了一个需求,要求微信小程序换头像,用户剪裁图片必须是圆形,也在gith ...

  9. 微信小程序之裁剪图片成圆形

    前言 最近在开发小程序,产品经理提了一个需求,要求微信小程序换头像,用户剪裁图片必须是圆形,也在github上看了一些例子,一般剪裁图片用的都是方形,所以自己打算写一个小组件,可以把图片剪裁成圆形,主 ...

随机推荐

  1. springboot系列十五、springboot集成PageHelper

    一.介绍 项目中经常会遇到分页,PageHelper为我们解决了这个问题.本质上实现了Mybatis的拦截器,作了分页处理. 二.配置PageHelper 1.引入依赖 pagehelper-spri ...

  2. OneNET麒麟座应用开发之三:获取温湿度数据

    对于大气环境监测来说温湿度也是重要的指标.原本计划使用SHT15来采集温湿度数据,不过在OneNET麒麟开发板上,我们发现已经集成有SHT20温湿度传感器,于是我们就使用它了.如下图的红框处: 我们还 ...

  3. Innodb引擎下mysql自身配置优化

    1.简单介绍InnoDB给MySQL提供了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎.InnoDB锁定在行级并且也在SELECT语句提供一个Oracle风格一致的非锁定读.这些特色 ...

  4. python 全栈开发,Day95(RESTful API介绍,基于Django实现RESTful API,DRF 序列化)

    昨日内容回顾 1. rest framework serializer(序列化)的简单使用 QuerySet([ obj, obj, obj]) --> JSON格式数据 0. 安装和导入: p ...

  5. python 全栈开发,Day44(IO模型介绍,阻塞IO,非阻塞IO,多路复用IO,异步IO,IO模型比较分析,selectors模块,垃圾回收机制)

    昨日内容回顾 协程实际上是一个线程,执行了多个任务,遇到IO就切换 切换,可以使用yield,greenlet 遇到IO gevent: 检测到IO,能够使用greenlet实现自动切换,规避了IO阻 ...

  6. this和super不能同时出现在构造方法中

    package com.bjpowernode.t02inheritance.c09; /* * 使用super调用父类的构造方法 */public class TestSuper02 { publi ...

  7. poj 1631 最多能有多少条不交叉的线 最大非降子序列 (LIS)

    左边的数字是1 2 3 4 5.... 右边的数字 第一个输入的和1连 第2个输入的和2连 右边再按从小到大排序 要求连线不能交叉 问最多能有多少条不交叉的线 假如右边有5个1 那么答案会是5 所以是 ...

  8. python算法双指针问题:使用列表和数组模拟单链表

    这个很多基础算法,python已内部实现了. 所以,要想自己实现链表这些功能时, 反而需要自己来构造链表的数据结构. 当然,这是python灵活之处, 也是python性能表达不如意的来源. valu ...

  9. POJ 3579 3685(二分-查找第k大的值)

    POJ 3579 题意 双重二分搜索:对列数X计算∣Xi – Xj∣组成新数列的中位数 思路 对X排序后,与X_i的差大于mid(也就是某个数大于X_i + mid)的那些数的个数如果小于N / 2的 ...

  10. thinkphp中AJAX返回ajaxReturn()方法分析

    本文分析了thinkphp中AJAX返回ajaxReturn()方法.分享给大家供大家参考,具体如下: 系统支持任何的AJAX类库,Action类提供了ajaxReturn方法用于AJAX调用后返回数 ...