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;
    }



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章