看过客户端的脚本特效,剩下的就是将客户端对图片想做的修改的相关数据传送到服务器端了,这个时候我们需要做两布操作,首先是对服务器上的图片进行缩放处理,因为我们的图片剪辑是缩放后的剪辑,其次是对服务器的图片开始进行剪辑。
首先看一下我们的缩放代码
- /**
- * 进行图片的缩放,可以将原始路径(url)的图片缩放后放到另外的路径(newUrl)。如果
- * url和newUrl相同,那就是在原始图片的基础上做修改了
- * @author kongqz
- * @param url 要做修改的图片的物理路径,就是存放在服务器上的绝对路径
- * @param newWidth 新的宽度
- * @param newHeight 新的高度
- * @param newUrl 要写入的路径,就是存放在服务器上的绝对路径,可以和url一样,这样就是对原始图片的修改了
- * @param suffix 文件的后缀名,例如“jpg”
- * */
- public void scaledImage(String url, int newWidth, int newHeight, String newUrl, String suffix)throws Exception{
- //读取图片
- BufferedImage bi = ImageIO.read(new File(url));
- //判断读入图片的宽和高
- if (bi.getHeight() > bi.getWidth())
- {
- //如果高比宽大,就交换两值,确保生成的图片的长个宽都在一个范围内
- int tmp = newWidth;
- newWidth = newHeight;
- newHeight = tmp;
- }
- //用Image里的方法对图片进行等比压缩,只要宽和高其一值为负,则以正的那个值为最大边进行等比压缩
- Image image2 = bi.getScaledInstance(newWidth, newHeight, Image.SCALE_AREA_AVERAGING);
- //获取压缩后图片的高和宽
- int height = image2.getHeight(null);
- int width = image2.getWidth(null);
- //以新的高和宽构造一个新的缓存图片
- BufferedImage bi3 = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
- Graphics g = bi3.getGraphics();
- //在新的缓存图片中画图,在画图的时候可以设定背景色
- g.drawImage(image2, 0, 0,Color.white, null);
- //构造IO流输出到文件
- FileOutputStream fos = new FileOutputStream(new File(newUrl));
- //将图片写入到指定的文件中
- ImageIO.write(bi3, suffix, fos);
- fos.close();
- }
图片经过缩放后的剪辑代码如下:
- /**
- * 将图片进行裁剪
- * @author kongqz
- * @param imgsrc 源图片文件路径
- * @param suffix 文件的后缀
- * @param imgdest 目标图片文件写入路径
- * @param x 图片的x坐标
- * @param y 图片的y坐标
- * @param width 截取框的宽
- * @param height 截取框的高
- * @throws IOException
- * */
- public void cutImage(String imgsrc,String imgdest,String suffix,int x,int y,int width,int height) throws IOException{
- // 进行截取
- //读取源图片文件
- BufferedImage sourceImage = ImageIO.read(new File(imgsrc));
- Image croppedImage;
- ImageFilter cropFilter;
- //四个参数分别为图像起点坐标和宽高,即CropImageFilter(int x,int y,int width,int height),详细情况请参考API
- //指定要裁剪的的文件的宽度和高度,以及起始坐标
- cropFilter =new CropImageFilter(x,y,width,height);
- //生成图片
- croppedImage= Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(sourceImage.getSource(),cropFilter));
- //获取创建后的图片的高度
- int h1=croppedImage.getHeight(null);
- int w1=croppedImage.getWidth(null);
- BufferedImage bi=new BufferedImage(w1,h1,BufferedImage.TYPE_INT_RGB);
- Graphics g=bi.getGraphics();
- //在画图的时候可以设置背景色
- g.drawImage(croppedImage,0,0,Color.white,null);
- //创建要存储图片的文件,如果文件存在就读取
- File file = new File(imgdest);
- //删除文件
- file.delete();
- //创建文件输出流
- FileOutputStream fos=new FileOutputStream(new File(imgdest));
- //将创建的图片写入到输出流
- ImageIO.write(bi, suffix, fos);
- fos.close();
- }
这样缩放后的剪辑就完成了,这样就可以随心所欲的进行图片的编辑处理了
这里我提供了一个测试的main函数,大家可以指定一个图片然后对其进行剪裁处理,这里我的图片是windows xp图片收藏夹中的那个sunset.jpg图片,对其进行剪裁以看到效果
- /**
- * 进行函数的功能验证
- * @author kongqz
- * */
- public static void main(String[] args) throws IOException{
- String suffix="jpg";
- //源文件位置,请保证有这个目录和有这个文件
- String imgsrc="d://tmp//sun."+suffix;
- //生成的目标文件位置
- String despos="d://tmp//new."+suffix;
- //进行缩放
- OperateImage oi = new OperateImage();
- try {
- //此处源文件和目标文件是一个路径,就是对源文件的修改。更改新的宽度和高度(400,300),到目标目录看文件效果
- oi.scaledImage(imgsrc, 400, 300, imgsrc, suffix);
- } catch (Exception e) {
- e.printStackTrace();
- }
- //进行图片的剪切
- //进行图片的剪裁,131,141是图片要被剪裁的起始坐标,120,120是最终的图片大小,请到目标目录看文件剪裁后的效果
- //为了查看效果明显,可以将源文件和目标文件的路径改变,看新生成文件和源文件的比较
- //oi.cutImage(imgsrc, despos, suffix, 131, 141, 120, 120);
- oi.cutImage(imgsrc, imgsrc, suffix, 131, 141, 120, 120);
- }
到此,我们就完成了我们的java版本的图片拖放、剪裁功能。
纵观整个过程,最重要的就是要剪辑图片通过js缩放、拖放,然后对其相关参数的收集。至于服务器端进行的图片缩放裁剪都是来自客户端的数据,那些剪裁的类库都是java的awt包早就有的,代码难度也相对较低。如果大家有什么更酷的脚本来做图片的拖拽剪辑,可以共享之