最近网上看到两种不同的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 中,生成缩略图可以使用多种方法,本文将介绍两种常见的方法。 方法一:使用BufferedImage类 使用BufferedImage类可以实现图片的缩略图生成。下面是示例代码: ```java public class Test { public ...
总结来说,Java提供了两种主要的方式来创建等比例缩略图:Java 2D API和JAI API。Java 2D API简单易用,适用于大多数情况;而JAI API则提供更强大的图像处理能力,但需要更多的学习和配置。在实际应用中,可以根据...
Java 生成缩略图的方法示例 Java 生成缩略图是指使用 Java 语言生成缩略图的...Java 生成缩略图的方法示例通过使用 Lanczos 滤波器和 ImageScale 类,提供了一种高质量的图像缩放算法,能够生成清晰且平滑的缩略图。
### 显示DWG文件缩略图的三种方法 随着信息技术的发展与应用的广泛化,图形文件格式变得越来越多样化。其中,DWG文件作为CAD(Computer-Aided Design)领域中最常用的文件格式之一,在建筑、工程设计等行业中占据着...
Android提供了两种方法来获取缩略图:请求缩略图(requestThumbail)和生成缩略图(createBitmap)。请求缩略图较为简单,但可能无法满足自定义需求,如大小或质量。生成缩略图则可以自由控制缩放比例和质量,但相对...
在Java编程语言中,处理图像任务,如头像剪切、上传、设置大小以及生成固定缩略图,是一项常见的需求。这些操作广泛应用于社交媒体、个人资料管理或任何需要用户自定义头像的系统中。本篇文章将深入探讨如何使用Java...
图片压缩分为有损和无损两种方式: 1. 无损压缩:保留原始图像的所有数据,例如PNG格式就支持无损压缩,它通过去除图像数据中的冗余部分来减小文件大小,但不会降低图像质量。 2. 有损压缩:以牺牲部分图像质量为...
本文将详细介绍一个名为Thumbnailator的Java库,它是用于生成图片缩略图的强大工具,并讲解如何在项目中使用。 Thumbnailator是一个开源的Java库,专门设计用来创建、编辑和转换图像。它具有高度的灵活性和易用性...
本篇文章将深入探讨两种实现图片叠加效果的方法,并提供详细的代码示例。 首先,第一种方法是通过Canvas进行绘制。Canvas是Android图形库中的核心组件之一,允许开发者在Bitmap上进行各种图形操作,包括绘制图片。...
这个项目“手机HTML5快速压缩成缩略图上传和原图上传两种模式”充分利用了HTML5的特性,为用户提供了一种高效且兼容性良好的图片上传解决方案。下面将详细阐述相关知识点。 1. **HTML5 Canvas**:在HTML5中,Canvas...
在移动应用开发中,特别是在处理图像展示时,`PhotoView`是一个非常实用的库,它为用户提供了丰富的交互体验,如左右滑动切换图片、双指缩放以及点击缩略图全屏预览等。本篇文章将深入探讨`PhotoView`的特性、使用...
本项目涉及的核心知识点包括图片剪切、生成缩略图、图片合成以及图片的MD5加密和校验,这些都是图像处理的重要组成部分。下面将详细讲解这些技术。 1. **图片剪切**: 图片剪切是指从原始图片中选取特定区域,将...
生成缩略图的方法主要有两种:等比例缩放和固定尺寸裁剪。等比例缩放保持原图的比例,避免拉伸变形,而固定尺寸裁剪则可能需要对超出目标尺寸的部分进行裁剪。例如,我们可以利用PIL库中的resize()函数实现等比例...
本文将详细介绍如何在Android中有效地获取这两种类型的媒体文件的缩略图。 一、图片缩略图 1. **MediaStore**: Android系统提供了`MediaStore`类,它可以用来访问设备上的多媒体数据库,其中包括了图片的信息。...
3. Java实现批量压缩图片裁剪压缩多种尺寸缩略图一键批量上传图片的常用压缩方案有两种:对原图进行按照指定存储空间的压缩;对原图进行指定宽高大小的压缩。 4. Java实现批量压缩图片裁剪压缩多种尺寸缩略图一键...
- 图片缩略图:在`JComboBox`中显示图片的缩略图,以便用户能更直观地知道所选图片的内容。 以上就是关于"java swing程序实现点击图片列表改变图片"的核心知识讲解,通过理解和应用这些知识点,开发者可以创建出...
本文将详细介绍如何在Android平台上通过编程方式获取这两种类型的缩略图。 首先,对于图片缩略图的获取,Android提供了多种方法。其中一种常见的方式是使用`BitmapFactory`类。通过`decodeFile()`或`decodeStream()...
类型通常有两种,`MediaStore.Images.Thumbnails.MINI_KIND`(小型缩略图)和`MediaStore.Images.Thumbnails.MICRO_KIND`(微型缩略图)。小型缩略图尺寸通常为320x240,微型缩略图尺寸较小,一般为128x96。示例代码...
本篇文章将详细探讨两种主要的生成缩略图的方法:等比缩放和固定缩放,并讨论如何在不足时使用背景色进行补充。 1. **等比缩放**: 等比缩放是保持原始图像比例进行缩放的方法,避免图像在缩放过程中发生变形。在...
在实际应用中,该系统可能还会包含其他特性,如图片的预览、缩略图生成、文件大小限制、重命名策略等。这些特性有助于提升用户体验,同时保持服务器资源的有效利用。例如,生成缩略图可以减少页面加载时间,而文件...