用了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);
}
}
分享到:
相关推荐
7. **保存结果**:最后,当用户确认裁剪结果,可以使用`toDataURL()`方法将Canvas内容转换为数据URL,通常是一个Base64编码的PNG图像,然后可以发送到服务器进行存储。 在实际应用中,可能还需要考虑一些额外的功能...
Imgscalr库提供了一个高效的`scale()`方法,支持按比例缩放或指定宽度和高度。同时,还可以保持原始图像的宽高比,防止变形。 5. 完整源码与部署: "ZoomImageDemo"项目的源码包含了一个完整的解决方案,下载后...
在Web开发中,用户头像上传是一项常见的功能,特别是在社区论坛、社交网络或者个人资料管理等应用场景中。本文将深入探讨如何使用Flash技术实现头像上传及剪切处理,并结合PHP进行后端处理,实现类似Discuz论坛的...
【标题】"jsp+CropZoom+jquery+java 图片缩放裁剪" 是一个基于Web的图像处理系统,主要用于实现用户在上传头像时进行自由裁剪的功能。这个项目使用了JSP(JavaServer Pages)作为后端动态网页技术,CropZoom作为前端...
例如,`cropper.js`是一个流行的JavaScript图片裁剪插件,可以方便地集成到JSP项目中。 6. **响应式设计**:考虑到不同设备的屏幕尺寸,头像上传系统应该具有良好的响应性,适应手机、平板和桌面等多种设备。使用...
总的来说,"vue-img-cutter"插件为Vue开发者提供了一个高效、灵活的图片裁剪解决方案,使得在Web应用中实现图片裁剪功能变得更加便捷。通过了解其特性和使用方法,开发者可以轻松地将其集成到项目中,满足用户的个性...
在IT行业中,图片处理是一项常见的需求,特别是在网页和应用程序中,用户往往需要对图片进行裁剪、旋转或缩放等操作。"cropper+layui"的结合应用正是为了解决这类问题,它允许用户在前端方便地进行图像编辑,并将...
我们可以在前端进行初步验证,例如使用`accept`属性限制只能选择图片文件,或者使用`maxSize`限制文件大小。如果服务器端有更严格的要求,可以返回错误信息,前端再进行相应的提示。 总的来说,实现“html5点击修改...
Java版的头像上传、缩放和裁剪功能是许多Web应用中不可或缺的一部分,尤其是在社交网络、用户管理系统等场景下。这个源码提供了一个实现这一功能的解决方案。下面将详细介绍这个功能涉及的主要知识点: 1. **文件...
在本项目中,用户可以上传个人头像,然后系统会对上传的图片进行裁剪,生成适合特定尺寸的头像。下面将详细讲解这个过程中的关键知识点。 1. **JSP(JavaServer Pages)**:JSP是Java的一种动态网页技术,它允许...
ASP.NET 图片裁剪技术是Web开发中一种实用的功能,常用于网站的用户头像上传、产品图片展示等场景,允许用户或系统根据需求调整图片的尺寸和比例。本示例提供了一个详细的代码实现,非常适合开发者学习和借鉴。 在...
- 使用Java的BufferedImage类创建一个新的图像,然后使用Graphics2D对象进行绘制,确保缩放过程中不拉伸图像。 3. **裁切图片**: - 裁切图片可能是因为需要特定的部分或者调整为特定的长宽比。这同样可以通过...
在Web开发中,特别是在社交网络、电子商务或用户个人信息管理等应用场景中,用户头像的上传与裁剪功能是必不可少的。ImageCropper,正如其名,是一个专门用于裁剪用户头像的图像裁剪工具,它具有无依赖性的优点,...
例如,你可以创建一个可拖放的区域,用户将图片拖入后,使用Canvas元素进行实时的处理。 其次,ASP(Active Server Pages)是微软开发的一种服务器端脚本环境,它允许开发者在服务器端生成动态网页。在图片处理场景...
在IT行业中,头像上传处理插件是网页应用中常见的一种功能,主要用于用户自定义个人形象展示。在给定的“9个头像上传处理插件”中,我们可以看到涉及了多种技术和工具,如PHP、JS(JavaScript)、JQuery以及图片处理...
在本文中,我们将深入探讨`Cropper.js`的相关知识点,以及如何使用这个库来创建一个图片裁剪不失真的功能。 首先,让我们了解`Cropper.js`的核心特性。这个库提供了丰富的API和选项,允许开发者自定义裁剪区域的...
通过JavaScript,我们可以对Canvas元素进行像素级别的操作,包括绘制图像、线条、形状以及进行复杂的图像处理,如图片裁剪。 2. **图片裁剪原理**:图片裁剪的核心在于确定裁剪区域,这通常需要两个关键信息——...
为了准确反映用户在触摸屏幕时的移动和缩放,需要对触摸事件的坐标进行转换,考虑到Canvas的大小和图像的原始比例。 7. **CSS3变换**: 可以利用CSS3的`transform`属性进行缩放和平移,以实现图像的拖动和放大...