zoukankan      html  css  js  c++  java
  • java后台中处理图片辅助类汇总(上传图片到服务器,从服务器下载图片保存到本地,缩放图片,copy图片,往图片添加水印图片或者文字,生成二维码,删除图片等)

    最近工作中处理小程序宝箱活动,需要java画海报,所以把这块都快百度遍了,记录一下处理的方法,百度博客上面也有不少坑!

    获取本地图片路径:

    String bgPath = Thread.currentThread().getContextClassLoader().getResource("/").getPath().replaceAll("WEB-INF/classes/","")+"assets/img/01.jpg";
    这里主要是java里面获取资源路径,需要其他的可以百度就好

    上传图片到服务器

    /**
         * 上传图片,返回图片地址
         * @param file 上传的文件
         * @param wxcid 参数
         * @return
         */
        public static String decaptcha(File file,String wxcid) {
            CloseableHttpClient client = HttpClients.createDefault();
            HttpPost post = new HttpPost("http://"+wxcid); //请求接口,接口接受参数是MultipartFile就可以用这个
            RequestConfig config = RequestConfig.custom().setSocketTimeout(30000).setConnectTimeout(20000).build();
            post.setConfig(config);
         //这里除了httpclient之外还需要一个依赖httpmime,我用的4.5.2没问题,版本坑也很多,注意选择
            FileBody fileBody = new FileBody(file, ContentType.DEFAULT_BINARY);
            MultipartEntityBuilder builder = MultipartEntityBuilder.create();
            builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
            builder.addPart("uploadfile", fileBody);
            // 相当于 <input type="file" class="file" name="file">,匹配@RequestParam("file")
            // .addPart()可以设置模拟浏览器<input/>的表单提交
            HttpEntity entity = builder.build();
            post.setEntity(entity);
            String result = "";
            try {
                CloseableHttpResponse e = client.execute(post);
                HttpEntity resEntity = e.getEntity();
                if(entity != null) {
                    result = EntityUtils.toString(resEntity);
                    System.out.println("response content:" + result);
                }
            } catch (IOException var10) {
                log.error("请求解析验证码io异常",var10);
                var10.printStackTrace();
            }
            return result;
        }
    

      

    缩放图片

      //缩放图片: 目标文件路径,缩放后保存的路径,缩放的宽高,这里都是根据本地路径来的,可以根据需求适当自己修改
        public static void reduceImg(String imgsrc, String imgdist, int widthdist,
                                     int heightdist,boolean isCir) {//是否设置成圆形
            try {
                File srcfile = new File(imgsrc);
                if (!srcfile.exists()) {
                    return;
                }
                Image src = javax.imageio.ImageIO.read(srcfile);
                BufferedImage tag= new BufferedImage((int) widthdist, (int) heightdist,
                        BufferedImage.TYPE_4BYTE_ABGR);
                //Graphics graphics = tag.getGraphics();
                Graphics2D graphics = tag.createGraphics();
                // 设置“抗锯齿”的属性(这里好像不管用,很蛋疼)
                graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
                //设置成圆形
                if(isCir){
                    Ellipse2D.Double shape = new Ellipse2D.Double(0, 0, 50, 50);
                    graphics.setClip(shape);
                }
                graphics.drawImage(src.getScaledInstance(widthdist, heightdist,  Image.SCALE_SMOOTH), 0, 0,  null);
                graphics.dispose();
                FileOutputStream out = new FileOutputStream(imgdist);
                JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
                encoder.encode(tag);
                out.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    

      

    copy图片

      // 拷贝图片
        public static void copyFile(String srcPath, String destPath) throws IOException {
            // 打开输入流
            FileInputStream fis = new FileInputStream(srcPath);
            // 打开输出流
            FileOutputStream fos = new FileOutputStream(destPath);
    
            // 读取和写入信息
            int len = 0;
            while ((len = fis.read()) != -1) {
                fos.write(len);
            }
            // 关闭流  先开后关  后开先关
            fos.close(); // 后开先关
            fis.close(); // 先开后关
        }
    

      

    往图片上添加水印

    添加文字:

    /**
         * 打印文字水印图片
         *
         * @param pressText
         *            --文字
         * @param targetImg --
         *            目标图片
         * @param fontName --
         *            字体名
         * @param fontStyle --
         *            字体样式
         * @param color --
         *            字体颜色
         * @param fontSize --
         *            字体大小
         * @param x --
         *            偏移量
         * @param y
         */
    
        public static void pressText(String pressText, String targetImg,
                                     String fontName, int fontStyle, Color color, int fontSize, int x,
                                     int y) {
            try {
                File _file = new File(targetImg);
                Image src = ImageIO.read(_file);
                int wideth = src.getWidth(null);
                int height = src.getHeight(null);
                BufferedImage image = new BufferedImage(wideth, height,
                        BufferedImage.TYPE_INT_RGB);
                Graphics2D g = image.createGraphics();
                // 设置“抗锯齿”的属性
                g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
                g.drawImage(src, 0, 0, wideth, height, null);
                g.setColor(color);
                AttributedString ats = new AttributedString(pressText);
                Font font = new Font(fontName, fontStyle, fontSize);
                g.setFont(font);
                ats.addAttribute(TextAttribute.FONT, font, 0, pressText.length());
                AttributedCharacterIterator iter = ats.getIterator();
                /* 添加水印的文字和设置水印文字出现的内容 ----位置 */
                g.drawString(iter, x, y);
                g.dispose();
                FileOutputStream out = new FileOutputStream(targetImg);
                JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
                encoder.encode(image);
                out.close();
            } catch (Exception e) {
                System.out.println(e);
            }
        }
    

      

    添加图片:

    /**
         * 把图片印刷到图片上
         *
         * @param pressImg --
         *            水印文件
         * @param targetImg --
         *            目标文件
         * @param x
         *            --x坐标
         * @param y
         *            --y坐标
         */
        public final static void pressImage(String pressImg, String targetImg,
                                            int x, int y) {
            try {
                //目标文件
                File _file = new File(targetImg);
                Image src = ImageIO.read(_file);
                int wideth = src.getWidth(null);
                int height = src.getHeight(null);
                BufferedImage image = new BufferedImage(wideth, height,
                        BufferedImage.TYPE_INT_RGB);
                //Graphics g = image.createGraphics();
                Graphics2D g = image.createGraphics();
                // 设置“抗锯齿”的属性
                g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
                g.drawImage(src, 0, 0, wideth, height, null);
                //水印文件
                File _filebiao = new File(pressImg);
                Image src_biao = ImageIO.read(_filebiao);
                g.drawImage(src_biao, x, y, null);
                //水印文件结束
                g.dispose();
                FileOutputStream out = new FileOutputStream(targetImg);
                JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
                encoder.encode(image);
                out.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    

      注意的是,这里得抗锯齿好像都不管用

    删除图片

    /**
         * 根据路径删除图片
         * @param path
         */
        public static void deleteFile(String path){
            File file= new File(path);
            if(file.exists()){
                log.debug("del:"+file.delete());
            }
        }
    

      

    从服务器下载图片到本地

        /*
         *  根据;;链接下载图片到本地,链接(http://.....)
         */
        public static String downloadByPath(String urlpath,String filename){
            InputStream mainis = null;
            String logoPath="";
            try {
                URL url = new URL(urlpath);
                // 打开连接
                URLConnection con = url.openConnection();
                //设置请求超时为5s
                con.setConnectTimeout(5*1000);
                // 输入流
                mainis = con.getInputStream();
                //通过JPEG图象流创建JPEG数据流解码器
                JPEGImageDecoder jpegDecoder = JPEGCodec.createJPEGDecoder(mainis);
                //解码当前JPEG数据流,返回BufferedImage对象
                BufferedImage buffImg = jpegDecoder.decodeAsBufferedImage();
           // 保存到本地的地址 logoPath = Thread.currentThread().getContextClassLoader().getResource("/").getPath() + "/" + new String(new Date().getTime() + filename+".jpg"); OutputStream os = new FileOutputStream(logoPath); //创键编码器,用于编码内存中的图象数据。 JPEGImageEncoder en = JPEGCodec.createJPEGEncoder(os); en.encode(buffImg); mainis.close(); os.close(); return logoPath; } catch (Exception e) { e.printStackTrace(); } return null; }

      这里有个坑,如果服务器上图片是png或者其他格式,就会报异常 Not a JPEG格式文件,所以一般用下面这种就好:

    public static String downloadByPath(String urlpath,String filename) {
    		String logoPath ="";
    		try {
    			URL url = new URL(urlpath);
    			URLConnection conn = null;
    			conn =url.openConnection();
    			//设置超时间为3秒
    			conn.setConnectTimeout(3*1000);
    			//防止屏蔽程序抓取而返回403错误
    			conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
    
    			//得到输入流
    			InputStream inputStream = conn.getInputStream();
    			//获取自己数组
    			byte[] getData = readInputStream(inputStream);
    			logoPath = Thread.currentThread().getContextClassLoader().getResource("/").getPath() + "/" + new String(new Date().getTime()+urlpath.substring(urlpath.length()-4));
    			//文件保存位置
    			File file = new File(logoPath);
    			FileOutputStream fos = new FileOutputStream(file);
    			fos.write(getData);
    			if(fos!=null){
    				fos.close();
    			}
    			if(inputStream!=null){
    				inputStream.close();
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		return logoPath;
    }
    

      这种可以适应所有的格式!

    生成一般二维码

    /**
         * 生成二维码
         * @param createPath  生成二维码路径
         * @param exurl 扫码跳转url(包含参数等信息)
         */
        public static void createQrcodePicByPath(String createPath, String exurl){
            MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
            Map<EncodeHintType, String> hints = new HashMap<EncodeHintType, String>();
            hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
            BitMatrix bitMatrix;
            try {
                //这里指定大小
                bitMatrix = multiFormatWriter.encode(exurl, BarcodeFormat.QR_CODE, 220, 220, hints);
                /*bitMatrix = deleteWhite(bitMatrix);*/
                BufferedImage bimage = toBufferedImage(bitMatrix);
                OutputStream os = new FileOutputStream(createPath);
                //创键编码器,用于编码内存中的图象数据。
                JPEGImageEncoder en = JPEGCodec.createJPEGEncoder(os);
                en.encode(bimage);
                os.close();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    

      

    httpclent请求地址生成特殊二维码(小程序):

      // 获取小程序二维码,需要的参数,这里主要是httpclient发送get请求,解析返回结果(图片地址)
        public static String createQrcodePicByMiniProgramma(String wxcid, String token,String path){
            CloseableHttpResponse response = null;
            CloseableHttpClient httpClient = HttpClients.createDefault();
            try {
                URIBuilder builder = new URIBuilder("http://......");
                List<NameValuePair> params = new ArrayList<NameValuePair>();
                params.add(new BasicNameValuePair("cid",wxcid));
                params.add(new BasicNameValuePair("token",token));
                params.add(new BasicNameValuePair("path",path));
                builder.setParameters(params);
                HttpGet get = new HttpGet(builder.build());
                response = httpClient.execute(get);
                if(response != null && response.getStatusLine().getStatusCode() == 200){
                    HttpEntity entity = response.getEntity();
                    String string = entityToString(entity);
                    log.info("pms消息转发成功,返回结果"+string);
                    return string;
                }
            } catch (Exception e) {
                e.printStackTrace();log.error("pms消息转发失败"+response.getEntity());
            } finally {
                try {
                    httpClient.close();if(response != null)response.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return null;
        }
    

      

    //解析httpclient返回结果,转换成String
        private static String entityToString(HttpEntity entity) throws IOException {
            String result = null;
            if(entity != null)
            {
                long lenth = entity.getContentLength();
                if(lenth != -1 && lenth < 2048){
                    result = EntityUtils.toString(entity,"UTF-8");
                }else {
                    InputStreamReader reader1 = new InputStreamReader(entity.getContent(), "UTF-8");
                    CharArrayBuffer buffer = new CharArrayBuffer(2048);
                    char[] tmp = new char[1024];
                    int l;
                    while((l = reader1.read(tmp)) != -1) {
                        buffer.append(tmp, 0, l);
                    }
                    result = buffer.toString();
                }
            }
            return result;
        }
    

     

  • 相关阅读:
    20145212 罗天晨 信息搜集与漏洞扫描
    20145212 罗天晨 MSF基础应用
    20145212 罗天晨 《网络对抗》Exp3 Advanced 恶意代码伪装技术实践
    20145212罗天晨 恶意代码分析
    20145212 罗天晨 免杀原理与实践
    20145212罗天晨 后门原理与实践
    计算机取证与司法鉴定实践
    20145210姚思羽 《网络对抗技术》 Web安全基础实践
    20145210姚思羽《网络对抗》Web基础
    20145210姚思羽《网络对抗》网络欺诈技术防范
  • 原文地址:https://www.cnblogs.com/houzheng/p/9768256.html
Copyright © 2011-2022 走看看