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

作者:*眉间缘* 时间:2023-04-26 08:20:27 

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

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


<input type="file" accept="image/*" capture="camera">

<input type="file" accept="video/*" capture="camcorder">

<input type="file" accept="audio/*" capture="microphone">

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

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

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


<input type="file" accept="image/*" multiple>

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

用form表单提交


<form id="uploadForm" class="mui-input-group" style="width: 80%;margin: 0 auto;margin-top: 70px" action="/jxs/uploadtou.do" method="post" enctype="multipart/form-data" >
 <div class="mui-input-row">
  <label>图片</label>
  <input required="required" class="mui-input-clear mui-input" type="file" name="file" id="photo_pick" accept="image/*">
 </div>

<div class="mui-content-padded" style="width: 90%;margin: 0 auto;margin-top: 5px;padding: 10px">
  <input style="color:#FFFFFF ;width: 100%;background: #00F7DE" value="上传" type="submit">
 </div>
</form>

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


<div class="progress_dialog" style="margin-left:30px;margin-top:20px;width: 50%;height: 50%;"></div>

js


<script>
/*图片地址
https://image.baidu.com/search/detail?ct=503316480&z=0&ipn=d&word=%E9%AB%98%E6%B8%85%E7%BE%8E%E5%A5%B3%20%E4%B8%9D%E8%A2%9C%E5%B7%A8%E4%B9%B3&step_word=&hs=0&pn=1&spn=0&di=57234189540&pi=0&rn=1&tn=baiduimagedetail&is=0%2C0&istype=2&ie=utf-8&oe=utf-8&in=&cl=2&lm=-1&st=-1&cs=3589338782%2C536437810&os=3988412231%2C488396405&simid=3515890414%2C233897128&adpicid=0&lpn=0&ln=1389&fr=&fmq=1490709487003_R&fm=result&ic=0&s=undefined&se=&sme=&tab=0&width=&height=&face=undefined&ist=&jit=&cg=&bdtype=0&oriquery=&objurl=http%3A%2F%2Fwww.bz55.com%2Fuploads%2Fallimg%2F150416%2F139-1504161AK9.jpg&fromurl=ippr_z2C%24qAzdH3FAzdH3Fooo_z%26e3Bkzcc_z%26e3Bv54AzdH3F4jtgektzitAzdH3F8l9c9_z%26e3Bip4s&gsm=0&rpstart=0&rpnum=0
*/
$(function() {
 $("#photo_pick").on("change", function () {
  var file = this.files[0];
  photoCompress(file, 50, $(".progress_dialog")[0])
  $(".progress_dialog").show();
  if (!this.files.length) return;
  var files = Array.prototype.slice.call(this.files);
  if (files.length > 9) {
   alert("最多同时只可上传9张图片");
   return;
  }
 /* files.forEach(function (file, i) {
   /!*var reader = new FileReader();
   reader.onload = function () {
    var imgO = document.createElement("img");
    imgO.src = reader.result;
   }*!/
   reader.readAsDataURL(file);
   $(".progress_dialog").hide();*/
  });
 })

/*
三个参数
file:一个是文件(类型是图片格式),
w:一个是文件压缩的后宽度,宽度越小,字节越小
objDiv:一个是容器或者回调函数
photoCompress()
 */
 function photoCompress(file, w, objDiv) {
  var ready = new FileReader();
  /*开始读取指定的Blob对象或File对象中的内容. 当读取操作完成时,readyState属性的值会成为DONE,如果设置了onloadend事件处理程序,则调用之.同时,result属性中将包含一个data: URL格式的字符串以表示所读取文件的内容.*/
  ready.readAsDataURL(file);
  ready.onload = function () {
   var re = this.result;
   canvasDataURL(re, w, objDiv)

}
 }

function canvasDataURL(re, w, objDiv) {
  var newImg = new Image();
  newImg.src = re;
  var imgWidth, imgHeight, offsetX = 0, offsetY = 0;
  newImg.onload = function () {
   var img = document.createElement("img");
   img.src = newImg.src;
   imgWidth = img.width;
   imgHeight = img.height;
   var canvas = document.createElement("canvas");
   canvas.width = w;
   canvas.height = w;
   var ctx = canvas.getContext("2d");
   ctx.clearRect(0, 0, w, w);
   if (imgWidth > imgHeight) {
    imgWidth = w * imgWidth / imgHeight;
    imgHeight = w;
    offsetX = -Math.round((imgWidth - w) / 6);
   } else {
    imgHeight = w * imgHeight / imgWidth;
    imgWidth = w;
    offsetY = -Math.round((imgHeight - w) / 6);
   }
   ctx.drawImage(img, offsetX, offsetY, imgWidth, imgHeight);
   var base64 = canvas.toDataURL("image/jpeg", 0.1);
   if (typeof objDiv == "object") {
    objDiv.appendChild(canvas);
   } else if (typeof objDiv == "function") {
    objDiv(base64);
   }
  }

}
</script>

后台接收以及压缩


@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();
 }
}
}

来源:https://www.cnblogs.com/NCL--/p/9103679.html

标签:java,照片,服务器,压缩
0
投稿

猜你喜欢

  • C语言实现贪吃蛇小游戏开发

    2022-08-20 00:03:07
  • springboot为异步任务规划自定义线程池的实现

    2022-12-05 01:13:02
  • Java中List转Map List实现的几种姿势

    2022-10-23 19:19:57
  • java编程题之顺时针打印矩阵

    2022-02-22 04:05:36
  • Java设计模式之监听器模式实例详解

    2022-10-04 02:51:44
  • SpringBoot消息国际化配置实现过程解析

    2023-05-16 01:19:22
  • IDEA插件开发之环境搭建过程图文详解

    2022-01-17 14:04:08
  • Android布局之绝对布局AbsoluteLayout详解

    2023-07-26 07:44:27
  • java弹幕小游戏1.0版本

    2021-12-06 04:42:48
  • unity绘制一条流动的弧线(贝塞尔线)

    2022-09-03 18:15:00
  • springboot前端传参date类型后台处理的方式

    2023-04-12 16:47:35
  • Spring依赖注入的三种方式小结

    2022-08-09 15:56:41
  • SpringBoot整合Redisson实现分布式锁

    2021-08-01 12:04:35
  • Java并发编程之闭锁与栅栏的实现

    2022-01-09 15:00:12
  • Android ViewPager实现无限循环轮播广告位Banner效果

    2023-06-26 22:02:29
  • Eclipse中改变默认的workspace的方法及说明详解

    2022-07-31 12:07:21
  • C#设计模式之Singleton模式

    2022-03-28 09:01:31
  • VS2019配置opencv详细图文教程和测试代码的实现

    2023-07-17 13:49:31
  • Gradle修改本地仓库的位置方法实现

    2022-01-17 21:25:52
  • java8 forEach结合Lambda表达式遍历 List操作

    2021-07-04 07:22:55
  • asp之家 软件编程 m.aspxhome.com