当前位置:首页 > 编程教程 > java技术文章 > 实现java上传图片文件功能

java上传图片文件功能实现方法

  • 发布时间:
  • 作者:码农之家
  • 点击:113

这篇文章主要知识点是关于java上传图片文件、java上传图片、java上传文件、java input 调用手机相机和本地照片上传图片到服务器然后压缩的方法 的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

明解Java
明解Java完整影印版
  • 类型:Java编程大小:63.8 MB格式:PDF作者:柴田望洋
立即下载
Java语言程序设计与数据结构:基础篇
  • 类型:Java大小:259 MB格式:PDF作者:梁勇
立即下载

实现java上传图片文件功能

总的说图片上传有两种方式,一种是把图片文件写到数据库中,另一种是存到服务器文件目录中。写到数据库中的图片文件需要转换成二进制流的格式,占用数据库空间比较,适合少量图片的存储,比如说,系统中某些小图标,写到数据库中的优点是比较安全,不容易被用户不小心删除。

如果是大量的图片的存储通常的做法是保存到服务器的某个文件夹中。而完成上传有很多方式,可以采用流的方式,可以采用ftp的方式,这里采用fileupload方式。

随着系统规模的不同,对图片文件的处理方式也不尽相同。如果系统中图片的数量不是很大,直接把所有的图片存储到同一个目录下即可。如果图片的积累比较多,可以根据物资分类对图片进行相应的分类储存,这样会节省一些在磁盘中查找文件的时间。

图片上传到文件中,可以直接上传图片到目录中,也还可以将图片文件名、文件路径写入到数据库中,也可以在程序中动态的创建文件路径。如果公司中要求图片要用专门的服务器存放,这时候把文件路径写活还是比较合适的。一般的如果一种物资(物料)对应一张图片是比较容易处理的。如果对应多张图片,处理起来就需要配合循环使用。一方面,需要处理图片的动态显示,另一方面要检查图片文件命名是否重复。另外再图片处理(上传、删除、修改)的时候需要配合事务。

下面重点介绍一下使用fileupload方式实现图片上传的最基本的实现。

1、前端使用file标签:

<input name = "fileName" type ="file" class ="text1" size ="40" maxlength="40"> 

2、设置文件的enctype格式:multipart/form-data

<form name="itemForm" target="_self" id="itemForm" method="post" action="servlet/item/FileUploadServlet" enctype="multipart/form-data" > 

关于enctype="multipart/form-data" 的说明:

在jsp中使用了该格式,对应的Servlet就不能使用request.getParameter()取得参数,要使用ServletFileUpload对象的parseRequest方法先把request对象中的数据解析,然后,使用解析出的元素的isFormField标志,配合getFieldName方法来获取数据。

3、FileUploadServlet的实现:

package com.bjpowernode.drp.basedata.web; 
 
import java.io.File; 
import java.io.IOException; 
import java.util.Iterator; 
import java.util.List; 
 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
 
import org.apache.commons.fileupload.FileItem; 
import org.apache.commons.fileupload.disk.DiskFileItemFactory; 
import org.apache.commons.fileupload.servlet.ServletFileUpload; 
 
import com.bjpowernode.drp.basedata.manager.ItemManager; 
import com.bjpowernode.drp.basedata.manager.ItemManagerImpl; 
import com.bjpowernode.drp.util.ApplicationException; 
 
public class FileUploadServlet extends AbstractItemServlet { 
 private File uploadPath; 
 private File tempPath; 
   
 @Override 
 public void init() throws ServletException { 
  //在系统启动的时候,就开始初始化,在初始化时,检查上传图片的文件夹和存放临时文件的文件夹是否存在,如果不存在,就创建  
   
  //获取根目录对应的真实物理路径 
  uploadPath = new File(getServletContext().getRealPath("upload")); 
  System.out.println("uploadPath=====" + uploadPath); 
  //如果目录不存在 
  if (!uploadPath.exists()) { 
   //创建目录 
   uploadPath.mkdir(); 
  } 
   
  //临时目录 
  //File tempFile = new File(item.getName())构造临时对象 
  tempPath = new File(getServletContext().getRealPath("temp")); 
  if (!tempPath.exists()) { 
   tempPath.mkdir(); 
  } 
   
  //如果不显示调用父类方法,就不会有itemManager实例,因此会造成空指针 
  super.init(); 
 
 } 
 
 public void doGet(HttpServletRequest request, HttpServletResponse response) 
   throws ServletException, IOException { 
 
   doPost(request,response); 
 } 
 
  
 public void doPost(HttpServletRequest request, HttpServletResponse response) 
   throws ServletException, IOException { 
    
  //从item_upload.jsp中拿取数据,因为上传页的编码格式跟一般的不同,使用的是enctype="multipart/form-data" 
  //form提交采用multipart/form-data,无法采用req.getParameter()取得数据 
  //String itemNo = req.getParameter("itemNo"); 
  //System.out.println("itemNo======" + itemNo); 
    
   
 /********************************使用 FileUpload 组件解析表单********************/ 
   
  //DiskFileItemFactory:创建 FileItem 对象的工厂,在这个工厂类中可以配置内存缓冲区大小和存放临时文件的目录。 
  DiskFileItemFactory factory = new DiskFileItemFactory(); 
  // maximum size that will be stored in memory 
  factory.setSizeThreshold(4096); 
  // the location for saving data that is larger than getSizeThreshold() 
  factory.setRepository(tempPath); 
     
  //ServletFileUpload:负责处理上传的文件数据,并将每部分的数据封装成一到 FileItem 对象中。 
  //在接收上传文件数据时,会将内容保存到内存缓存区中,如果文件内容超过了 DiskFileItemFactory 指定的缓冲区的大小, 
  //那么文件将被保存到磁盘上,存储为 DiskFileItemFactory 指定目录中的临时文件。 
  //等文件数据都接收完毕后,ServletUpload再从文件中将数据写入到上传文件目录下的文件中 
    
  ServletFileUpload upload = new ServletFileUpload(factory); 
  // maximum size before a FileUploadException will be thrown 
  upload.setSizeMax(1000000 * 20); 
   
   
  /**********解析表单传递过来的数据,返回List集合数据-类型:FileItem***********/ 
   
  try { 
    
   List fileItems = upload.parseRequest(request); 
    
   String itemNo = ""; 
   //Iterator iter = fileItems.iterator()取其迭代器 
   //iter.hasNext()检查序列中是否还有元素 
   for (Iterator iter = fileItems.iterator(); iter.hasNext();) { 
    //获得序列中的下一个元素 
    FileItem item = (FileItem) iter.next(); 
 
    //判断是文件还是文本信息 
    //是普通的表单输入域 
    if(item.isFormField()) { 
     if ("itemNo".equals(item.getFieldName())) { 
      itemNo = item.getString(); 
     } 
    } 
    //是否为input="type"输入域 
    if (!item.isFormField()) {     
     //上传文件的名称和完整路径 
     String fileName = item.getName(); 
      
     long size = item.getSize(); 
     //判断是否选择了文件 
     if ((fileName == null || fileName.equals("")) && size == 0) { 
      continue; 
     } 
     //截取字符串 如:C:\WINDOWS\Debug\PASSWD.LOG 
     fileName = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.length()); 
      
      // 保存文件在服务器的物理磁盘中:第一个参数是:完整路径(不包括文件名)第二个参数是:文件名称  
     //item.write(file); 
     //修改文件名和物料名一致,且强行修改了文件扩展名为gif 
     //item.write(new File(uploadPath, itemNo + ".gif")); 
     //将文件保存到目录下,不修改文件名 
     item.write(new File(uploadPath, fileName)); 
      
      
      
     //将图片文件名写入打数据库     
     itemManager.uploadItemImage(itemNo, fileName); 
      
    } 
   } 
   response.sendRedirect(request.getContextPath() + "/servlet/item/SearchItemServlet"); 
  } catch (Exception e) { 
   e.printStackTrace(); 
   throw new ApplicationException("上传失败!"); 
  }  
   
   
 } 
  
 
} 

该类继承了AbstractItemServlet: 所有物料Servlet的抽象父类,负责实例化ItemManager

/** 
 * 所有物料Servlet的抽象父类,负责实例化ItemManager 
 * @author LiMin 
 * 
 */ 
public abstract class AbstractItemServlet extends HttpServlet { 
 
 //虽然不是线程安全的,但是如果只读的话,是不会有错误的 
 protected ItemManager itemManager = null; 
   
 @Override 
 public void init() throws ServletException { 
  itemManager = new ItemManagerImpl() 
 } 
  
 
} 

        ItemManagerImpl是实现了ItemManager接口的子类。这种设计模式有一个问题,有待遇优化,但这里为了说明图片上传,不多做无关的赘述。

总结:

        关于init()初始化方法:
        在Servlet初始化的时候,就动态创建目录,这里是把一个upload和临时文件tempPath创建到了tomcat的webapps下的项目的跟目录中。
        值得注意点是这里需要显示调用super.init()方法(super不是父类对象的引用,但是负责父类的方法的调用),否则,可能会造成该类的空指针。
        上传大致分三步执行:使用 FileUpload 组件解析表单;解析表单传递过来的数据,返回List集合数据-类型:FileItem;最后上传图片。
        使用FileItem的isFormField()方法判断是普通文本还是文件;
        使用FileItem.write(new File(uploadPath, fileName))上传文件,第一个参数是:完整路径(不包括文件名)第二个参数是:文件名称;

处理普通文本数据:

 if ("itemNo".equals(item.getFieldName())) {
itemNo = item.getString();
 } 


上传是很多年比较成熟的技术,有很多已经封装好的,我们平时的项目中可以直接拿来用,但是了解一些基本的原理是必不可少的。

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

在微信公众号里面需要上传头像,时间比较紧,调用学习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"  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" >
   <input  value="上传" type="submit">
  </div>
 </form>

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

<div class="progress_dialog" ></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();
  }
 }
}

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

以上就是本次给大家分享的关于java的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。

相关电子书
学习笔记
网友NO.830438

java实现上传网络图片到微信临时素材

本文实例为大家分享了java实现上传网络图片到微信临时素材的具体代码,供大家参考,具体内容如下 package org.afuos.playcontrol.service; import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject; import java.io.*;import java.net.HttpURLConnection;import java.net.URL; /** * Created by Mohon on 2017/8/10. */public class UploadPicToWx { /** * 网络图片上传到微信服务器 * * @param urlPath 图片路径 * @return JSONObject * @throws Exception */ public String getMediaIdFromUrl(String urlPath, String fileType) throws Exception { String result = null; String url = "http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token= Access_token String fileName = urlPath.substring(urlPath.lastIndexOf("/") + 1); // 获取网络图片 URL mediaUrl = new URL(urlPath); HttpURLConnection meidaConn = (HttpURLConnection) mediaUrl.openConnection(); meidaConn.setDoOutput(true); meidaConn.setRequestMethod("GET"); /** * 第一部分 */ URL urlObj =……

网友NO.134356

Java 客户端向服务端上传mp3文件数据的实例代码

客户端: package cn.itcast.uploadpicture.demo;import java.io.BufferedInputStream;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.PrintStream;import java.net.Socket;import java.net.UnknownHostException;public class UploadpicClient { public static void main(String[] args) throws UnknownHostException, IOException { // 1、建立客户端的Socket服务 Socket s=new Socket("192.168.1.216",10012); // 2、获取图片资源 BufferedInputStream burin= new BufferedInputStream(new FileInputStream("F:\\CloudMusic\\罗大佑,黄霑,徐克 - 沧海一声笑.mp3")); // 3、获取socket输出流 PrintStream pso=new PrintStream(s.getOutputStream(),true); // 4、将数据写入到输出流 byte[]buff=new byte[1024]; int len=-1; while((len=burin.read(buff))!=-1) { pso.write(buff, 0, len); } s.shutdownOutput(); // 5、获取服务端的返回的数据 InputStream is=s.getInputStream(); byte[]buffin=new byte[1024]; int lenth=is.read(buffin); String ……

网友NO.523953

java实现图片上传至本地实例详解

在工作中要求将图片上传至本地,如下代码将介绍如何将图片上传至本地 准备工作: 环境:eclipse4.5-x64,jdk1.7-x64,maven3 tomcat服务器配置图片上传映射: 上传至本地服务器配置文件:image.properties #\u672c\u5730\u670d\u52a1\u5668\u56fe\u7247\u4fdd\u5b58\u8def\u5f84IMAGEPATH=/mall/upload/image/ #\u56fe\u7247\u540e\u7f00\u540dFILE_EXTEND_NAME=gif,jpg,jpeg,png,bmp #\u672c\u5730\u670d\u52a1\u5668\u89c6\u9891\u5b58\u50a8\u5730\u5740MEDIAPATH=/mall/upload/media/ #\u89c6\u9891\u540e\u7f00\u540dMEDIA_EXTEND_NAME=mp4 controlle:UploadUtil.java /** * 文件上传工具类 * @author sang */@Controllerpublic class UploadUtil { /** 记录日志对象 */ private static final MyLogger LOGGER = new MyLogger(UploadUtil.class); /**图片格式错误信息*/ private static final String LOGGERINFO1 = "的图片不符合限制"; /** * 备注: * uploadImgLocal,uploadImgOSS,ossConfMapper均是静态成员变量 * 则添加注解注意只能用@Autowi……

网友NO.697051

Java上传文件到服务器端的方法

Web文件上传采用POST的方式,与POST提交表单不同的是,上传文件需要设置FORM的enctype属性为multipart/form-data.由于上传的文件会比较大,因此需要设置该参数指定浏览器使用二进制上传。如果不设置,enctype属性默认为application/x-www-form-urlencoded,使用浏览器将使用ASCII向服务器发送数据,导致发送文件失败。 上传文件要使用文件域(input type='file'/,并把FORM的Enctype设置为multipart/form-data. 客户端上传页面如图所示: 代码 如下: upload.html !DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"htmlheadtitle上传文件/titlemeta http-equiv="keywords" content="keyword1,keyword2,keyword3"meta http-equiv="description" content="this is my page"meta http-equiv="content-type" content="text/html; charset=UTF-8"link rel="stylesheet" type="text/css" href="css/style.css"/headbodyform action="servlet/UploadServlet" method="post" enctype="multipart/form-data"div align……

<
1
>

Copyright 2018-2020 www.xz577.com 码农之家

版权投诉 / 书籍推广 / 赞助:520161757@qq.com