网站建设资讯

NEWS

网站建设资讯

javainput调用手机相机和本地照片上传图片到服务器然后压缩的方法

在微信公众号里面需要上传头像,时间比较紧,调用学习jssdk并使用 来不及 就用了input

十年的梁子湖网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。营销型网站的优势是能够根据用户设备显示端的尺寸不同,自动调整梁子湖建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联公司从事“梁子湖网站设计”,“梁子湖网站推广”以来,每个客户项目都认真落实执行。

1、使用input:file标签, 去调用系统默认相机,摄像,录音功能,其实是有个capture属性,直接说明需要调用什么功能





capture表示,可以捕获到系统默认的设备,比如:camera--照相机;camcorder--摄像机;microphone--录音。

accept表示,直接打开系统文件目录。

2、input:file标签还支持一个multiple属性,表示可以支持多选,如:

加上这个multiple后,capture就没啥用了,因为multiple是专门用来支持多选的。

用form表单提交

上传之后图片显示在页面上

js

后台接收以及压缩

@PostMapping("/uploadtou.do")
 public String uploadtou(@RequestParam(value = "file") MultipartFile file, HttpServletRequest request) throws IOException {
  System.out.println(file);
  String result = "";
  if (!file.isEmpty()) {
   try {
    Shopuser u = (Shopuser) request.getSession().getAttribute("currentUser");
    String extName = file.getOriginalFilename();
    String fileName = file.getName();
    String suffix = extName.substring(extName.lastIndexOf(".") + 1);
    System.err.println(suffix);
    Date now = new Date();
    SimpleDateFormat outFormat = new SimpleDateFormat("yyyyMMddHHmmss");
    String s = outFormat.format(now);
    BufferedOutputStream bos = new BufferedOutputStream(
      new FileOutputStream(new File("D:\\xiangmu\\demo\\" + s + "." + suffix)));
    bos.write(file.getBytes());
    bos.flush();
    bos.close();
    /**
     * compress 图片缩放类的使用(缩略图)
     * srcImage 为InputStream对象
     * Rectangle 为需要截图的长方形坐标
     * proportion 为压缩比例
     * **/
    InputStream in = null;
    //缩放后需要保存的路径
    File saveFile = new File("D:\\xiangmu\\demo\\" + s + s + "." + suffix);
    try {
     //原图片的路径
     in = new FileInputStream(new File("D:\\xiangmu\\demo\\" + s + "." + suffix));
     int length = in.available();
     if (length / 1024 >= 10 && length / 1024 < 100) {
      if (compress(in, saveFile, 10)) {
       System.out.println("图片压缩十倍!");
      }
     } else if (length / 1024 >= 100 && length / 1024 < 1000) {
      if (compress(in, saveFile, 100)) {
       System.out.println("图片压缩100倍!");
      }
     } else if (length / 1024 >= 1000 && length / 1024 < 10000) {
      if (compress(in, saveFile, 1000)) {
       System.out.println("图片压缩1000倍!");
      }
     } else if (length / 1024 < 10 && length / 1024 > 0) {
      if (compress(in, saveFile, 1)) {
       System.out.println("图片压缩1倍!");
      }
     }

    } catch (Exception e) {
     e.printStackTrace();
    } finally {
     in.close();
    }
    String filename = "/Path/" + s + s + "." + suffix;//服务器地址
    System.out.println(filename);
    int a = shopService.updateImg(u.getId(), filename);
    System.out.println(filename);
   } catch (Exception e) {
    e.printStackTrace();
   }
  } else {
  }

  return "wode.html";
 }

图片处理类

package com.example.springbootshop.util;

import org.junit.Test;

import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.WritableRaster;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import javax.imageio.ImageIO;





/**
 * 图片工具类,完成图片的截取
 * 所有方法返回值均未boolean型
 */
public class ImageHelper {
 /**
  * 实现图像的等比缩放
  * @param source
  * @param targetW
  * @param targetH
  * @return
  */
 private static BufferedImage resize(BufferedImage source, int targetW,
          int targetH) {
  // targetW,targetH分别表示目标长和宽
  int type = source.getType();
  BufferedImage target = null;
  double sx = (double) targetW / source.getWidth();
  double sy = (double) targetH / source.getHeight();
  // 这里想实现在targetW,targetH范围内实现等比缩放。如果不需要等比缩放
  // 则将下面的if else语句注释即可
  if (sx < sy) {
   sx = sy;
   targetW = (int) (sx * source.getWidth());
  } else {
   sy = sx;
   targetH = (int) (sy * source.getHeight());
  }
  if (type == BufferedImage.TYPE_CUSTOM) { // handmade
   ColorModel cm = source.getColorModel();
   WritableRaster raster = cm.createCompatibleWritableRaster(targetW,
     targetH);
   boolean alphaPremultiplied = cm.isAlphaPremultiplied();
   target = new BufferedImage(cm, raster, alphaPremultiplied, null);
  } else
   target = new BufferedImage(targetW, targetH, type);
  Graphics2D g = target.createGraphics();
  // smoother than exlax:
  g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
    RenderingHints.VALUE_INTERPOLATION_BICUBIC);
  g.drawRenderedImage(source, AffineTransform.getScaleInstance(sx, sy));
  g.dispose();
  return target;
 }

 /**
  * 实现图像的等比缩放和缩放后的截取, 处理成功返回true, 否则返回false
  * @param inFilePath 要截取文件的路径
  * @param outFilePath 截取后输出的路径
  * @param width 要截取宽度
  * @param hight 要截取的高度
  * @throws Exception
  */
 public static boolean compress(String inFilePath, String outFilePath,
         int width, int hight) {
  boolean ret = false;
  File file = new File(inFilePath);
  File saveFile = new File(outFilePath);
  InputStream in = null;
  try {
   in = new FileInputStream(file);
   ret = compress(in, saveFile, width, hight);
  } catch (FileNotFoundException e) {
   e.printStackTrace();
   ret = false;
  } finally{
   if(null != in){
    try {
     in.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  }

  return ret;
 }

 /**
  * 实现图像的等比缩放和缩放后的截取, 处理成功返回true, 否则返回false
  * @param in 要截取文件流
  * @param outFilePath 截取后输出的路径
  * @param width 要截取宽度
  * @param hight 要截取的高度
  * @throws Exception
  */
 public static boolean compress(InputStream in, File saveFile,
         int width, int hight) {
//  boolean ret = false;
  BufferedImage srcImage = null;
  try {
   srcImage = ImageIO.read(in);
  } catch (IOException e) {
   e.printStackTrace();
   return false;
  }

  if (width > 0 || hight > 0) {
   // 原图的大小
   int sw = srcImage.getWidth();
   int sh = srcImage.getHeight();
   // 如果原图像的大小小于要缩放的图像大小,直接将要缩放的图像复制过去
   if (sw > width && sh > hight) {
    srcImage = resize(srcImage, width, hight);
   } else {
    String fileName = saveFile.getName();
    String formatName = fileName.substring(fileName
      .lastIndexOf('.') + 1);
    try {
     ImageIO.write(srcImage, formatName, saveFile);
    } catch (IOException e) {
     e.printStackTrace();
     return false;
    }
    return true;
   }
  }
  // 缩放后的图像的宽和高
  int w = srcImage.getWidth();
  int h = srcImage.getHeight();
  // 如果缩放后的图像和要求的图像宽度一样,就对缩放的图像的高度进行截取
  if (w == width) {
   // 计算X轴坐标
   int x = 0;
   int y = h / 2 - hight / 2;
   try {
    saveSubImage(srcImage, new Rectangle(x, y, width, hight), saveFile);
   } catch (IOException e) {
    e.printStackTrace();
    return false;
   }
  }
  // 否则如果是缩放后的图像的高度和要求的图像高度一样,就对缩放后的图像的宽度进行截取
  else if (h == hight) {
   // 计算X轴坐标
   int x = w / 2 - width / 2;
   int y = 0;
   try {
    saveSubImage(srcImage, new Rectangle(x, y, width, hight), saveFile);
   } catch (IOException e) {
    e.printStackTrace();
    return false;
   }
  }

  return true;
 }

 /**
  * 实现图像的等比缩放和缩放后的截取, 处理成功返回true, 否则返回false
  * @param in 图片输入流
  * @param saveFile 压缩后的图片输出流
  * @param proportion 压缩比
  * @throws Exception
  */
 public static boolean compress(InputStream in, File saveFile, int proportion) {
  if(null == in
    ||null == saveFile
    ||proportion < 1){// 检查参数有效性
   //LoggerUtil.error(ImageHelper.class, "--invalid parameter, do nothing!");
   return false;
  }

  BufferedImage srcImage = null;
  try {
   srcImage = ImageIO.read(in);
  } catch (IOException e) {
   e.printStackTrace();
   return false;
  }
  // 原图的大小
  int width = srcImage.getWidth() / proportion;
  int hight = srcImage.getHeight() / proportion;

  srcImage = resize(srcImage, width, hight);

  // 缩放后的图像的宽和高
  int w = srcImage.getWidth();
  int h = srcImage.getHeight();
  // 如果缩放后的图像和要求的图像宽度一样,就对缩放的图像的高度进行截取
  if (w == width) {
   // 计算X轴坐标
   int x = 0;
   int y = h / 2 - hight / 2;
   try {
    saveSubImage(srcImage, new Rectangle(x, y, width, hight), saveFile);
   } catch (IOException e) {
    e.printStackTrace();
    return false;
   }
  }
  // 否则如果是缩放后的图像的高度和要求的图像高度一样,就对缩放后的图像的宽度进行截取
  else if (h == hight) {
   // 计算X轴坐标
   int x = w / 2 - width / 2;
   int y = 0;
   try {
    saveSubImage(srcImage, new Rectangle(x, y, width, hight), saveFile);
   } catch (IOException e) {
    e.printStackTrace();
    return false;
   }
  }

  return true;
 }

 /**
  * 实现缩放后的截图
  * @param image 缩放后的图像
  * @param subImageBounds 要截取的子图的范围
  * @param subImageFile 要保存的文件
  * @throws IOException
  */
 private static void saveSubImage(BufferedImage image,
          Rectangle subImageBounds, File subImageFile) throws IOException {
  if (subImageBounds.x < 0 || subImageBounds.y < 0
    || subImageBounds.width - subImageBounds.x > image.getWidth()
    || subImageBounds.height - subImageBounds.y > image.getHeight()) {
   //LoggerUtil.error(ImageHelper.class, "Bad subimage bounds");
   return;
  }
  BufferedImage subImage = image.getSubimage(subImageBounds.x,subImageBounds.y, subImageBounds.width, subImageBounds.height);
  String fileName = subImageFile.getName();
  String formatName = fileName.substring(fileName.lastIndexOf('.') + 1);
  ImageIO.write(subImage, formatName, subImageFile);
 }


 @Test
 public static void main(String[] args) throws Exception {

  /**
   * saveSubImage 截图类的使用
   * srcImage 为BufferedImage对象
   * Rectangle 为需要截图的长方形坐标
   * saveFile 需要保存的路径及名称
   * **/
  //需要截图的长方形坐标
  /*Rectangle rect =new Rectangle();
  rect.x=40;
  rect.y=40;
  rect.height=160;
  rect.width=160;

  InputStream in = null;
  //需要保存的路径及名称
  File saveFile = new File("d:\\ioc\\files\\aaa2.jpg");
  //需要进行处理的图片的路径
  in = new FileInputStream(new File("d:\\ioc\\files\\aaa.jpg"));
  BufferedImage srcImage = null;
  //将输入的数据转为BufferedImage对象
  srcImage = ImageIO.read(in);

  ImageHelper img=new ImageHelper();
  img.saveSubImage(srcImage, rect, saveFile);*/

  /**
   * compress 图片缩放类的使用(缩略图)
   * srcImage 为InputStream对象
   * Rectangle 为需要截图的长方形坐标
   * proportion 为压缩比例
   * **/
  InputStream in = null;
  //缩放后需要保存的路径
  File saveFile = new File("D:\\xiangmu\\demo\\20180523192742IMG_0049123.jpg");
  try {
   //原图片的路径
   in = new FileInputStream(new File("D:\\xiangmu\\demo\\20180523192742IMG_0049.jpg"));
   if(compress(in, saveFile, 10)){
    System.out.println("图片压缩十倍!");
   }
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   in.close();
  }
 }
}

以上这篇java input 调用手机相机和本地照片上传图片到服务器然后压缩的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持创新互联。


文章名称:javainput调用手机相机和本地照片上传图片到服务器然后压缩的方法
当前URL:http://njwzjz.com/article/jscped.html