`
chenhua_1984
  • 浏览: 1232862 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

java 图片缩略图的两种方法

    博客分类:
  • java
阅读更多

   最近网上看到两种不同的java图片缩略图的绘制方案

 

    第一种,使用Graphics().drawImage按照一定的比例重新绘制图像。

 

package com.image.suoluetu;

import java.io.*;
import java.awt.*;
import java.awt.image.*;
import com.sun.image.codec.jpeg.*;

public class DrawImage {
	private String destFile;
	private int width;
	private int height;
	private Image img;

	public DrawImage(String fileName) throws IOException {
		File _file = new File(fileName); // 读入文件
		_file.getName();
		this.destFile = "D:/dage2.jpg";// this.srcFile.substring(0,
										// this.srcFile.lastIndexOf("."))
										// +"_s.jpg";
		img = javax.imageio.ImageIO.read(_file); // 构造Image对象
		width = img.getWidth(null); // 得到源图宽
		height = img.getHeight(null); // 得到源图长
	}

	/**
	 * /**
	 * 
	 * @param args
	 */
	public void resize(int w, int h) throws IOException {
		try {
			BufferedImage _image = new BufferedImage(w, h,
					BufferedImage.TYPE_INT_RGB);
			_image.getGraphics().drawImage(img, 0, 0, w, h, null); // 绘制缩小后的图
			FileOutputStream newimageout = new FileOutputStream(destFile); // 输出到文件流
			/*
			 * JPEGImageEncoder 将图像缓冲数据编码为 JPEG 数据流。该接口的用户应在 Raster 或
			 * BufferedImage 中提供图像数据,在 JPEGEncodeParams 对象中设置必要的参数, 并成功地打开
			 * OutputStream(编码 JPEG 流的目的流)。JPEGImageEncoder 接口可 将图像数据编码为互换的缩略
			 * JPEG 数据流,该数据流将写入提供给编码器的 OutputStream 中。
			 * 注意:com.sun.image.codec.jpeg 包中的类并不属于核心 Java API。它们属于 Sun 发布的 JDK
			 * 和 JRE 产品的组成部分。虽然其它获得许可方可能选择发布这些类,但开发人员不能寄 希望于从非 Sun
			 * 实现的软件中得到它们。我们期望相同的功能最终可以在核心 API 或标准扩 展中得到。
			 */
			JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(newimageout);
			encoder.encode(_image); // 近JPEG编码
			newimageout.close();
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	/**
	 * 按照固定的比例缩放图片
	 * 
	 * @param t
	 *            double 比例
	 * @throws IOException
	 */
	public void resize(double t) throws IOException {
		int w = (int) (width * t);
		int h = (int) (height * t);
		resize(w, h);
	}

	/**
	 * 以宽度为基准,等比例放缩图片
	 * 
	 * @param w
	 *            int 新宽度
	 * @throws IOException
	 */
	public void resizeByWidth(int w) throws IOException {
		int h = (int) (height * w / width);
		resize(w, h);
	}

	/**
	 * 以高度为基准,等比例缩放图片
	 * 
	 * @param h
	 *            int 新高度
	 * @throws IOException
	 */
	public void resizeByHeight(int h) throws IOException {
		int w = (int) (width * h / height);
		resize(w, h);
	}

	/**
	 * 按照最大高度限制,生成最大的等比例缩略图
	 * 
	 * @param w
	 *            int 最大宽度
	 * @param h
	 *            int 最大高度
	 * @throws IOException
	 */
	public void resizeFix(int w, int h) throws IOException {
		if (width / height > w / h) {
			resizeByWidth(w);
		} else {
			resizeByHeight(h);
		}
	}

	/**
	 * 设置目标文件名 setDestFile
	 * 
	 * @param fileName
	 *            String 文件名字符串
	 */
	public void setDestFile(String fileName) throws Exception {
		if (!fileName.endsWith(".jpg")) {
			throw new Exception("Dest File Must end with \".jpg\".");
		}
		destFile = fileName;
	}

	/**
	 * 获取目标文件名 getDestFile
	 */
	public String getDestFile() {
		return destFile;
	}

	/**
	 * 获取图片原始宽度 getSrcWidth
	 */
	public int getSrcWidth() {
		return width;
	}

	/**
	 * 获取图片原始高度 getSrcHeight
	 */
	public int getSrcHeight() {
		return height;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			DrawImage ccc = new DrawImage("D:/dage.jpg");
			ccc.resizeFix(600, 400);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

 第二种:使用仿射转换的技术进行图片绘制。

 

package com.image.suoluetu;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.awt.image.AffineTransformOp;
import java.awt.geom.AffineTransform;

public class AffineTransImage {

	public static void main (String argv[]) {
		try {
			File fi = new File("D:/dage.jpg"); //大图文件
			File fo = new File("D:/dagex.jpg"); //将要转换出的小图文件
			int nw = 500;
			/*
			AffineTransform 类表示 2D 仿射变换,它执行从 2D 坐标到其他 2D
			坐标的线性映射,保留了线的“直线性”和“平行性”。可以使用一系
			列平移、缩放、翻转、旋转和剪切来构造仿射变换。
			*/
			AffineTransform transform = new AffineTransform();
			BufferedImage bis = ImageIO.read(fi); //读取图片
			int w = bis.getWidth();
			int h = bis.getHeight();
			 //double scale = (double)w/h;
			int nh = (nw*h)/w ;
			double sx = (double)nw/w;
			double sy = (double)nh/h;
			transform.setToScale(sx,sy); //setToScale(double sx, double sy) 将此变换设置为缩放变换。
			System.out.println(w + " " +h);
			/*
			 * AffineTransformOp类使用仿射转换来执行从源图像或 Raster 中 2D 坐标到目标图像或
			 *  Raster 中 2D 坐标的线性映射。所使用的插值类型由构造方法通过
			 *  一个 RenderingHints 对象或通过此类中定义的整数插值类型之一来指定。
			如果在构造方法中指定了 RenderingHints 对象,则使用插值提示和呈现
			的质量提示为此操作设置插值类型。要求进行颜色转换时,可以使用颜色
			呈现提示和抖动提示。 注意,务必要满足以下约束:源图像与目标图像
			必须不同。 对于 Raster 对象,源图像中的 band 数必须等于目标图像中
			的 band 数。
			*/
			AffineTransformOp ato = new AffineTransformOp(transform,null);
			BufferedImage bid = new BufferedImage(nw,nh,BufferedImage.TYPE_3BYTE_BGR);
			/*
			 * TYPE_3BYTE_BGR 表示一个具有 8 位 RGB 颜色分量的图像,
			 * 对应于 Windows 风格的 BGR 颜色模型,具有用 3 字节存
			 * 储的 Blue、Green 和 Red 三种颜色。
			*/
			ato.filter(bis,bid);
			ImageIO.write(bid,"jpeg",fo);
		} catch(Exception e) {
			e.printStackTrace();
		}
	}

}

 

分享到:
评论

相关推荐

    jQuery实现等比例缩放大图片让大图片自适应页面布局

    通常我们处理缩略图是使用后台代码(PHP、.net、Java等)根据大图片生成一定尺寸的缩略图,来供前台页面调用,当然也有使用前台javascript脚本将加载后的大图强行缩放,变成所谓的缩略图,这种方法不可取。...

    Mrthumb:【拇指先生】 a simple easy video thumbnail provider,顺滑的获取视频缩略图,支持本地和网络视频,有问题大胆提Issues

    拇指先生 Mrthumb 预览图 库说明 a simple easy video thumbnail provider 顺滑的获取视频缩略图 ...获取不到缩略图时取最近的缩略图 引用说明 allprojects { repositories { ... maven { url 'https://jitpack.

    Android_Gallery:Android Gallery 将图片连接到图片的 URL

    网格视图中的每个缩略图都支持两种功能。 首先,简单地点击缩略图会弹出一个新活动,在整个设备显示屏上显示所选汽车的完整图片。 用户可以通过选择手机上的“返回”软按钮返回到网格视图。 长按任何缩略图会弹出...

    images-ms:一个简单的Java项目,用于比较微服务与Spring和Dropwizard的实现

    目前只有一种尺寸可用:缩略图。 如果存储桶上不存在调整大小的图像,则会生成并存储新的图像。 当然,原始图像应该已经就位,以便调整大小。 该项目包含两个模块: 用于处理所有图像处理的核心项目。 带有 REST ...

    JSP实用技巧集合,jsp编程的一些小技巧总结

    jsp编程的一些小技巧总结,绝对实用。包括JSP编程中常用的js技术。 1.JSP编程中常用的js技术 2. 在下拉列表框里选择一个值后跳出新窗口? 3. 在JSP中启动execl? 4. 两级下拉列表框联动菜单...121.上传图片并生成缩略图?

    javapms门户网站源码

    添加或修改文章时,可设置文档所属栏目、标题、外部链接、副标题、标题颜色、短标题、自动Tag标签、摘要、来源、来源链接、作者、文档类型、文档属性、推荐、置顶、缩略图、文档内容、内容显示模板、发布时间等,...

    h15_client_FreeFoodApp:我们在2015年Huji hackathon中创建的应用程序,可让饥饿的学生在校园内寻找食物

    基本上,该应用明智地使用了两种资源: 与Parse.com服务器进行交互的单例,以上传和下载有关Food类的信息(标题,详细信息,缩略图,位置...) 与google location api对话以获取用户位置的服务另外,还有一些奇特...

    JAVA WEB典型模块与项目实战大全

    2.1 使用jsp的两种模式  2.2 struts框架的实现  2.3 hibernate框架的实现  2.4 jpa框架的实现  2.5 spring框架的实现  2.6 jsf框架的实现  2.7 ajax框架的实现  2.8 使用jdbc连接数据库  2.9 小结...

    网管教程 从入门到精通软件篇.txt

    JAR:Java档案文件(一种用于applet和相关文件的压缩文件) JAVA:Java源文件 JFF,JFIF,JIF:JPEG文件 JPE,JPEG,JPG:JPEG图形文件 JS:javascript源文件 JSP:HTML网页,其中包含有对一个Java servlet...

    jsp编程技巧集锦

    上传图片并生成缩略图? 122.JS实现图形菜单中点击当前图片变另一幅图片? 123.无刷新页面自动刷新? 124.写文件? 125.怎么得到鼠标点击在线图片的位置坐标? 126.页面单线程? 127.数字转中文 ...

    程序员考试刷题-oca-preparation:准备OCA认证的一些示例和文件

    数字文字可能在两个数字之间包含下划线,并以 1-9、0、0x、0X、0b、0B 开头。 类中元素的顺序 元素 例子 必需的 它去哪里? 包装声明 包 abc; 不 文件中的第一行 导入语句 导入 java.util.*; 不 打包后立即 类声明 ...

    PHPCMS 文件管理器(原Longbill文件管理器) v4.03

    在图标模式下可以预览图片文件的缩略图。 7.强大的编辑器可以实现自动缩进,显示行号 和 字符替换等功能。 8.自定义风格模板。内置6套模板。 <br>v4.03新增: 1.增加搜索功能!可以搜索文件名和文件...

    customgallery:mobindustry-自定义android画廊示例

    customGallery有两种类型。 首先输入您可以在所附屏幕上看到的默认设计。 第二种类型是您通过帮助GalleryOptions对象创建的自定义类型(说明如何使用它,请参见下文)。 屏幕截图 要求 该库要求使用Android API 14...

    《算法》中文版,Robert Sedgewick,塞奇威克

    2.1.5 比较两种排序算法 2.1.6 希尔排序 2.2 归并排序 2.2.1 原地归并的抽象方法 2.2.2 自顶向下的归并排序 2.2.3 自底向上的归并排序 2.2.4 排序算法的复杂度 2.3 快速排序 2.3.1 基本算法 2.3.2 性能...

    算法 第4版 高清中文版

    2.1.5 比较两种排序算法 159 2.1.6 希尔排序 162 2.2 归并排序 170 2.2.1 原地归并的抽象方法 170 2.2.2 自顶向下的归并排序 171 2.2.3 自底向上的归并排序 175 2.2.4 排序算法的复杂度 177 2.3 快速排序 182...

    算法-第4版-完整版

    2.1.5 比较两种排序算法 159 2.1.6 希尔排序 162 2.2 归并排序 170 2.2.1 原地归并的抽象方法 170 2.2.2 自顶向下的归并排序 171 2.2.3 自底向上的归并排序 175 2.2.4 排序算法的复杂度 177 ...

    算法 第4版-谢路云译-带完整书签

    2.1.5 比较两种排序算法 159 2.1.6 希尔排序 162 2.2 归并排序 170 2.2.1 原地归并的抽象方法 170 2.2.2 自顶向下的归并排序 171 2.2.3 自底向上的归并排序 175 2.2.4 排序算法的复杂度 177 2.3 快速...

    算法,4th,塞奇威克 (Robert Sedgewick)韦恩 (Kevin Wayne), 谢路云 译.azw3

    2.1.5 比较两种排序算法 2.1.6 希尔排序 2.2 归并排序 2.2.1 原地归并的抽象方法 2.2.2 自顶向下的归并排序 2.2.3 自底向上的归并排序 2.2.4 排序算法的复杂度 2.3 快速排序 2.3.1 基本算法 2.3.2 性能特点...

    asp.net知识库

    在ASP.Net中两种利用CSS实现多界面的方法 如何在客户端调用服务端代码 页面一postback,它就显示页面的最顶端,怎样让它定位在某一位置? 如何保证页面刷新后的滚动条位置 清除网页历史记录,屏蔽后退按钮! 如何传值...

    CS-478---Software-Development-for-Mobile-Platforms-Android-

    每个网格单元格都支持两种功能,具体取决于应用程序查看器在单元格上执行的是短单击还是长按。 短按会带来一个新活动,该活动将在整个设备显示屏上显示所选汽车的整个图片。 用户可以通过选择电

Global site tag (gtag.js) - Google Analytics