`
雨打蕉叶
  • 浏览: 236939 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

java剪裁图片的一些收获

阅读更多
最近要实现把用户上传的图片转换为500宽,245*200,102*85,大小的格式,要保证图片质量,又要高效率。下面是我试过的一下方法。
方法一:效率高,质量低

import java.awt.Graphics;

import java.awt.image.BufferedImage;
import java.io.File;

import java.io.IOException;


import javax.imageio.ImageIO;


public class ImageUtils{
	

	/**
	 * 对图片进行缩小
	 * @param originalImage 原始图片
	 * @param times 缩小倍数
	 * @return 缩小后的图像
	 */
	public static BufferedImage  zoomImage(BufferedImage  originalImage,double  times){
		int width = (int) ((int)originalImage.getWidth()*times);
		int height = (int) ((int)originalImage.getHeight()*times);
		System.out.println("width:"+width+" height:"+height);
		BufferedImage newImage = new BufferedImage(width,height,originalImage.getType());
		Graphics g = newImage.getGraphics();
		g.drawImage(originalImage, 0,0,width,height,null);
		g.dispose();
		return newImage;
	}
	

	/**
	 * 截取图片
	 * @param path 图片路径
	 * @param x 开始位置x坐标
	 * @param y 开始位置y坐标
	 * @param width 宽度
	 * @param height 高度
	 * @return 图片保存的url
	 */

	public static BufferedImage cutting(BufferedImage bufferedImage,int x,int y,int width,int height){
			return bufferedImage.getSubimage(x, y, width, height);
	}
	/**
	 * 处理图片 获得102*85,245*200,宽500等比例缩放
	 * @param path 图片路径
	 * @return 处理成功返回true,处理失败返回false
	 */
	public static boolean afterPostPhoto(String path){
		BufferedImage bufferedImage = null;
		String suffix=path.substring(path.lastIndexOf(".")+1, path.length());
		
		try {
			bufferedImage =  ImageIO.read(new File(path));
			double x=bufferedImage.getWidth();
			double y=bufferedImage.getHeight();
			System.out.println("x="+x+",y="+y);
			if(x>500){
				double times=500/x;
				
			
				ImageIO.write(zoomImage(bufferedImage, times), suffix, new File(path.substring(0, path.lastIndexOf("."))+"L"+path.substring(path.lastIndexOf("."), path.length())));
			}
			if(x>245){
				
				double times;
				if(x/y>1.225){
					 times=200/y;
					
				}else{
					 times=245/x;
				}
				
				ImageIO.write(cutting(zoomImage(bufferedImage, times), 0, 0, 245, 200), suffix, new File(path.substring(0, path.lastIndexOf("."))+"M"+path.substring(path.lastIndexOf("."), path.length())));
			}
			
			if(x>102){
				double times;
				if(x/y>1.2){
					 times=85/y;
					
				}else{
					 times=102/x;
				}
				
				ImageIO.write(cutting(zoomImage(bufferedImage, times), 0, 0, 102, 85), suffix, new File(path.substring(0, path.lastIndexOf("."))+"S"+path.substring(path.lastIndexOf("."), path.length())));
			
			}
			
		} catch (IOException e) {
			
			e.printStackTrace();
			return false;
		}
			return true;
	}
	public static boolean afterSetIcon(String path){
		BufferedImage bufferedImage = null;
		double times;
		String suffix=path.substring(path.lastIndexOf(".")+1, path.length());
		try {
			bufferedImage =  ImageIO.read(new File(path));
		} catch (IOException e) {
			
			e.printStackTrace();
			return false;
		}
		double x=bufferedImage.getWidth();
		double y=bufferedImage.getHeight();
		if(x/y>1){
			 times=x/y;
		}
		else if(y/x>1){
			times=y/x;
		}
		return true;
	}
	/**
	 * 检查图片分辨率是否大于300*200
	 * 大于300*200返回true,执行上传,否则返回
	 * false并删除图片
	 * @param path 图片路径
	 * @return 大于300*200返回true,否则返回false
	 */
	public static boolean checkUpload(String path){
		BufferedImage bufferedImage = null;
		
		try {
			bufferedImage =  ImageIO.read(new File(path));
			double x=bufferedImage.getWidth();
			double y=bufferedImage.getHeight();
			if(x<300||y<200){
				return false;
			}
		} catch (IOException e) {
			
			e.printStackTrace();
			return false;
		}
		return true;
		
	}
	public static void main(String[] args) {
		
		afterPostPhoto("F:/照片/春天的足迹/1.jpg");
	//	System.out.println(x/y);
	}

方法二:质量高,效率低
package image.too;

import com.sun.image.codec.jpeg.ImageFormatException;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;

import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import javax.imageio.stream.ImageOutputStream;
import javax.swing.*;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.Kernel;
import java.awt.image.ConvolveOp;

public class ImagePro {
	/**
	 * 图片缩放
	 * 
	 * @param originalFile
	 *            源文件
	 * @param resizedFile
	 *            目标文件
	 * @param newWidth
	 *            新图片的宽度
	 * @param quality
	 *            成像质量
	 * @throws IOException
	 */
	public static void resize(File originalFile, File resizedFile,
			int newWidth, float quality) throws IOException {
		BufferedImage bufferedImage = resize(originalFile, newWidth, quality);

		savaImage(bufferedImage, resizedFile);

	}

	public static void savaImage(BufferedImage bufferedImage, File resizedFile)
			throws ImageFormatException, IOException {
		FileOutputStream out = new FileOutputStream(resizedFile);

		// Encodes image as a JPEG data stream
		JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);

		JPEGEncodeParam param = encoder
				.getDefaultJPEGEncodeParam(bufferedImage);

		param.setQuality(1.0f, true);

		encoder.setJPEGEncodeParam(param);
		encoder.encode(bufferedImage);
	}

	/** 截取图片 */
	public static void cutting(File file, File newFile, int x, int y,
			int width, int height) {
		try {
			String endName = file.getName();
			endName = endName.substring(endName.lastIndexOf(".") + 1);
			Iterator<ImageReader> readers = ImageIO
					.getImageReadersByFormatName(endName);
			ImageReader reader = (ImageReader) readers.next();
			InputStream is = new FileInputStream(file);
			ImageInputStream iis = ImageIO.createImageInputStream(is);
			reader.setInput(iis, true);
			ImageReadParam param = reader.getDefaultReadParam();
			Rectangle rect = new Rectangle(x, y, width, height);
			param.setSourceRegion(rect);
			BufferedImage bi = reader.read(0, param);
			ImageOutputStream out = ImageIO
					.createImageOutputStream(new FileOutputStream(newFile));
			ImageIO.write(bi, endName, out);

		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	public static BufferedImage resize(File originalFile, int newWidth,
			float quality) throws IOException {

		if (quality > 1) {
			throw new IllegalArgumentException(
					"Quality has to be between 0 and 1");
		}

		ImageIcon ii = new ImageIcon(originalFile.getCanonicalPath());
		Image i = ii.getImage();
		Image resizedImage = null;

		int iWidth = i.getWidth(null);
		int iHeight = i.getHeight(null);

		if (iWidth > iHeight) {
			resizedImage = i.getScaledInstance(newWidth, (newWidth * iHeight)
					/ iWidth, Image.SCALE_AREA_AVERAGING);
		} else {
			resizedImage = i.getScaledInstance((newWidth * iWidth) / iHeight,
					newWidth, Image.SCALE_AREA_AVERAGING);
		}

		// This code ensures that all the pixels in the image are loaded.
		Image temp = new ImageIcon(resizedImage).getImage();

		// Create the buffered image.
		BufferedImage bufferedImage = new BufferedImage(temp.getWidth(null),

		temp.getHeight(null), BufferedImage.TYPE_INT_RGB);

		// Copy image to buffered image.
		Graphics g = bufferedImage.createGraphics();

		// Clear background and paint the image.
		g.setColor(Color.white);
		g.fillRect(0, 0, temp.getWidth(null), temp.getHeight(null));
		g.drawImage(temp, 0, 0, null);
		g.dispose();

		// Soften.
		float softenFactor = 0.05f;
		float[] softenArray = { 0, softenFactor, 0, softenFactor,
				1 - (softenFactor * 4), softenFactor, 0, softenFactor, 0 };
		Kernel kernel = new Kernel(3, 3, softenArray);
		ConvolveOp cOp = new ConvolveOp(kernel,

		ConvolveOp.EDGE_NO_OP, null);
		bufferedImage = cOp.filter(bufferedImage, null);

		return bufferedImage;
	}

	/**
	 * 处理图片 获得102*85,245*200,宽500等比例缩放
	 * 
	 * @param path
	 *            图片路径
	 * @return 处理成功返回true,处理失败返回false
	 */
	public static boolean process(String path) {
		File file = new File(path);
		BufferedImage bufferedImage = null;
	

		try {
			bufferedImage = ImageIO.read(new File(path));
			double x = bufferedImage.getWidth();
			double y = bufferedImage.getHeight();
			System.out.println("x=" + x + ",y=" + y);
			if (x > 500) {
				resize(file,
						new File(path.substring(0, path.lastIndexOf("."))
								+ "L"
								+ path.substring(path.lastIndexOf("."),
										path.length())), 500, 1.0f);
			} else {

				copyImage(
						file,
						new File(path.substring(0, path.lastIndexOf("."))
								+ "L"
								+ path.substring(path.lastIndexOf("."),
										path.length())));
			}

			if (x > 245) {

				int iWidth;
				if (x / y > 1.225) {
					iWidth = (int) (x * 200 / y);

				} else {
					iWidth = 245;
				}
				resize(file,
						new File(path.substring(0, path.lastIndexOf("."))
								+ "M"
								+ path.substring(path.lastIndexOf("."),
										path.length())), iWidth, 1.0f);

			} else {

				copyImage(
						file,
						new File(path.substring(0, path.lastIndexOf("."))
								+ "M"
								+ path.substring(path.lastIndexOf("."),
										path.length())));
			}

			if (x > 102) {
				int iWidth;
				if (x / y > 1.2) {
					iWidth = (int) (x * 85 / y);

				} else {
					iWidth = 102;
				}
				resize(file,
						new File(path.substring(0, path.lastIndexOf("."))
								+ "S"
								+ path.substring(path.lastIndexOf("."),
										path.length())), iWidth, 1.0f);

			} else {

				copyImage(
						file,
						new File(path.substring(0, path.lastIndexOf("."))
								+ "S"
								+ path.substring(path.lastIndexOf("."),
										path.length())));
			}

		} catch (IOException e) {

			e.printStackTrace();
		}
		return true;
	}

	/**
	 * 复制文件
	 * 
	 * @param source
	 *            源文件
	 * @param destination
	 *            目标文件
	 */
	public static void copyFile(File source, File destination) {

		FileInputStream sourceFile = null;
		FileOutputStream destinationFile = null;
		try {

			destination.createNewFile();

			sourceFile = new FileInputStream(source);
			destinationFile = new FileOutputStream(destination);
			BufferedReader br = new BufferedReader(new FileReader(source));
			// ByteArrayInputStream bin=new ByteArrayInputStream(br.r)
			BufferedWriter bw = new BufferedWriter(new FileWriter(destination));

			String str = null;
			while ((str = br.readLine()) != null) {
				bw.write(str);
				bw.newLine();
				bw.flush();
			}

		} catch (FileNotFoundException f) {
		} catch (IOException e) {
		} finally {

			try {
				sourceFile.close();
			} catch (Exception e) {
			}
			try {
				destinationFile.close();
			} catch (Exception e) {
			}
		}
	}

	public static void copyImage(File source, File destination) {

		FileInputStream fi = null;
		try {
			fi = new FileInputStream(source);
		} catch (FileNotFoundException e) {

			e.printStackTrace();
		}
		BufferedInputStream in = new BufferedInputStream(fi);
		FileOutputStream fo = null;
		try {
			fo = new FileOutputStream(destination);
		} catch (FileNotFoundException e) {

			e.printStackTrace();
		}
		BufferedOutputStream out = new BufferedOutputStream(fo);

		byte[] buf = new byte[1024];
		int len;
		try {
			len = in.read(buf);
			while (len != -1) {
				out.write(buf, 0, len);
				len = in.read(buf);
			}
			out.close();
			fo.close();
			in.close();
			fi.close();
		} catch (IOException e) {

			e.printStackTrace();
		}

	}

	public static void main(String[] args) throws IOException {
		// File originalImage = new File("C:\\11.jpg");
		// resize(originalImage, new File("c:\\11-0.jpg"),150, 0.7f);
		// resize(originalImage, new File("c:\\11-1.jpg"),150, 1f);
		// File originalImage = new File("E:/1.jpg");
		// resize(originalImage, new File("E:/1203-0.png"), 500, 0.7f);
		// resize(originalImage, new File("E:/1203-1.png"), 500, 1f);
		long time = System.currentTimeMillis();
		process("E:/1.jpg");
		System.out.println(System.currentTimeMillis() - time);
		// copyImage(new File("E:/Post.java"), new File("E:/Post2.java"));
		// copyImage("E:/1.jpg","E:/1_0.jpg");
	}
}

在网上找了找相关的资料,发现有个开源的框架jmagick.org,http://www.jmagick.org/lenya/jmagick/live/download.html,正在验证中……
分享到:
评论

相关推荐

    java图片裁剪

    在Java编程语言中,图片裁剪是一项常见的图像处理任务,主要涉及到对图像的选取和截取,以便获得图像的一部分或按特定比例调整图像大小。Java提供了多种库和API来实现这个功能,使得开发者能够轻松地处理图像裁剪的...

    java实现图片的裁剪

    使用java代码,实现图片的裁剪,可以将图片按照要求进行裁剪。

    java处理裁剪图片(更改图片大小)

    在Java编程中,处理图像操作是一项常见的任务,其中包括裁剪图片和更改图片尺寸。下面将详细介绍这三种方法。 首先,我们来谈谈使用第三方工具ImageMagick。ImageMagick是一款强大的命令行工具,能够处理各种图像...

    java对图片进行操作.rar_java 图片剪裁_java图片_图片

    本资源“java对图片进行操作.rar”提供了一种用Java进行图像操作的工具类,特别关注于图片的剪裁、重置大小以及按比例缩小等功能。以下是关于这些功能的详细解释和实现方法。 首先,图片剪裁是调整图像大小并提取其...

    java图片上传、控制大小、宽度高度和图片裁剪并保存

    在Java编程中,图片处理是一项常见的任务,包括图片的上传、尺寸控制、宽高调整以及裁剪和保存等操作。这些功能在Web应用、图像处理软件或者数据分析项目中都有广泛的应用。下面我们将深入探讨如何使用Java实现这些...

    java 裁剪图片

    在JAVA编程里,实现图片的裁剪。java 图片裁剪 裁剪图片。

    java裁剪、缩放图片工具类

    这个"java裁剪、缩放图片工具类"提供了这样的功能。它包含两个主要的组件:一个工具类(ImgUtils.java)和一个测试类(Test.java)。让我们深入探讨这两个类及其背后的图像处理原理。 首先,`ImgUtils.java`是核心...

    java图片裁剪,裁剪完新图片保存

    在给定的代码中,我们看到以下关键步骤用于实现 Java 图片裁剪: 1. **初始化参数**:`srcpath` 存储源图片的路径,`subpath` 存储裁剪后图片的保存路径,`x`, `y`, `width`, 和 `height` 分别表示裁剪的起始坐标和...

    java 图片裁剪

    在Java编程语言中,图片裁剪是一项常见的任务,特别是在网页设计、图像处理或者应用程序开发中。这个主题涉及到Java的图形处理API,如Java AWT(Abstract Window Toolkit)和Swing库。下面我们将深入探讨如何使用...

    java实现的图片裁剪源码

    自己写的一个java实现的图片裁剪源码,一个简单实现类,简单实用。

    Java实现图片裁剪预览

    在Java编程中,图片裁剪预览是一项常见的需求,它广泛应用于各种图像处理软件和Web应用中,如社交网络的头像上传、照片编辑工具等。实现这一功能,我们需要掌握几个核心知识点,包括图片处理库的使用、图像的裁剪...

    java上传并裁剪图片

    在Java编程中,上传并裁剪图片是一项常见的需求,尤其在Web应用中,例如用户头像设置、商品图片处理等场景。本篇文章将详细介绍如何在Java环境中实现这一功能。 首先,图片上传通常涉及到客户端(如浏览器)与...

    java图片等比压缩后裁剪

    在Java编程中,图片处理是一项常见的任务,包括图片的压缩和裁剪。在这个场景中,我们关注的是如何实现“图片等比压缩后裁剪”。等比压缩是指保持原图宽高比例进行压缩,以避免图像失真,而裁剪则是根据特定需求去除...

    jquery crop+java 裁剪上传图片

    本项目聚焦于“jQuery Crop”与Java结合实现图片的裁剪上传功能,这是一个前端与后端协作的重要应用场景。 首先,`jQuery Crop` 是一个基于 jQuery 的图片裁剪插件,它允许用户在客户端对图片进行缩放、移动、旋转...

    java处理图片大小等比例缩放,自定义修改图片大小,截取,水印

    在Java编程语言中,处理图片是一项常见的任务,包括调整图片大小、等比例缩放、裁剪、压缩以及添加水印等。以下将详细介绍这些知识点: 1. **等比例缩放图片**: 在Java中,我们可以使用`java.awt.image....

    Java Servlet版图片裁剪

    【Java Servlet版图片裁剪】技术是Web开发中一种实现图像处理的方式,它结合了Java Servlet、AJAX和JCrop库,提供了用户友好的图片裁剪功能。在本项目中,开发者利用Servlet作为服务器端的核心处理组件,处理来自...

    java图片的上传裁剪功能实现

    在Java编程中,图片的上传和裁剪是常见的功能需求,尤其在开发Web应用或移动应用时。这个功能涉及到客户端的文件上传、服务器端的文件处理以及可能的图像操作库的使用。以下是对这一主题的详细说明: 1. **文件上传...

    java实现人脸识别并裁剪人脸图片

    19年10月3号更新 新资源地址https://download.csdn.net/download/b379685397/11831772。 使用教程见https://blog.csdn.net/b379685397/article/details/101940373 有问题可以私信我哦

    Thumbnails图片处理压缩/裁剪java代码纯净示例+注释详细

    在Java开发中,图片处理是一项常见的任务,包括压缩、裁剪、旋转以及添加水印等。`Thumbnails`是一个强大的库,它简化了这些操作,提供了直观且易于使用的API。本示例将深入讲解如何使用`Thumbnails`库进行图片处理...

Global site tag (gtag.js) - Google Analytics