`
yaodi0818
  • 浏览: 136188 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java处理图片三部曲

    博客分类:
  • Code
阅读更多
1.等比例缩小或放大图片

/**
 * Create time May 31, 2009 4:33:31 PM
 */
package com.yd.image;

import java.awt.Canvas;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.AreaAveragingScaleFilter;
import java.awt.image.BufferedImage;
import java.awt.image.FilteredImageSource;
import java.io.File;

import javax.imageio.ImageIO;

/**
 * <p>Title: ZoomImage</p>
 * <p>Description: </p>
 *
 * @author Yaodi
 * @version 1.0
 */
public class ZoomImage {

	private static Component component = new Canvas();

	private static String[] imageFormatArray = new String[] { ".jpg", ".jpeg", ".gif", ".png", ".bmp" };//pcx/tga/tif这三种格式目前还不支持

	/**  
	 * 校验图像文件的格式是否可以进行缩放  
	 */
	public boolean verifyImageFormat(String fileName) {
		boolean result = false;
		for (int i = 0; i < imageFormatArray.length; i++) {
			if (fileName.toLowerCase().lastIndexOf(imageFormatArray[i]) == (fileName
					.length() - imageFormatArray[i].length())) {
				result = true;
				break;
			}
		}
		return result;
	}

	
	/**  
	 * 将目录下的所有图像进行放大缩小  
	 *   
	 * @param strDir 图像的目录  
	 * @param zoomRatio 放大缩小的倍率  
	 * @param rebuild 是否重新创建,即已经存在的图像是否覆盖重建  
	 * @throws Exception  
	 */
	public void zoom(String strDir, double zoomRatio, boolean rebuild)
			throws Exception {
		File fileDir = new File(strDir);
		if (!fileDir.exists()) {
			return;
		}
		String dirTarget = strDir + "/small" + zoomRatio;
		File fileTarget = new File(dirTarget);
		if (!fileTarget.exists()) {
			fileTarget.mkdir();
		}
		File[] files = fileDir.listFiles();
		StringBuilder stringBuilder = new StringBuilder();
		for (int i = 0; i < files.length; i++) {
			String fileFullName = files[i].getCanonicalPath();
			String fileShortName = files[i].getName();
			if (!new File(fileFullName).isDirectory())// 排除二级目录,如果想就再递归一次,这里省略   
			{
				if (verifyImageFormat(fileShortName)) {

					stringBuilder = new StringBuilder();
					stringBuilder.append(dirTarget).append("/").append(
							fileShortName);
					if (!new File(stringBuilder.toString()).exists() || rebuild) {
						try {
							createZoomSizeImage(fileFullName, stringBuilder
									.toString(), zoomRatio);
						} catch (Exception e) {

						}
					}
				}
			}
		}
	}

	
	/**  
	 * 按比例进行放大或缩小图像,zoomRatio = 1为原大,zoomRatio > 1为放大,zoomRatio < 1 为缩小  
	 */
	public void createZoomSizeImage(String fileName, String fileNameTarget,
			double zoomRatio) throws Exception {
		Image image = ImageIO.read(new File(fileName));
		int width = new Double(image.getWidth(null) * zoomRatio).intValue();
		int height = new Double(image.getHeight(null) * zoomRatio).intValue();
		AreaAveragingScaleFilter areaAveragingScaleFilter = new AreaAveragingScaleFilter(
				width, height);
		FilteredImageSource filteredImageSource = new FilteredImageSource(image
				.getSource(), areaAveragingScaleFilter);
		BufferedImage bufferedImage = new BufferedImage(width, height,
				BufferedImage.TYPE_3BYTE_BGR);
		Graphics graphics = bufferedImage.createGraphics();
		graphics.drawImage(component.createImage(filteredImageSource), 0, 0,
				null);
		ImageIO.write(bufferedImage, "JPEG", new File(fileNameTarget));
	}

	
	public static void main(String[] args) throws Exception {
		ZoomImage zoomImage = new ZoomImage();		
		zoomImage.zoom("F:/pic", 0.25, false);// 缩小2倍   		
		//zoomImage.zoom("F:/pic",2,true);// 放大2倍   
		System.out.println("************THEEND************");
	}
}



2.按坐标裁切图片

/**
 * Create time May 31, 2009 4:33:31 PM
 */
package com.yd.image;

import java.awt.Rectangle;
import java.awt.image.BufferedImage;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Iterator;

import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;


/**
 * <p>Title: CutImage</p>
 * <p>Description: </p>
 *
 * @author Yaodi
 * @version 1.0
 */
public class CutImage {
	
	private static int x_share = 8; //x切片份数
	private static int y_share = 10; //y切片份数
	private static String srcpath = "F:/pic/xiaohei.jpg"; //源图片路径名称
	private static String subpath = "F:/pic/cut/"; //剪切图片存放的目录	
	private int x; //剪切点x坐标
	private int y; //剪切点y坐标	
	private int width; //剪切点宽度
	private int height; //剪切点高度
	private int num;

	public CutImage() { }

	public CutImage(int x, int y, int width, int height, int num) {
		this.x = x;
		this.y = y;
		this.width = width;
		this.height = height;
		this.num = num;
	}

	/**
	 * 对图片裁剪,并把裁剪完的新图片保存
	 */
	public void cut() throws IOException {

		FileInputStream is = null;
		ImageInputStream iis = null;

		try {
			// 读取图片文件
			is = new FileInputStream(srcpath);

			/**
			 * 返回包含所有当前已注册 ImageReader 的 Iterator,这些 ImageReader 声称能够解码指定格式。
			 * 参数:formatName - 包含非正式格式名称 . (例如 "jpeg" 或 "tiff")等 。
			 */
			Iterator<ImageReader> it = ImageIO
					.getImageReadersByFormatName("jpg");
			ImageReader reader = it.next();
			// 获取图片流
			iis = ImageIO.createImageInputStream(is);

			/**
			 * iis:读取源.true:只向前搜索.将它标记为 ‘只向前搜索’。 此设置意味着包含在输入源中的图像将只按顺序读取,可能允许
			 * reader 避免缓存包含与以前已经读取的图像关联的数据的那些输入部分。
			 */
			reader.setInput(iis, true);

			/**
			 * <p>
			 * 描述如何对流进行解码的类
			 * <p>
			 * .用于指定如何在输入时从 Java Image I/O 框架的上下文中的流转换一幅图像或一组图像。用于特定图像格式的插件 将从其
			 * ImageReader 实现的 getDefaultReadParam 方法中返回 ImageReadParam 的实例。
			 */
			ImageReadParam param = reader.getDefaultReadParam();

			/**
			 * 图片裁剪区域。Rectangle 指定了坐标空间中的一个区域,通过 Rectangle 对象
			 * 的左上顶点的坐标(x,y)、宽度和高度可以定义这个区域。
			 */
			Rectangle rect = new Rectangle(x, y, width, height);

			// 提供一个 BufferedImage,将其用作解码像素数据的目标。
			param.setSourceRegion(rect);

			/**
			 * 使用所提供的 ImageReadParam 读取通过索引 imageIndex 指定的对象,并将 它作为一个完整的
			 * BufferedImage 返回。
			 */
			BufferedImage bi = reader.read(0, param);

			// 保存新图片
			ImageIO.write(bi, "jpg", new File(subpath + num + ".jpg"));
		} finally {
			if (is != null)
				is.close();
			if (iis != null)
				iis.close();
		}
	}

	public static void main(String[] args) throws IOException {
		BufferedImage bufferedImage = ImageIO.read(new File(srcpath));		
		File file = new File(subpath); //创建切片存放的目录
		file.mkdirs();
		
		int init_width = bufferedImage.getWidth(); //获得原始图片的宽
		int init_height = bufferedImage.getHeight(); //获得原始图片的高		
		int x = 0; //x坐标点
		int y = 0; //y坐标点
		int width = init_width / x_share; //裁切后图片的宽
		int height = init_height / y_share; //裁切后图片的高
		int sum = (init_width / width) * (init_height / height); //获得切片的总数

		for (int i = 1; i <= sum; i++) {
			if (x == init_width) {
				x = 0;
				y = y + height; //y坐标移动
			}
			CutImage ci = new CutImage(x, y, width, height, i);
			x = x + width; //x坐标移动
			try {
				ci.cut();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

		System.out.println("************THEEND************");
	}
}



图片宽和高必须要被切片份数整除

3.判断图片是否相同

/**
 * Create time May 31, 2009 4:33:31 PM
 */
package com.yd.image;

import java.io.File;
import java.security.MessageDigest;

/**
 * <p>Title: MD5Image</p>
 * <p>Description: </p>
 *
 * @author Yaodi
 * @version 1.0
 */
public class MD5Image {

	/**
	 * MD5加密的方式判断图片是否相同
	 */
	public static String MD5(byte[] s) {
		char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
				'a', 'b', 'c', 'd', 'e', 'f' };//16进制字符
		try {
			byte[] strTemp = s;
			MessageDigest mdTemp = MessageDigest.getInstance("MD5");
			mdTemp.update(strTemp);
			byte[] md = mdTemp.digest();
			int j = md.length;
			char str[] = new char[j * 2];
			int k = 0;//移位 输出字符串
			for (int i = 0; i < j; i++) {
				byte byte0 = md[i];
				str[k++] = hexDigits[byte0 >>> 4 & 0xf];
				str[k++] = hexDigits[byte0 & 0xf];
			}
			return new String(str);
		} catch (Exception e) {
			return null;
		}
	}


	public static void main(String[] args) {
		//44f24b510805d6c8ed2aec46817ebb5e
		File file = new File("F:/pic/xiaohei.jpg");
		byte[] b = new byte[(int) file.length()];
		System.out.println(MD5Image.MD5(b));
	}

}



通过生成的MD5码,进行判断筛选出文件夹中相同的图片
分享到:
评论

相关推荐

    Java图像处理类库 Java Image Filters

    Java图像处理类库,如Java Image Filters,是Java平台上的一个重要工具,用于对数字图像进行各种操作和修改。这些类库通常包含了一系列的类和方法,可以实现图像的过滤、调整、裁剪、旋转、合成等多种功能,为开发者...

    JavaCard 应用程序开发三部曲

    存和处理能力都比 J2ME 设备的要求更加苛刻。 智能卡在个人信息安全方面有很大用处。 它们可用于添加验证和安全访问到需要高 级别安全的信息系统。保存在智能卡上的信息是便携的。使用 Java Card 技术,你可能 随身...

    java处理图片背景颜色的方法

    在标签中,作者列出了四个关键词:“java 处理图片背景颜色”、“java 图片背景颜色替换”、“java 图片背景颜色更改”、“java 蓝底寸照批量转换为白底”,这些关键词都与 Java 处理图片背景颜色相关。 在部分内容...

    java实现图像处理算法

    示例代码展示了如何使用Java的图像处理库来对图像进行灰度化处理。在代码中,我们使用javax.imageio.ImageIO类加载输入图像文件,并创建一个与输入图像具有相同尺寸和类型的输出图像。然后,我们遍历输入图像的每个...

    java+png透明图片处理方法

    在Java编程语言中,处理PNG图像的透明度是一项常见的任务,尤其在创建用户界面或进行图形设计时。PNG格式支持alpha通道,这使得它能够表示不同程度的透明度,即所谓的“半透明”。以下是一些关于如何在Java中处理PNG...

    数字图像处理:JAVA语言实现

    《数字图像处理:JAVA语言实现》是一门涵盖了图像处理理论与实践的教程,它通过JAVA编程语言来讲解和实现各种图像处理技术。本教程旨在帮助学习者深入理解图像处理的基本概念,掌握用JAVA进行图像处理的方法,并能...

    Java图片处理类库SimpleImage.zip

    SimpleImage是阿里巴巴的一个Java图片处理的类库,可以实现图片缩略、水印等处理。 SimpleImage中的ImageRender是图片处理的基类,它是一个抽象类,我们看到,该类中定义了一个抽象方法render(),同时持有一个对...

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

    在压缩包中的"java图片大小转换"文件中,很可能包含了实现这些功能的示例代码和使用说明,可以参考学习以加深理解。在实际开发中,我们还可以借助第三方库如`ImageMagick`、`Java Advanced Imaging (JAI)`或`JavaFX`...

    java图片处理

    文件内含java 处理图片大小等比例缩放,指定颜色改变颜色。根据不同图片设置阴影图片。

    java 处理图像的明暗度

    在Java编程语言中,处理图像的明暗度是一项常见的任务,尤其在图像处理、图形用户界面(GUI)应用或者游戏开发中。这个过程通常涉及到图像的色彩空间转换、亮度调整和对比度修改等技术。本文将深入探讨如何使用Java...

    Java图片处理工具ImageMagick

    Java图片处理工具ImageMagick是一个强大的跨平台图形处理库,它允许开发人员在Java应用程序中进行复杂的图像操作,包括但不限于转换、编辑、合成图像以及处理大量格式的图像文件。ImageMagick是由C语言编写的,但...

    java图片高级处理(渐变,锐化,边缘检测)

    总的来说,Java图片高级处理涉及多个层次的技术,从简单的颜色变换到复杂的数学算法,都需要扎实的编程基础和对图像处理原理的理解。通过学习和实践,你可以创建出具有独特视觉效果的应用程序或工具,满足各种图像...

    曲线拟合计算(java实现)

    总的来说,这个项目展示了如何利用Java进行曲线和直线拟合,涉及到的知识点包括:Java编程基础、数值分析中的最小二乘法、多项式拟合、线性代数中的矩阵运算以及相关的第三方库的使用。对于学习和理解这些概念,这个...

    java 水印 图像处理 图片分割 裁剪 缩放

    Java图像处理技术是Java开发中的一个重要领域,涵盖了多种操作,如添加水印、图像分割、裁剪和缩放。在本项目中,这些功能被整合到一个完整的程序中,并通过单元测试进行了验证,确保了各个功能的正确性。此外,程序...

    JAVA-web数字图像处理基础

    12. **框架和库**:如JavaFX、JavaCV、OpenCV、ImageJ等第三方库可以增强Java的图像处理能力,简化复杂任务的实现。 以上是关于"JAVA-web数字图像处理基础"的一些核心概念。学习并掌握这些知识将使开发者能够有效地...

    java 图片旋转、翻转、镜像处理

    在Java编程语言中,处理图像是一项常见的任务,包括图片的旋转、翻转和镜像操作。这些功能在很多场景下都很实用,例如照片编辑、图像处理应用或是网页开发。本篇将详细介绍如何使用Java实现这些功能,并以`ImgRotate...

    java图像处理

    Java图像处理是一个广泛的领域,它涵盖了众多用于操作和分析图像的技术。在这个领域中,我们可以使用Java语言来实现图像的创建、读取、显示、编辑以及分析。以下是对标题和描述中涉及的一些关键知识点的详细解释: ...

    java源码-基于图像处理的车牌识别源码.zip

    4. Java图像处理库:Java中,可以使用Java AWT和Swing库进行基本的图像操作,但为了实现复杂的图像处理功能,项目可能引入了如OpenCV、JavaCV或ImageJ等第三方库。这些库提供了丰富的图像处理函数,简化了开发过程。...

    java图形与图像处理

    Java图形与图像处理是Java程序设计的一个重要领域,主要涉及如何在Java环境中创建和操作图形以及处理图像。在Java中,我们通常使用`java.awt`和`java.awt.image`这两个包来实现图形与图像的处理。 标题中的"java...

    基于java的图像分割(数字图像处理)

    本项目是基于Java实现的图像分割算法,涉及到的知识点广泛,包括全局阈值分割、Roberts边缘检测以及灰度图像处理和直方图分析。 1. **全局阈值分割**: 全局阈值分割是一种简单的二值化方法,它通过设定一个全局...

Global site tag (gtag.js) - Google Analytics