java操作图片将图片改为略缩图

前言:虽然我做的是上传到服务器,但是利用代码操作图片,大家还是可以借鉴下.反正最后操作完成后的得到的是流对象,然后再将流对象进行'读'的操作,就可以将处理后的图片保存到本地


我做的类似于在线上传头像的功能,

将图片进行修改然后得到的路径上传到服务器,(得到的url是直接可以在浏览器上访问并显示的)

再将得服务器返回的url添加到数据库

一共上传了2张图片到服务器

一张是未进行处理

还一张是处理过的

用到的工具类的命名空间(基本都是常用的类):

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;

import java.util.UUID;

import javax.imageio.ImageIO;

import org.springframework.web.multipart.MultipartFile;

import org.springframework.web.multipart.MultipartHttpServletRequest;


-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

controller内操作:

 

 /**
     * 图片操作
     *
     * @param sessionId
     * @param request
     * @param response
     * @return
     */
    @RequestMapping(value = "/image", method = RequestMethod.POST)
    @ResponseBody
    public ResultData<Integer> addImage(@CookieValue(value = "sid", defaultValue = "") String sessionId, HttpServletRequest request, HttpServletResponse response) {
        ResultData<Integer> resultData = new ResultData<Integer>();
        try {
            
            //根据sessionId获取当前的user对象(这一步无需关心)
            String username = SystemManager.getInstance().getUserCookieMap().get(sessionId);
            UserDomain user = membersService.selectUserByUsername(username);
            int uid = user.getUid();
            
            //获取request对象
            MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
            // 获得第1张图片(根据前台的name名称得到上传的文件)
            MultipartFile imageFile = multipartRequest.getFile("file");
            
            //先保存小图(这里必须先获取流对象,否者会抛异常)
            InputStream iss = imageFile.getInputStream();
   -------- BufferedImage _buff_image=ImageIO.read(iss);//这里是要操作的对象,注意看命名,别和下面的实体类image搞混了
   |        
   |
   |        //非空验证
   |
   |        if (null == imageFile) {
   |            resultData.setStatus(1);
   |            resultData.setData(null);
   |            resultData.setMsg("图片未选中");
   |            return resultData;
   |        } else {
   |
   |
   |            //不了解uuid的同学可以先看看我的博客,有介绍uuid
   |
  |            String fileName = UUID.randomUUID().toString();
   |
   |            
   |
   |            //这里是设置的服务器上的路径,会在服务器上创建这些路径
   |
   |            String path = "/image/tweet/";// 设置相对服务器路径
   |            String savePath = path + fileName; //设置保存服务器路径
   |
   |            //上传到服务器,这时服务器会返回一条url
   |            String imageUrl = uploadFileService.uploadypyun(multipartRequest, savePath);
   |
   |            //实例化图片类
   |            TopicImage image = new TopicImage();
   |            //设置属性
   |            image.setDateline(StringFormat.getSystemTime());//时间
   |            image.setPhoto(imageUrl);//原图路径
   |            image.setName(fileName);//文件名
   |            image.setDescription(imageFile.getOriginalFilename());
   |            int size = new Long(imageFile.getSize()).intValue();//文件大小
   |            image.setFilesize(size);
   |            
   |            //缩略图操作
   |-------->   short ow=(short)_buff_image.getWidth();
                short oh=(short)_buff_image.getHeight();
                //缩略图操作

                //高度
                int height = 300;    
                int _ow=_buff_image.getWidth();
                int _oh=_buff_image.getHeight();
                float _hb=(float)_oh/(float)height;
                int width=(int) ((float)_ow/(float)_hb);
                Image _image=_buff_image.getScaledInstance(width, height, Image.SCALE_SMOOTH);
                _buff_image=null;
                _buff_image=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
                Graphics _gs=_buff_image.getGraphics();_gs.drawImage(_image, 0, 0, null);
                _gs.dispose();

                //字节数组流
                ByteArrayOutputStream _bbos=new ByteArrayOutputStream();
                ImageIO.write(_buff_image, "JPG", _bbos);
                _bbos.flush();
                //关流
                _bbos.close();
                //新建流对象>>>>>>这个名为is流对象里面就有处理后的图片
                InputStream is = new ByteArrayInputStream(_bbos.toByteArray());  
 
                //缩略图上传>>>>这里就和上面那一步一样,上传到服务器
                String thumb_path = "/image/tweet/thumb/";// 设置相对路径
                String savePath2 = thumb_path + fileName;
              
                image.setImageUrl(uploadFileService.uploadThumbYpyun(is, savePath2));
                //设置属性
                image.setWidth(ow);
                image.setHeight(oh);
                image.setUid(uid);
                image.setUsername("");
                //上传tupian
                image = tweetService.insertImage(image);
                resultData.setStatus(0);
                resultData.setData(image.getId());
                resultData.setMsg("上传成功");
            }
            
        } catch (Exception e) {
            // TODO: handle exception
            //logger.error(e.toString());
            resultData.setStatus(1);
            resultData.setData(null);
            resultData.setMsg(Constant.tweetMessage);
        }
        // request 获取用户uid
        return resultData;
    }

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

service中操作:

>>这里是上传到服务器,然后添加到数据 库用的,如果只关心图片处理可以不用看哦

这里是以HttpServletRequest获取当前页面传过来的request直接作为参数获取图片对象,保存后上传

/**
     * 保存上传图片(正常大小)
     *
     * @param request
     * @param savePath:/目录名/文件名
     * @return 返回图片url
     * @throws IOException
     */
    @Override
    public String uploadypyun(HttpServletRequest request, String savePath) {
        final MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
        final Map<String, MultipartFile> files = multiRequest.getFileMap();
        for (Object item : files.values()) {
            MultipartFile file = (MultipartFile) item;
            String path = "./" + HelperUtil.getUUID();
            try {
                file.transferTo(new File(path));
                String r = ImageUtil.uploadImage(path, savePath);
                return r;
            } catch (IOException e) {
                throw new ServiceException();
            } finally {
                try {
                    new File(path).delete();
                } catch (Exception e) {
                }
            }
        }
        return null;
    }



这里直接以流的方式保存对象,然后上传

/**
     * 上传略缩图图片
     *
     * @param request
     * @param savePath:/目录名/文件名
     * @return 返回图片url
     * @throws IOException
     */
    @Override
    public String uploadThumbYpyun(InputStream is, String savePath) {    
        String r ="";
        String path = "./" + HelperUtil.getUUID();
        try {
            
            FileUtils.copyInputStreamToFile(is, new File(path));
             r = ImageUtil.uploadImage(path, savePath);
            
        } catch (IOException e) {
            throw new ServiceException();
        } finally {
            try {
                new File(path).delete();
            } catch (Exception e) {
            }
        }
        return r;
    }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值