BufferedImage转换InputStream,二维码生成,并上传oss。

来源:互联网 发布:api原油库存数据下载 编辑:程序博客网 时间:2024/05/17 04:38
package cnxiaov.util;

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.Ellipse2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Hashtable;

import javax.imageio.ImageIO;
import javax.imageio.stream.ImageOutputStream;

import org.apache.log4j.Logger;

import com.aliyun.oss.OSSClient;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

public class QrCodeUtil {
    
    
    /**
     * 二维码图片的生成
     * @param content           链接
     * @param qrcode_width      二维码宽
     * @param qrcode_height     二维码高
     * @return
     * @throws Exception
     */  
    public static BufferedImage createImage(String content, int qrcode_width, int qrcode_height) throws Exception {  
        
        Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();  
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);  
        hints.put(EncodeHintType.CHARACTER_SET, "utf-8");  
        hints.put(EncodeHintType.MARGIN, 0);
        BitMatrix bitMatrix = new MultiFormatWriter().encode(content,  
                BarcodeFormat.QR_CODE, qrcode_width, qrcode_height, hints);
        int width = bitMatrix.getWidth();  
        int height = bitMatrix.getHeight();  
        BufferedImage image = new BufferedImage(width, height,  
                BufferedImage.TYPE_INT_RGB);
        /*背景色,默认黑色   0xFF000000*/  
        /*前景色,默认白色  0xFFFFFFFF*/
        /*前景色,默认黄色  0xFFffe400*/
        for (int x = 0; x < width; x++) {  
            for (int y = 0; y < height; y++) {  
                image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000  
                        : 0xFFffe400);  
            }  
        }  
        return image;
        
    }
    
    // 从服务器获得一个输入流(本例是指从服务器获得一个image输入流)
    public static InputStream getInputStream(String URL_PATH) {
        InputStream inputStream = null;
        HttpURLConnection httpURLConnection = null;
        try {
            URL url = new URL(URL_PATH);
            httpURLConnection = (HttpURLConnection) url.openConnection();
            // 设置网络连接超时时间
            httpURLConnection.setConnectTimeout(3000);
            // 设置应用程序要从网络连接读取数据
            httpURLConnection.setDoInput(true);
        
            httpURLConnection.setRequestMethod("GET");
            int responseCode = httpURLConnection.getResponseCode();
            if (responseCode == 200) {
                // 从服务器返回一个输入流
                inputStream = httpURLConnection.getInputStream();
            }
        }catch (MalformedURLException e) {
            e.printStackTrace();
            } catch (IOException e) {
            e.printStackTrace();
        }
        return inputStream;
    }
    
    /**
     * 缩小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.drawImage(inputImage, 0, 0, newWidth, newHeight, 0, 0, width, height, null);  
        graphics2d.dispose();  
        return img;  
    }  
    
    /**
     * 变为圆形
     * 传入的图像必须是正方形的 才会 圆形  如果是长方形的比例则会变成椭圆的
     * @param bi1 用户头像
     * @return
     * @throws IOException
     */  
    public static BufferedImage convertCircular(BufferedImage bi1) throws IOException{  
       //这种是黑色底的  
       //BufferedImage bi2 = new BufferedImage(bi1.getWidth(),bi1.getHeight(),BufferedImage.TYPE_INT_RGB);   
       
       //透明底的图片  
       BufferedImage bi2 = new BufferedImage(bi1.getWidth(),bi1.getHeight(),BufferedImage.TYPE_4BYTE_ABGR);   
       
       Ellipse2D.Double shape = new Ellipse2D.Double(0,0,bi1.getWidth(),bi1.getHeight());  
       Graphics2D g = bi2.createGraphics();  
       g.setClip(shape);  
       // 使用 setRenderingHint 设置抗锯齿
       // 设置“抗锯齿”的属性  
       g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);  
       g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
       
       g.drawImage(bi1,0,0,null);   
       g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP));
       //设置颜色  
       g.setBackground(Color.WHITE);  
       g.dispose();  
       return bi2;  
    }
    
    /**
     * 指定位置合并图片
     * @param imgNew
     * @param x 相对背景图片的X轴
     * @param y 相对背景图片的Y轴
     * @return
     */
    public static BufferedImage compositeTwoImg(BufferedImage imgNew,int x,int y) {  
        
        try {  
            
            BufferedImage headImage = imgNew;
            
            InputStream inputStream = getInputStream("http://xiaovapppic.xiaovka.com/ein/tinymall/sao/1104.jpg");
            BufferedImage back = ImageIO.read(inputStream);
            // 画图  
            Graphics2D g = back.createGraphics();  
            g.setColor(Color.black);
            
            //画二维码
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,0.9f));
            g.drawImage(headImage, 558, 210, 100, 100, null);
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,1f));
            
            g.dispose();
            back.flush();
            
            return back;  
        } catch (Exception e) {  
            e.printStackTrace();  
            return null;  
        }
    }
    
    
    
    public static BufferedImage compositeImage(String url, int startX, int startY, int codeWidth, int codeHeight) {  
        try {  
            // 二维码图片
            BufferedImage headImage = createImage(url,500, 500);  
            
            BufferedImage compositeTwoImg = compositeTwoImg(headImage,startX,startY);
            
            return compositeTwoImg;  
        } catch (Exception e) {  
            e.printStackTrace();
            return null;  
        }  
    }
    
    //    测试代码,线上注释掉
    public static void main(String[] args) throws Exception {
        
//        String path1 = "C:\\image\\Downloads\\";
//        String formatName = "12.png";
        String url = "https:www.baidu.com";
        BufferedImage compositeImage = compositeImage(url,0,0,0,0);
//        BufferedImage compositeImage = createImage(url,500,500);
        
//        ImageIO.write(compositeImage, "png", new File(path1+formatName));
        
        ByteArrayOutputStream bs = new ByteArrayOutputStream();  
        ImageOutputStream imOut = ImageIO.createImageOutputStream(bs);
        ImageIO.write(compositeImage, "png", imOut);  
        InputStream is = new ByteArrayInputStream(bs.toByteArray());
        
        Integer available = is.available();
        Long size = available.longValue();
        
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        String fileName = sdf.format(new Date())+"001";
        //初始化OSSClient  
        OSSClient ossClient=AliyunOSSClientUtil.getOSSClient();  
        String md5key = AliyunOSSClientUtil.uploadObject2OSS(ossClient,is,fileName+".png",size,OSSClientConstants.BACKET_NAME,OSSClientConstants.FOLDER);
        Logger.getLogger(QrCodeUtil.class).info("上传后的文件MD5数字唯一签名:" + md5key);
        System.out.println("图片链接:"+OSSClientConstants.IMAGE_URL+fileName+".png");
    }

}



package cnxiaov.util;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

import org.apache.log4j.Logger;

import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.Bucket;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectResult;

/**
 * java使用阿里云OSS存储对象上传图片
 *
 */
public class AliyunOSSClientUtil {
    
    //log日志  
    private static Logger logger = Logger.getLogger(AliyunOSSClientUtil.class);  
    //阿里云API的内或外网域名  
    private static String ENDPOINT;  
    //阿里云API的密钥Access Key ID  
    private static String ACCESS_KEY_ID;  
    //阿里云API的密钥Access Key Secret  
    private static String ACCESS_KEY_SECRET;  
    //阿里云API的bucket名称  
    private static String BACKET_NAME;  
    //阿里云API的文件夹名称  
    private static String FOLDER;  
    //初始化属性  
    static{  
        ENDPOINT = OSSClientConstants.ENDPOINT;  
        ACCESS_KEY_ID = OSSClientConstants.ACCESS_KEY_ID;  
        ACCESS_KEY_SECRET = OSSClientConstants.ACCESS_KEY_SECRET;  
        BACKET_NAME = OSSClientConstants.BACKET_NAME;  
        FOLDER = OSSClientConstants.FOLDER;  
    }
    
    /**
     * 获取阿里云OSS客户端对象
     * @return ossClient
     */  
    public static  OSSClient getOSSClient(){  
        return new OSSClient(ENDPOINT,ACCESS_KEY_ID, ACCESS_KEY_SECRET);  
    }
    
    /**
     * 创建存储空间
     * @param ossClient      OSS连接
     * @param bucketName 存储空间
     * @return
     */  
    public static String createBucketName(OSSClient ossClient,String bucketName){  
        //存储空间  
        final String bucketNames=bucketName;  
        if(!ossClient.doesBucketExist(bucketName)){  
            //创建存储空间  
            Bucket bucket=ossClient.createBucket(bucketName);  
            logger.info("创建存储空间成功");  
            return bucket.getName();  
        }  
        return bucketNames;  
    }
    
    /**
     * 删除存储空间buckName
     * @param ossClient  oss对象
     * @param bucketName  存储空间
     */  
    public static  void deleteBucket(OSSClient ossClient, String bucketName){    
        ossClient.deleteBucket(bucketName);     
        logger.info("删除" + bucketName + "Bucket成功");    
    }
    
    /**
     * 创建模拟文件夹
     * @param ossClient oss连接
     * @param bucketName 存储空间
     * @param folder   模拟文件夹名如"qj_nanjing/"
     * @return  文件夹名
     */  
    public  static String createFolder(OSSClient ossClient,String bucketName,String folder){  
        //文件夹名   
        final String keySuffixWithSlash =folder;  
        //判断文件夹是否存在,不存在则创建  
        if(!ossClient.doesObjectExist(bucketName, keySuffixWithSlash)){  
            //创建文件夹  
            ossClient.putObject(bucketName, keySuffixWithSlash, new ByteArrayInputStream(new byte[0]));  
            logger.info("创建文件夹成功");  
            //得到文件夹名  
            OSSObject object = ossClient.getObject(bucketName, keySuffixWithSlash);  
            String fileDir=object.getKey();  
            return fileDir;  
        }  
        return keySuffixWithSlash;  
    }
    
    /**   
     * 根据key删除OSS服务器上的文件   
     * @param ossClient  oss连接
     * @param bucketName  存储空间  
     * @param folder  模拟文件夹名 如"qj_nanjing/"
     * @param key Bucket下的文件的路径名+文件名 如:"upload/cake.jpg"
     */      
    public static void deleteFile(OSSClient ossClient, String bucketName, String folder, String key){      
         ossClient.deleteObject(bucketName, folder + key);     
         logger.info("删除" + bucketName + "下的文件" + folder + key + "成功");    
    }
    
    /**
     * 上传图片至OSS
     * @param ossClient  oss连接
     * @param file 上传文件(文件全路径如:D:\\image\\cake.jpg)
     * @param bucketName  存储空间
     * @param folder 模拟文件夹名 如"qj_nanjing/"
     * @return String 返回的唯一MD5数字签名
     * */  
    public static String uploadObject2OSS(OSSClient ossClient, InputStream is,String fileName,Long fileSize, String bucketName, String folder) {  
        String resultStr = null;  
        try {  
            //以输入流的形式上传文件  
//            InputStream is = new FileInputStream(file);  
            //文件名  
//            String fileName = file.getName();
            //文件大小  
//            Long fileSize = file.length();   
            
            //创建上传Object的Metadata    
            ObjectMetadata metadata = new ObjectMetadata();  
            //上传的文件的长度  
            metadata.setContentLength(is.available());    
            //指定该Object被下载时的网页的缓存行为  
            metadata.setCacheControl("no-cache");   
            //指定该Object下设置Header  
            metadata.setHeader("Pragma", "no-cache");    
            //指定该Object被下载时的内容编码格式  
            metadata.setContentEncoding("utf-8");    
            //文件的MIME,定义文件的类型及网页编码,决定浏览器将以什么形式、什么编码读取文件。如果用户没有指定则根据Key或文件名的扩展名生成,  
            //如果没有扩展名则填默认值application/octet-stream  
            metadata.setContentType(getContentType(fileName));    
            //指定该Object被下载时的名称(指示MINME用户代理如何显示附加的文件,打开或下载,及文件名称)  
            metadata.setContentDisposition("filename/filesize=" + fileName + "/" + fileSize + "Byte.");    
            //上传文件   (上传文件流的形式)  
            PutObjectResult putResult = ossClient.putObject(bucketName, folder + fileName, is, metadata);    
            //解析结果  
            resultStr = putResult.getETag();  
        } catch (Exception e) {  
            e.printStackTrace();  
             logger.error("上传阿里云OSS服务器异常." + e.getMessage(), e);    
        }  
        return resultStr;  
    }
    
    /**
     * 通过文件名判断并获取OSS服务文件上传时文件的contentType
     * @param fileName 文件名
     * @return 文件的contentType
     */  
    public static  String getContentType(String fileName){  
        //文件的后缀名  
        String fileExtension = fileName.substring(fileName.lastIndexOf("."));  
        if(".bmp".equalsIgnoreCase(fileExtension)) {  
            return "image/bmp";  
        }  
        if(".gif".equalsIgnoreCase(fileExtension)) {  
            return "image/gif";  
        }  
        if(".jpeg".equalsIgnoreCase(fileExtension) || ".jpg".equalsIgnoreCase(fileExtension)  || ".png".equalsIgnoreCase(fileExtension) ) {
            return "image/jpeg";  
        }  
        if(".html".equalsIgnoreCase(fileExtension)) {  
            return "text/html";  
        }  
        if(".txt".equalsIgnoreCase(fileExtension)) {  
            return "text/plain";  
        }  
        if(".vsd".equalsIgnoreCase(fileExtension)) {  
            return "application/vnd.visio";  
        }  
        if(".ppt".equalsIgnoreCase(fileExtension) || "pptx".equalsIgnoreCase(fileExtension)) {  
            return "application/vnd.ms-powerpoint";  
        }  
        if(".doc".equalsIgnoreCase(fileExtension) || "docx".equalsIgnoreCase(fileExtension)) {  
            return "application/msword";  
        }  
        if(".xml".equalsIgnoreCase(fileExtension)) {  
            return "text/xml";  
        }  
        //默认返回类型  
        return "image/jpeg";  
    }
    
    
    
    //测试  
    public static void main(String[] args) throws FileNotFoundException {  
        //初始化OSSClient  
        OSSClient ossClient=AliyunOSSClientUtil.getOSSClient();  
        //上传文件
        String files="C:\\image\\1111.jpg";  
//      String files = "C:\\image\\吃完.jpg";
        String[] file=files.split(",");  
        for(String filename:file){  
            //System.out.println("filename:"+filename);
            File filess=new File(filename);  
            InputStream is = new FileInputStream(filess);
//            String md5key = AliyunOSSClientUtil.uploadObject2OSS(ossClient, filess, BACKET_NAME, FOLDER);    
            String md5key = AliyunOSSClientUtil.uploadObject2OSS(ossClient,is,filess.getName(),filess.length(),OSSClientConstants.BACKET_NAME,OSSClientConstants.FOLDER);
//            logger.info("上传后的文件MD5数字唯一签名:" + md5key);    
            //上传后的文件MD5数字唯一签名:40F4131427068E08451D37F02021473A  
        }
    }
}


package cnxiaov.util;

/**
 * 阿里云注册用户基本常量
 */
public class OSSClientConstants {
    
    
    //阿里云API的外网域名  
    public static final String ENDPOINT = " ";  
    //阿里云API的密钥Access Key ID  
    public static final String ACCESS_KEY_ID = " ";  
    //阿里云API的密钥Access Key Secret  
    public static final String ACCESS_KEY_SECRET = " ";  
    //阿里云API的bucket名称  
    public static final String BACKET_NAME = "";  
    //阿里云API的文件夹名称  
    public static final String FOLDER="appQrCode/";
    
    //域名/appQrCode/1010.jpg
    public static final String IMAGE_URL=域名/appQrCode/";
    
}




阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 vivo屏幕没反应怎么办 手机失灵没反应怎么办 苹果6内屏花了怎么办 iphone屏幕漏液怎么办 苹果5线屏怎么办 苹果液晶屏漏液怎么办 苹果液晶屏坏了怎么办 苹果屏幕有灰尘怎么办 手机内屏坏了该怎么办 苹果gps信号弱怎么办 机械键盘有静电怎么办 vivo触屏失灵怎么办 手机触不了屏怎么办 手机音量太小怎么办 手机划屏不灵怎么办 手机触屏跟不上怎么办 屏幕ic坏了怎么办 苹果5s老卡顿怎么办 电视遥控器丢了怎么办 质监局的焊工证怎么办 挂靠需要上社保怎么办 二建没有社保怎么办 好几年没工作 怎么办 政审二胎过不了怎么办 商场倒闭了商家怎么办 会计证七年不审怎么办 topik证书过期了怎么办 补牙过程中痛怎么办 汽车改装厂资质怎么办 掌上品的投资人怎么办 计量所改革后怎么办 三星s7edge花屏怎么办 信用住扣款失败怎么办 遴选准考证丢了怎么办 造价员证取消后怎么办 咨询师怎么办,资质取消 健身后大腿酸痛怎么办 健身后肌肉疼怎么办 健身完大腿酸痛怎么办 妈妈的脾气不好怎么办 我妈有精神病怎么办