java操作圖片將圖片改為略縮圖
阿新 • • 發佈:2019-02-03
前言:雖然我做的是上傳到伺服器,但是利用程式碼操作圖片,大家還是可以借鑑下.反正最後操作完成後的得到的是流物件,然後再將流物件進行'讀'的操作,就可以將處理後的圖片儲存到本地
我做的類似於在線上傳頭像的功能,
將圖片進行修改然後得到的路徑上傳到伺服器,(得到的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;
}