java cropper_Image Cropper 的 JAVA 支持
image-cropper 是一个很好的 Jquery插件,可以实现图片的选择,旋转,剪切。 可以用做网站头像的处理。
点击"DONE"按钮,会向后端发送 JSON切割数据,后端的 java代码如下:
package net.watermelon.core.util;
import java.io.*;
import java.awt.*;
import java.awt.image.*;
import java.awt.Graphics;
import java.awt.color.ColorSpace;
import javax.imageio.ImageIO;
public class ImageCut {
public static BufferedImage cut(BufferedImage inputImage,int x,int y,int width,int height,boolean fill){
//获取原始图像透明度类型
int type =BufferedImage.TYPE_INT_RGB;// inputImage.getColorModel().getTransparency();
int w = inputImage.getWidth();
int h = inputImage.getHeight();
int endx=x+width;
int endy=y+height;
if(x>w)
throw new ImagingOpException("起点横坐标超出源图像范围");
if(y>h)
throw new ImagingOpException("起点纵坐标超出源图像范围");
BufferedImage img;
//补白
if(fill){
img = new BufferedImage(width, height, type);
//宽度超出限制
if((w-x)
width=w-x;
endx=w;
}
//高度超出限制
if((h-y)
height=h-y;
endy=h;
}
//不补
}else{
//宽度超出限制
if((w-x)
width=w-x;
endx=w;
}
//高度超出限制
if((h-y)
height=h-y;
endy=h;
}
img = new BufferedImage(width, height, type);
}
Graphics2D graphics2d =img.createGraphics();
BufferedImage imageNew = graphics2d.getDeviceConfiguration().createCompatibleImage(width, height,
Transparency.TRANSLUCENT);
graphics2d =imageNew.createGraphics();
graphics2d.drawImage(inputImage, 0, 0, width, height, x, y, endx, endy, null);
graphics2d.dispose();
return imageNew;
}
/**
* 缩放图像
*
* @param srcImageFile 源图像文件地址
* @param result 缩放后的图像地址
* @param scale 缩放比例
* @param flag 缩放选择:true 放大; false 缩小;
*/
public static void scale(String srcImageFile, String result, int scale,
boolean flag) {
try {
BufferedImage src = ImageIO.read(new File(srcImageFile)); // 读入文件
int width = src.getWidth(); // 得到源图宽
int height = src.getHeight(); // 得到源图长
if (flag) {
// 放大
width = width * scale;
height = height * scale;
} else {
// 缩小
width = width / scale;
height = height / scale;
}
Image image = src.getScaledInstance(width, height,Image.SCALE_DEFAULT);
BufferedImage tag = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
Graphics g = tag.getGraphics();
g.drawImage(image, 0, 0, null); // 绘制缩小后的图
g.dispose();
ImageIO.write(tag, "JPEG", new File(result));// 输出到文件流
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 重新生成按指定宽度和高度的图像
* @param srcImageFile 源图像文件地址
* @param result 新的图像地址
* @param _width 设置新的图像宽度
* @param _height 设置新的图像高度
*/
public static void scale(String srcImageFile, String result, int _width,int _height) {
scale(srcImageFile,result,_width,_height,0,0);
}
public static void scale(String srcImageFile, String result, int _width,int _height,int x,int y) {
try {
BufferedImage src = ImageIO.read(new File(srcImageFile)); // 读入文件
int width = src.getWidth(); // 得到源图宽
int height = src.getHeight(); // 得到源图长
if (width > _width) {
width = _width;
}
if (height > _height) {
height = _height;
}
Image image = src.getScaledInstance(width, height,Image.SCALE_DEFAULT);
BufferedImage tag = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
Graphics g = tag.getGraphics();
g.drawImage(image, x, y, null); // 绘制缩小后的图
g.dispose();
ImageIO.write(tag, "JPEG", new File(result));// 输出到文件流
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 图像类型转换 GIF->JPG GIF->PNG PNG->JPG PNG->GIF(X)
*/
public static void convert(String source, String result) {
try {
File f = new File(source);
f.canRead();
f.canWrite();
BufferedImage src = ImageIO.read(f);
ImageIO.write(src, "JPG", new File(result));
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 彩色转为黑白
*
* @param source
* @param result
*/
public static void gray(String source, String result) {
try {
BufferedImage src = ImageIO.read(new File(source));
ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
ColorConvertOp op = new ColorConvertOp(cs, null);
src = op.filter(src, null);
ImageIO.write(src, "JPEG", new File(result));
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 选择任意角度
* @param bufferedimage
* @param degree
* @return
*/
public static Rectangle CalcRotatedSize(Rectangle src, int angel) {
// if angel is greater than 90 degree, we need to do some conversion
angel = Math.abs(angel);
if (angel >= 90) {
if(angel / 90 % 2 == 1){
int temp = src.height;
src.height = src.width;
src.width = temp;
}
angel = angel % 90;
}
double r = Math.sqrt(src.height * src.height + src.width * src.width) / 2;
double len = 2 * Math.sin(Math.toRadians(angel) / 2) * r;
double angel_alpha = (Math.PI - Math.toRadians(angel)) / 2;
double angel_dalta_width = Math.atan((double) src.height / src.width);
double angel_dalta_height = Math.atan((double) src.width / src.height);
int len_dalta_width = (int) (len * Math.cos(Math.PI - angel_alpha
- angel_dalta_width));
int len_dalta_height = (int) (len * Math.cos(Math.PI - angel_alpha
- angel_dalta_height));
int des_width = src.width + len_dalta_width * 2;
int des_height = src.height + len_dalta_height * 2;
return new java.awt.Rectangle(new Dimension(des_width, des_height));
}
public static BufferedImage Rotate(Image src, int angel) {
int src_width = src.getWidth(null);
int src_height = src.getHeight(null);
// calculate the new image size
Rectangle rect_des = CalcRotatedSize(new Rectangle(new Dimension(
src_width, src_height)), angel);
BufferedImage res = null;
res = new BufferedImage(rect_des.width, rect_des.height,
BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = res.createGraphics();
BufferedImage imageNew = g2.getDeviceConfiguration().createCompatibleImage(rect_des.width, rect_des.height,
Transparency.TRANSLUCENT);
g2 = imageNew.createGraphics();
// transform
g2.translate((rect_des.width - src_width) / 2,
(rect_des.height - src_height) / 2);
g2.rotate(Math.toRadians(angel), src_width / 2, src_height / 2);
g2.drawImage(src, null, null);
return imageNew;
}
public static void main(String[] argv) throws Exception{
String srcImageFile="c:\\model2.jpg";
BufferedImage img =ImageIO.read(new File(srcImageFile));
BufferedImage nimg = ImageCut.Rotate(img,0);
img = ImageCut.cut(nimg,89,43,101,101,true);
ImageIO.write(img, "png", new File("c:\\model21.png"));
}
}
可以简单地完成头像的切割和保存。
java cropper_Image Cropper 的 JAVA 支持相关推荐
- 解决Apache CXF 不支持传递java.sql.Timestamp和java.util.HashMap类型问题
在项目中使用Apache开源的Services Framework CXF来发布WebService,CXF能够很简洁与Spring Framework 集成在一起,在发布WebService的过程中 ...
- IDEA报错解决:Error:(33, 35) java: -source 7 中不支持 lambda 表达式 (请使用 -source 8 或更高版本以启用 lambda 表达式)
晚上在用IDEA的时候遇到了报错: Error:(33, 35) java: -source 7 中不支持 lambda 表达式(请使用 -source 8 或更高版本以启用 lambda 表达式) ...
- 如何修复java.lang.UnsupportedClassVersionError:不支持的major.minor版本
本文翻译自:How to fix java.lang.UnsupportedClassVersionError: Unsupported major.minor version I am trying ...
- Java中switch都可以支持哪些数据类型
Java中switch都可以支持哪些数据类型 在JDK1.5之前,switch循环只支持byte short char int四种数据类型. JDK1.5 在switch循环中增加了枚举类与byte ...
- openshift 部署_OpenShift Express:部署Java EE应用程序(支持AS7)
openshift 部署 在过去的几年中,我越来越多地听说过"云"服务. 最初,我并不是很想尝试一下. 但是几个月后(一年?),我决定看看这是怎么回事. 我从事Java EE开发已 ...
- OpenShift Express:部署Java EE应用程序(支持AS7)
在过去的几年中,我越来越听到有关"云"服务的信息. 最初,我并不是很想尝试一下. 但是几个月后(一年?),我决定看看这是怎么回事. 我从事Java EE开发已经超过7年了,所以我决 ...
- JeeWx捷微2.4.1版本发布,JAVA微信管家平台(支持公众号、企业号)
JeeWx捷微2.4.1版本发布,JAVA微信管家平台(支持公众号.企业号) 1.JEEWX平台介绍 Jeewx是一款开源.敏捷.组件化的微信管家平台,支持微信公众号.微信企业号管理,采用JAVA语 ...
- JeeWx捷微 2.4.1版本发布,开源JAVA微信管家平台(支持公众号、企业号)
JeeWx捷微2.4.1版本发布,JAVA微信管家平台(支持公众号.企业号) 1.JEEWX平台介绍 Jeewx是一款开源.敏捷.组件化的微信管家平台,支持微信公众号.微信企业号管理,采用JAVA语 ...
- Java类型推断将不再支持可变性规范
Java类型推断是一项推荐的Java特性,允许开发人员使用var关键字代替显式的变量类型声明.最近的报道显示,由于社区内无法就区分可变和不可变变量的实现方式达成一致意见,Java类型推断将不再支持使用 ...
- 观察者模式--java jdk中提供的支持
一.简介 观察者设计模式有如下四个角色 抽象主题角色:把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者.抽象主题提供一个接口,可以增加和删除观察者角色.一般用一个抽象 ...
最新文章
- python模块初始与time、datetime及random
- Android UI(三)SlidingMenu实现滑动菜单(详细 官方)
- Jena增删改查java API
- mysql标准时间,MySQL时间设置
- 隐私和网络安全将是未来科技发展的屏障
- javascript-网页换肤案例
- c语言多线程详,如何用C语言实现多线程
- IOT(9)---MQTT 优缺点
- mfc大观之二(类识别)
- WinForm DevExpress使用之ChartControl控件绘制图表一——基础
- cf#94-div1-A. Statues
- 2、51单片机——I2C 总线
- kalibr fov畸变模型
- PS 超简单抠头发丝
- 树莓派mongodb实战
- Overvoltage category (过电压类别, 过电压等级)
- Django——admin功能、注册模型类、模型管理类
- 爬虫百战穿山甲(5)用大并发的手段批量爬取小图片
- 软件测试的核心竞争力是什么?
- CAD制图初学入门之CAD图纸集的使用技巧