JAva画像塗布機能
3714 ワード
今日問題が発生しました.ユーザーが画像をアップロードするとき、一部の機密情報は画像上で編集する必要があります(機密情報を塗布します)
アップロード画像ユーザが塗った座標(左上隅に対応)を記録して矩形枠を描く
String waterString = "_water";
/**
* , ,
* @param objName
* @param url url
* @param waters x,y,w,h|x,y,w,h (w h )
* @return
* @throws Exception
*/
@RequestMapping(value = "/uploadimg")
@ResponseBody
public String upload2waterImg(String objName,String url , String waters) throws Exception {
String picUrl = "error";
InputStream iStream = null;
ByteArrayOutputStream bos = null;
ByteArrayInputStream bis = null;
try {
if(!StringUtils.isEmpty(url)&&!StringUtils.isEmpty(waters)){
URL imgUrl = new URL(url);
iStream = imgUrl.openStream();
if(iStream!=null){
Image image = ImageIO.read(iStream);
int width_img = image.getWidth(null);
int height_img = image.getHeight(null);
BufferedImage bufferedImage = new BufferedImage(width_img, height_img, BufferedImage.TYPE_INT_RGB);
Graphics2D g = bufferedImage.createGraphics();
g.drawImage(image, 0, 0, width_img, height_img, null);
String[] water = StringUtils.split(waters, "\\|");
if(water!=null && water.length>0){
for(int i=0;i<water.length;i++){
String[] xy = StringUtils.split(water[i],",");
if(xy!=null && xy.length==4){
int x = Integer.parseInt(xy[0]);
int y = Integer.parseInt(xy[1]);
int w = Integer.parseInt(xy[2]);
int h = Integer.parseInt(xy[3]);
Rectangle2D.Float r1= new Rectangle2D.Float(x,y,w,h);//
g.setColor(new Color(0x999999)); //
g.fill(r1); //
}
}
g.dispose();
}
picUrl = objName+waterString;
bos = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, PICTRUE_FORMATE_JPG, bos);
bis = new ByteArrayInputStream(bos.toByteArray());
s3ServiceUtil.saveObject(picUrl, bis);
}
}
} catch (Exception e) {
picUrl = "error";
log.error("/upload upResult = "+false+"/xxx",e);
} finally {
try {
if (iStream != null) {
iStream.close();
}
} catch (Exception e) {
e.printStackTrace();
}
if (null != bos) {
bos.close();
}
if (null != bis) {
bis.close();
}
}
return picUrl;
}