最近网上看到两种不同的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();

}

}

}

java 图片 缩略图_java 图片缩略图的两种方法相关推荐

  1. java hashmap 去重_java数组去重的两种方法

    我们对于数组元素的使用,有时候在创建数组的初期,并没有考虑过元素的重复问题.当我们想要不重复元素的数组时,就要再进行一步去重的工作.数组的去重有两种方法可以实现,一个是循环比较,另一个是hashSet ...

  2. Java构造和解析Json数据的两种方法详解一

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...

  3. [转]DES加密 java与.net可以相互加密解密两种方法

    [转]原文地址:http://jumpman.javaeye.com/blog/605996 DES加密 java与.net可以相互加密解密两种方法 文章分类:Java编程 通过这个方法可以实现jav ...

  4. Java学习笔记:创建线程的两种方法

    Java学习笔记:创建线程的两种方法 一.预备工作 1.创建Maven项目ThreadDemo 2.在pom.xml里添加依赖 二.继承Thread类创建子线程

  5. java 把图片插入窗体,JAVA JFrame窗体添加背景图像的两种方法

    首先还是要了解框架JFrame中的层次结构.JFrame中的层次分布及相对关系是:最底层是:JRootPane:第二层是:JlayerPane:最上层就是ContentPane,也正是我们常说的内容面 ...

  6. java创建线程的两种方法是_java创建线程的两种方法

    要产生一个线程,有两种方法: ◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法: ◆实现Runnalbe接口,重载Runnalbe接口中的run()方法. 哪种方法 ...

  7. java遍历文件和归类_java读取文件的两种方法:java.io和java.lang.ClassLoader

    java读取文件的两种方法:java.io和java.lang.ClassLoader 什么时候使用java.io,什么时候使用java.lang.ClassLoader呢? (注:要是之前读xml文 ...

  8. java制作验证码(kaptcha)的两种方法

    第一种: 导入jar包com.github.axet生成法 ①导包 <dependency><groupId>com.github.axet</groupId>&l ...

  9. java随机数转换_Java获取随机数的3种方法(转)

    随机数在实际中使用很广泛,比如要随即生成一个固定长度的字符串.数字.或者随即生成一个不定长度的数字.或者进行一个模拟的随机选择等等.Java提供了最基本的工具,可以帮助开发者来实现这一切. 一.Jav ...

  10. C# 将多个图片合并成TIFF文件的两种方法

    最近需要用到TIF格式的文件,研究了一段时间,终于有点结果了, 发现两种方式,第一种是使用BitMiracle.LibTiff.NET,直接在Nuget上安装即可 ,第二种是使用RasterEdge. ...

最新文章

  1. libyuv库的使用
  2. 脑细胞膜等效神经网路
  3. Javascript实现边框闪动
  4. 网站内容页面如何优化才利于排名提升?
  5. 下载了python在哪里写代码-通过python下载FTP上的文件夹的实现代码
  6. leetcode 504. 七进制数(Java版)
  7. dom 生成图片和链接生成二维码
  8. W10关闭不必要的服务
  9. 以太坊扩容项目 Arbitrum 放弃专利,即将上线主网
  10. 2022-01-11总结(补)
  11. JS实现new关键字的功能
  12. java中布尔类型的常量有哪两种,【填空题】Java中布尔型的常量有两种,它们是___和___。...
  13. js实现爬取QQ群管理页面所有QQ群成员信息
  14. python网页自动化填写-用python-webdriver实现自动填表
  15. windows IIS Web服务器 发布网站
  16. 帝国CMS安全设置大全
  17. 图片报道:2008年12月4日夜,暴风雪突袭烟台(下)
  18. Akm函数递归和非递归
  19. [好消息]大连.NET俱乐部QQ群开放注册~~~注册有好礼!
  20. 高效开发:java对象转化成String类型的四种方法

热门文章

  1. 运单编号快速加单引号和逗号
  2. 对前端的一些粗浅的认识
  3. 深入理解CSS margin折叠
  4. 如何在 SAP ABAP 系统中使用 Adobe Form 试读版
  5. 恶意代码分析实战-通过IDA对恶意代码进行静态分析(Lab05-01.dll)
  6. colorkey唇釉是否安全_colorkey唇釉孕妇可以用吗 colorkey唇釉可以用多久
  7. HTML5期末大作业:电商购物网站设计——电商购物网站设计(55页) 电商网页设计制作 简单静态HTML网页作品 购物网页作业成品 学生商城网站模板
  8. ios epub电子书阅读器demo
  9. springboot之整合Elasticsearch实现搜索
  10. 计算机基础中如何属性隐藏,-XP系统如何显示隐藏的文件夹