1. 程式人生 > >java操作圖片將圖片改為略縮圖

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