java读取图片缩略方法_java 图片缩略图的两种方法

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

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

Java代码

b8b985f4c1e8df4abf49fa830f2f9701.png

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();

}

}

}

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

Java代码

b8b985f4c1e8df4abf49fa830f2f9701.png

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();

}

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/302819.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python项目可以有多大?最多可以有多少行代码?

全世界有3.14 % 的人已经关注了数据与算法之美导读:总是看到有人说,动态一时爽,重构火葬场。然而这世界上有的是著名的开源项目, 也有像 Github、Instagram 这样流量巨大的知名网站是基于动态语言开发的,经过了这么多年…

从好买辞职后,为什么我会加入一家开源创业公司?

这是头哥侃码的第240篇原创熟悉我的朋友都知道,我是一个闲不住的人。工作之余,我不仅愿意把自己的经验拿出来与大家分享,而且还总是喜欢在字里行间中表达情感,并抒发命运的奇妙与无常。为什么?因为在我看来&#xff0c…

Apache 虚拟主机 VirtualHost 配置

为什么80%的码农都做不了架构师?>>> 虚拟主机 (Virtual Host) 是在同一台机器搭建属于不同域名或者基于不同 IP 的多个网站服务的技术. 可以为运行在同一物理机器上的各个网站指配不同的 IP 和端口, 也可让多个网站拥有不同的域名. Apache 是世界上使用…

IT公司老板落水,各部门员工怎么救?

公司高层公司副总A:咱们开个会研究一下这个事情怎么处理。公司副总B:如果老板没有救成功,下任是谁呢?会不会影响公司的上市?公司副总C:我认为咱们开会应该讨论两个方案,一个是救人方案&#xff…

这样用Docker 搭建 Jenkins 实现自动部署,你知道吗?

一、为什么用jenkins主要是我们现在的项目都是采用手动部署的,每当给项目中新增一个功能就必须执行(打包--测试--上传测试修复的包到指定服务器--部署上线),这个流程操作起来繁杂,不小心就可能导致部署失败;急需找到一个方式来解决…

这是对R的误解!R的应用原来这么广!

R作为一种统计分析软件,广泛应用于生物、医学、电商、新闻等数据相关行业,是目前主流数据应用软件之一。为了更好地帮助大家了解并快速入门R语言,现超级数学建模携手柯老师以R语言为基础,向大家隆重推出《R语言基础》系列课。柯老…

WinDBg定位asp.net mvc项目异常崩溃源码位置

项目介绍:asp.net mvc angular iiswindows server系统莫名崩溃最近有个系统默认奇妙崩溃50x,服务整体变成无响应,当运维告知我只有重启应用程序池项目才能正常。我问他如何重现,得到的回复是我这里无法重现,但客户使用…

mysql如何和qt连接使用_Qt5学习:连接MySQL数据库

一、环境QT版本:QT 5.8.0(msvc2013_64)MySQL版本:mysql 5.7.19二、配置之前 mysql 数据库一直都连接不上,网上也搜了很多资料,主要还是库文件的问题。重新将 mysql.pro 编译一下,将生成的 .dll 和 .lib 文件拷贝到 QT …

TensorFlow框架的这些操作你肯定不知道!

谷歌在上周正式推出了深度学习框架TensorFlow 1.11.0 版本,那么TensorFlow框架到底是什么?TensorFlow™ 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。最初由Google大脑小组的研究员和工程师们开发…

C#中HashTable、Dictionary、ConcurrentDictionary区别

一、HashTableHashTable表示键/值对的集合。在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key-value的键值对,其中key通常可用来快速查找,同时key是区分大小写;value用…

CDA数据分析师备考必看,L1L2通用

CDA数据分析师L1,L2均可 可安排当月月底的线上考试 线上考的为双机位监考,但是不用担心 安全无隐患,需要联系 当月拿证

你以为妹子穿短裙真的是为了诱惑你吗?

全世界有3.14 % 的人已经关注了数据与算法之美每年暑假,ChinaJoy 都会火热进行,无数一年不出家门的宅男们扛着“长枪大炮”,向着短裙姑娘们就冲过去了。关于裙子,林语堂曾有过一句名言:“演讲应该像女士的裙子&#xf…

聊一聊Jmeter的参数化

背景 前面一篇聊了一下 JMeter 的简单使用,这篇聊一下 JMeter 的参数化。在开始之前先来一个单元测试的例子,感受一下参数化。上面是一个用 xUnit 写的单元测试,这个单元测试就是一个参数化的例子:模拟了不同的输入,调…

Android VNC Server New

Android VNC Server New 关于VNC请参见维基百科:http://zh.wikipedia.org/wiki/VNC关于执行Android VNC Server,请参见前一篇文章:点击链接 一、VNC下载1)fastdroid-vncAndroid VNC Server开源项目 http://code.google.com/p/fast…

EPPlus导出Excel感觉很不错~~~

前言导出成为很多系统的必备功能,之前分享过导出PDF的功能,这里来分享一下Excel的导出;提到Excel导出,NPOI肯定是很多小伙伴的首选,在以往的项目中也用其完成了很多导出需求;对于NPOI,个人感觉使…

[文摘]标准的软件开发过程

为什么80%的码农都做不了架构师?>>> 软件开发的标准过程包括六个阶段,而六个阶段需要编写的各类文件达 14 种之多,在每个阶段需要编写哪些文件,以及这些文件的主要内容见下: 1.可行性与计划研究阶段 可行性…

走进乔布斯的大脑

全世界有3.14 % 的人已经关注了数据与算法之美你永远也无法走进苹果教父乔布斯神秘的大脑,但下面的图可以让你多靠近了解他一点。人们都想走进乔帮主的大脑里看看他的想法,可惜他太难以捉摸了。但是,有个有趣的方法,至少可以让人们…

硬货 | 一片小小的薄膜,却可以粘住全世界!

延续“设计激发积极生活”的理念,在这个中秋,GYMLIVING特别推出月亮概念新产品,在便利生活的同时,为你带来一份浪漫和惊喜!说起月亮,除了阴晴圆缺,月球漫步更让它成了浪漫的代名词。有公司正计划…

使用域超级管理员打开Exchange 2010发现没有权限

1.使用administrator管理员打开EMC却报没有权限。 2.发现此问题,系邮件服务器本身上安装了outlook软件,并配置了使用非administrator账户收信。并有做了Windows保存了用户凭据,造成帐号使用上的混乱,导致连接Exchange服务器时使用…

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

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