`
liuyf
  • 浏览: 34099 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

释放一个图片裁剪的类(可指定位置、缩放比例),可以用在web中对头像进行处理

阅读更多
用了com.sun.media的jai-codec
完整代码了,开箱即用。
使用片段如下:
                    //crop7070
                    File fileOut = new File(uploadFolder.getAbsolutePath(), "crop_7070_" + photoFileName);
                    JpegCropper cropper7070 = new JpegCropper();
                    cropper7070.setCropScale(70f/cropInfo.getCropwidth(), 70f/cropInfo.getCropwidth());
                    boolean crop = cropper7070.crop(fileIn, fileOut, 70, 70);
                    if (!crop)
                    {
                        return false;
                    }

package xxx.xxx;

import java.awt.RenderingHints;
import java.awt.image.renderable.ParameterBlock;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.media.jai.BorderExtender;
import javax.media.jai.Interpolation;
import javax.media.jai.JAI;
import javax.media.jai.KernelJAI;
import javax.media.jai.PlanarImage;
import javax.media.jai.RenderedOp;

import com.sun.media.jai.codec.ImageEncoder;
import com.sun.media.jai.codec.JPEGEncodeParam;
import com.sun.media.jai.codec.SeekableStream;
import com.sun.media.jai.codecimpl.JPEGCodec;

public class JpegCropper
{
    private float x = 0;
    private float y = 0;
    private float scalex = 1;
    private float scaley = 1;
    private float quality = 0.8f;
    private boolean scaleAuto = false;
    
    //设置裁剪的起始坐标,如果没有调用该函数,在0,0位置开始裁剪
    public void setCropCoordinate(float x, float y)
    {
        this.x = x;
        this.y = y;
    }
    
    //设置横纵坐标下的缩放,如果没有调用该函数,不进行裁剪.其中为1表示不缩放,大于1表示拉升,小于1表示压缩
    public void setCropScale(float scalex, float scaley)
    {
        this.scalex = scalex;
        this.scaley = scaley;
    }
    
    //设置按输出和源大小等比例缩放
    public void setCropScaleAuto(boolean b)
    {
        this.scaleAuto = b;
    }
    
    //设置jpeg输出的质量
    public void setJpegOutQuality(float quality)
    {
        if (quality > 1)
        {
            return;
        }
        this.quality = quality;
    }

    //重写该函数,检查源图片的尺寸是否合适
    protected boolean sourceImgSizeCheck(float width, float height)
    {
        //默认纵横超过就不合格
        return !(width > 450 || height > 450);
    }
            
    public boolean crop(String filenameIn, String filenameOut, float targetW, float targetH)
    {
        return crop(new File(filenameIn), new File(filenameOut), targetW, targetH);
    }
    
    //裁剪目标高宽的图片
    public boolean crop(File fileIn, File fileOut, float targetW, float targetH)
    {            
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try
        {
            fis = new FileInputStream(fileIn);
            fos = new FileOutputStream(fileOut);
        }
        catch (FileNotFoundException e)
        {
            return false;
        }

        SeekableStream seekableStream = SeekableStream.wrapInputStream(fis, true);
        PlanarImage sourceImage = JAI.create("stream", seekableStream);
        if (!sourceImgSizeCheck(sourceImage.getWidth(), sourceImage.getHeight()))
        {
            //尺寸不符合要求
            return false;
        }
        
        if (this.x + targetW > sourceImage.getWidth() || this.y + targetH > sourceImage.getHeight())
        {
            //x,y,targetW或targetH参数错误
            return false;
        }
        
        if (scaleAuto)
        {
            //注意sourceImage有没有被重新赋值
            this.scalex = targetW / sourceImage.getWidth();
            this.scaley = targetH / sourceImage.getHeight();
        }

        RenderingHints copyBorderRenderingHints = new RenderingHints(JAI.KEY_BORDER_EXTENDER, BorderExtender.createInstance(BorderExtender.BORDER_COPY));
        Interpolation interpolation = Interpolation.getInstance( Interpolation.INTERP_BILINEAR); 

        ParameterBlock pbPreTranslate = new ParameterBlock();
        pbPreTranslate.addSource( sourceImage);
        pbPreTranslate.add(x); 
        pbPreTranslate.add(y); 
        pbPreTranslate.add(interpolation);
        RenderedOp translatedImage = JAI.create( "Translate", pbPreTranslate, copyBorderRenderingHints);
        sourceImage = translatedImage;
                    
        //在很多使用下,并不需要进行缩放,所以有这个检查
        if (this.scalex != 1 || this.scaley != 1)
        {
            //进行缩放
            ParameterBlock pbScale = new ParameterBlock();
            pbScale.addSource(sourceImage);
            pbScale.add(this.scalex);       //x Scale amount
            pbScale.add(this.scaley);       //y Scale amount
            pbScale.add(0.0f);              //x Translate amount
            pbScale.add(0.0f);              //y Translate amount
            pbScale.add(interpolation);                 // interpolation
            PlanarImage scaledImage = JAI.create("Scale", pbScale, copyBorderRenderingHints);
            
            sourceImage = scaledImage;
        }

        //进行裁剪
        ParameterBlock pbCropFinal = new ParameterBlock();  
        pbCropFinal.addSource( sourceImage);
        pbCropFinal.add(0.0f);  
        pbCropFinal.add(0.0f);  
        pbCropFinal.add((float)targetW);  
        pbCropFinal.add((float)targetH);
        PlanarImage croppedFinalImage = JAI.create("crop", pbCropFinal, copyBorderRenderingHints);         
        
        // Unsharpening image
        KernelJAI unsharpKernel = getLowPassKernel(3);
        ParameterBlock pbUnsharpMask = new ParameterBlock();  
        pbUnsharpMask.addSource(croppedFinalImage);
        pbUnsharpMask.add(unsharpKernel);
        pbUnsharpMask.add(0.25f);
        PlanarImage unsharpenedImage = JAI.create("UnsharpMask",pbUnsharpMask,copyBorderRenderingHints);

        // Writing image
        JPEGEncodeParam param = new JPEGEncodeParam();
        param.setQuality(this.quality);
        ImageEncoder encoder = JPEGCodec.createImageEncoder("jpeg", fos, param);
        try
        {
            encoder.encode(unsharpenedImage);
            fos.flush(); 
            fos.close();
        }
        catch (IOException e)
        {
            return false;
        }
        return true;
    }

    /** 
     * The default low-pass kernel. Every entry contains the value 1.0/(number of kernel elements)  
     */
    private static KernelJAI getLowPassKernel(int size) 
    {
        int length =  size * size;
        float [] data = new float[length];
        float value = 1.0f / (float) length;
        for (int i = 0; i< length; i++) 
        {
            data[i] = value;
        }
        return new KernelJAI(size, size, data);
    }
}
0
1
分享到:
评论

相关推荐

    html5+canvas+js头像缩放裁剪

    7. **保存结果**:最后,当用户确认裁剪结果,可以使用`toDataURL()`方法将Canvas内容转换为数据URL,通常是一个Base64编码的PNG图像,然后可以发送到服务器进行存储。 在实际应用中,可能还需要考虑一些额外的功能...

    java版头像上传缩放裁剪功能

    Imgscalr库提供了一个高效的`scale()`方法,支持按比例缩放或指定宽度和高度。同时,还可以保持原始图像的宽高比,防止变形。 5. 完整源码与部署: "ZoomImageDemo"项目的源码包含了一个完整的解决方案,下载后...

    web剪切处理头像并上传

    在Web开发中,用户头像上传是一项常见的功能,特别是在社区论坛、社交网络或者个人资料管理等应用场景中。本文将深入探讨如何使用Flash技术实现头像上传及剪切处理,并结合PHP进行后端处理,实现类似Discuz论坛的...

    jsp+CropZoom+jquery+java 图片缩放裁剪

    【标题】"jsp+CropZoom+jquery+java 图片缩放裁剪" 是一个基于Web的图像处理系统,主要用于实现用户在上传头像时进行自由裁剪的功能。这个项目使用了JSP(JavaServer Pages)作为后端动态网页技术,CropZoom作为前端...

    jsp上传缩放裁剪头像

    例如,`cropper.js`是一个流行的JavaScript图片裁剪插件,可以方便地集成到JSP项目中。 6. **响应式设计**:考虑到不同设备的屏幕尺寸,头像上传系统应该具有良好的响应性,适应手机、平板和桌面等多种设备。使用...

    简单易用的vue图片裁剪插件,支持移动图像,裁剪图片,放大缩小图片,上下左右移动,固定比例,固定尺寸,远程图片裁剪

    总的来说,"vue-img-cutter"插件为Vue开发者提供了一个高效、灵活的图片裁剪解决方案,使得在Web应用中实现图片裁剪功能变得更加便捷。通过了解其特性和使用方法,开发者可以轻松地将其集成到项目中,满足用户的个性...

    html5点击修改头像上传图片裁剪代码

    我们可以在前端进行初步验证,例如使用`accept`属性限制只能选择图片文件,或者使用`maxSize`限制文件大小。如果服务器端有更严格的要求,可以返回错误信息,前端再进行相应的提示。 总的来说,实现“html5点击修改...

    java版头像上传缩放裁剪功能 源码

    Java版的头像上传、缩放和裁剪功能是许多Web应用中不可或缺的一部分,尤其是在社交网络、用户管理系统等场景下。这个源码提供了一个实现这一功能的解决方案。下面将详细介绍这个功能涉及的主要知识点: 1. **文件...

    java版上传头像裁剪

    在本项目中,用户可以上传个人头像,然后系统会对上传的图片进行裁剪,生成适合特定尺寸的头像。下面将详细讲解这个过程中的关键知识点。 1. **JSP(JavaServer Pages)**:JSP是Java的一种动态网页技术,它允许...

    asp.net图片裁剪

    ASP.NET 图片裁剪技术是Web开发中一种实用的功能,常用于网站的用户头像上传、产品图片展示等场景,允许用户或系统根据需求调整图片的尺寸和比例。本示例提供了一个详细的代码实现,非常适合开发者学习和借鉴。 在...

    JSP上传图片并缩放裁切的程序

    - 使用Java的BufferedImage类创建一个新的图像,然后使用Graphics2D对象进行绘制,确保缩放过程中不拉伸图像。 3. **裁切图片**: - 裁切图片可能是因为需要特定的部分或者调整为特定的长宽比。这同样可以通过...

    ImageCropper用于裁剪用户头像的图像裁剪器

    在Web开发中,特别是在社交网络、电子商务或用户个人信息管理等应用场景中,用户头像的上传与裁剪功能是必不可少的。ImageCropper,正如其名,是一个专门用于裁剪用户头像的图像裁剪工具,它具有无依赖性的优点,...

    图片缩放剪切处理代码

    例如,你可以创建一个可拖放的区域,用户将图片拖入后,使用Canvas元素进行实时的处理。 其次,ASP(Active Server Pages)是微软开发的一种服务器端脚本环境,它允许开发者在服务器端生成动态网页。在图片处理场景...

    9个头像上传处理插件

    在IT行业中,头像上传处理插件是网页应用中常见的一种功能,主要用于用户自定义个人形象展示。在给定的“9个头像上传处理插件”中,我们可以看到涉及了多种技术和工具,如PHP、JS(JavaScript)、JQuery以及图片处理...

    cropper头像裁剪(PC端)

    通过JavaScript,我们可以对Canvas元素进行像素级别的操作,包括绘制图像、线条、形状以及进行复杂的图像处理,如图片裁剪。 2. **图片裁剪原理**:图片裁剪的核心在于确定裁剪区域,这通常需要两个关键信息——...

    cropper+layui实现图片裁剪、旋转、放大缩小后上传

    在IT行业中,图片处理是一项常见的需求,特别是在网页和应用程序中,用户往往需要对图片进行裁剪、旋转或缩放等操作。"cropper+layui"的结合应用正是为了解决这类问题,它允许用户在前端方便地进行图像编辑,并将...

    HTML5手机图片上传头像裁剪代码.zip

    为了准确反映用户在触摸屏幕时的移动和缩放,需要对触摸事件的坐标进行转换,考虑到Canvas的大小和图像的原始比例。 7. **CSS3变换**: 可以利用CSS3的`transform`属性进行缩放和平移,以实现图像的拖动和放大...

    头像上传裁剪整合php

    在IT领域,尤其是在Web开发中,用户头像的上传与裁剪是一项常见的需求。"头像上传裁剪整合php"的项目就是针对这一需求而设计的。该项目利用了cropper.js,一个强大的JavaScript图像裁剪插件,以及PHP后端进行处理,...

Global site tag (gtag.js) - Google Analytics