一位高手的上传内容中学习到的,并将其代码根据我的需求进行了修改,参考位置:http://jiangpin1987.javaeye.com/blog/749690
参考代码:
- import java.io.*;
- import java.util.logging.Level;
- import java.util.logging.Logger;
- import java.awt.*;
- import com.sun.image.codec.jpeg.*;
- import java.awt.image.BufferedImage;
- public class Img_Middle {
- public void img_change(String url, String name) {
- Tosmallerpic(url, new File(url + name), "_middle", name, 188, 165,
- (float) 0.7);
- Tosmallerpic(url, new File(url + name), "_small", name, 45, 45,
- (float) 0.7);
- Tosmallerpic(url, new File(url + name), "_smaller", name, 116, 100,
- (float) 0.7);
- }
- /**
- * * * @param f 图片所在的文件夹路径 * @param filelist 图片路径 *
- *
- * @param ext
- * 扩展名
- * @param n
- * 图片名
- * @param w
- * 目标宽 *
- * @param h
- * 目标高 *
- * @param per
- * 百分比
- */
- private static void Tosmallerpic(String f, File filelist, String ext,
- String n, int w, int h, float per) {
- Image src;
- try {
- src = javax.imageio.ImageIO.read(filelist);
- // 构造Image对象
- String img_midname = f + n.substring(0, n.indexOf(".")) + ext
- + n.substring(n.indexOf("."));
- int old_w = src.getWidth(null); // 得到源图宽
- int old_h = src.getHeight(null);
- int new_w = 0;
- int new_h = 0; // 得到源图长
- double w2 = (old_w * 1.00) / (w * 1.00);
- double h2 = (old_h * 1.00) / (h * 1.00);
- // 图片跟据长宽留白,成一个正方形图。
- BufferedImage oldpic;
- if (old_w > old_h) {
- oldpic = new BufferedImage(old_w, old_w,
- BufferedImage.TYPE_INT_RGB);
- } else {
- if (old_w < old_h) {
- oldpic = new BufferedImage(old_h, old_h,
- BufferedImage.TYPE_INT_RGB);
- } else {
- oldpic = new BufferedImage(old_w, old_h,
- BufferedImage.TYPE_INT_RGB);
- }
- }
- Graphics2D g = oldpic.createGraphics();
- g.setColor(Color.white);
- if (old_w > old_h) {
- g.fillRect(0, 0, old_w, old_w);
- g.drawImage(src, 0, (old_w - old_h) / 2, old_w, old_h,
- Color.white, null);
- } else {
- if (old_w < old_h) {
- g.fillRect(0, 0, old_h, old_h);
- g.drawImage(src, (old_h - old_w) / 2, 0, old_w, old_h,
- Color.white, null);
- } else {
- // g.fillRect(0,0,old_h,old_h);
- g.drawImage(src.getScaledInstance(old_w, old_h,
- Image.SCALE_SMOOTH), 0, 0, null);
- }
- }
- g.dispose();
- src = oldpic;
- // 图片调整为方形结束
- if (old_w > w)
- new_w = (int) Math.round(old_w / w2);
- else
- new_w = old_w;
- if (old_h > h)
- new_h = (int) Math.round(old_h / h2);// 计算新图长宽
- else
- new_h = old_h;
- BufferedImage tag = new BufferedImage(new_w, new_h,
- BufferedImage.TYPE_INT_RGB);
- // tag.getGraphics().drawImage(src,0,0,new_w,new_h,null);
- // 绘制缩小后的图
- tag.getGraphics().drawImage(
- src.getScaledInstance(new_w, new_h, Image.SCALE_SMOOTH), 0,
- 0, null);
- FileOutputStream newimage = new FileOutputStream(img_midname); // 输出到文件流
- JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(newimage);
- JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(tag);
- /* 压缩质量 */
- jep.setQuality(per, true);
- encoder.encode(tag, jep);
- // encoder.encode(tag);
- // 近JPEG编码
- newimage.close();
- } catch (IOException ex) {
- Logger.getLogger(Img_Middle.class.getName()).log(Level.SEVERE,
- null, ex);
- }
- }
- public static void main(String args[]){
- //String n="0e5465fc-025a-458d-8383-e9ced0c1e728.jpg";
- String f="F://200903300012//pics//201006//";
- File file=new File(f);
- if(file.exists()){
- File[] filelist=file.listFiles();
- for(int i=0;i<filelist.length;i++){
- String n=filelist[i].getName();
- Tosmallerpic(f,filelist[i],"_middle",n,185,160,(float)0.7);
- Tosmallerpic(f,filelist[i],"_small",n,45,45,(float)0.7);
- Tosmallerpic(f,filelist[i],"_smaller",n,116,100,(float)0.7);
- }
- }
- }
- }
第一次修改后的代码:
- import java.awt.Color;
- import java.awt.Graphics2D;
- import java.awt.Image;
- import java.awt.image.BufferedImage;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.util.Calendar;
- import java.util.Date;
- import com.sun.image.codec.jpeg.ImageFormatException;
- import com.sun.image.codec.jpeg.JPEGCodec;
- import com.sun.image.codec.jpeg.JPEGEncodeParam;
- import com.sun.image.codec.jpeg.JPEGImageEncoder;
- /**
- * * @author WQ
- *
- * @date 2011-01-14
- * @versions 1.0 图片压缩工具类 提供的方法中可以设定生成的 缩略图片的大小尺寸、压缩尺寸的比例、图片的质量等
- */
- public class ImageUtil {
- /**
- * * 图片文件读取
- *
- * @param srcImgPath
- * @return
- */
- private static BufferedImage InputImage(String srcImgPath) {
- BufferedImage srcImage = null;
- try {
- // 构造BufferedImage对象
- File file = new File(srcImgPath);
- FileInputStream in = new FileInputStream(file);
- byte[] b = new byte[5];
- in.read(b);
- srcImage = javax.imageio.ImageIO.read(file);
- } catch (IOException e) {
- System.out.println("读取图片文件出错!" + e.getMessage());
- e.printStackTrace();
- }
- return srcImage;
- }
- /**
- * * 将图片按照指定的图片尺寸、源图片质量压缩(默认质量为1)
- *
- * @param srcImgPath
- * :源图片路径
- * @param outImgPath
- * :输出的压缩图片的路径
- * @param new_w
- * :压缩后的图片宽
- * @param new_h
- * :压缩后的图片高
- */
- public static void Tosmallerpic(String srcImgPath, String outImgPath,
- int new_w, int new_h) {
- Tosmallerpic(srcImgPath, outImgPath, new_w, new_h, 1F);
- }
- /**
- * 将图片按照指定的尺寸比例、源图片质量压缩(默认质量为1)
- *
- * @param srcImgPath
- * :源图片路径
- * @param outImgPath
- * :输出的压缩图片的路径
- * @param ratio
- * :压缩后的图片尺寸比例
- * @param per
- * :百分比
- */
- public static void Tosmallerpic(String srcImgPath, String outImgPath,
- float ratio) {
- Tosmallerpic(srcImgPath, outImgPath, ratio, 1F);
- }
- /**
- * 将图片按照指定长或者宽的最大值来压缩图片(默认质量为1)
- *
- * @param srcImgPath
- * :源图片路径
- * @param outImgPath
- * :输出的压缩图片的路径
- * @param maxLength
- * :长或者宽的最大值
- * @param per
- * :图片质量
- */
- public static void Tosmallerpic(String srcImgPath, String outImgPath,
- int maxLength) {
- Tosmallerpic(srcImgPath, outImgPath, maxLength, 1F);
- }
- /**
- * * 将图片按照指定的图片尺寸、图片质量压缩
- *
- * @param srcImgPath
- * :源图片路径
- * @param outImgPath
- * :输出的压缩图片的路径
- * @param new_w
- * :压缩后的图片宽
- * @param new_h
- * :压缩后的图片高
- * @param per
- * :百分比
- */
- public static void Tosmallerpic(String srcImgPath, String outImgPath,
- int new_w, int new_h, float per) {
- // 得到图片
- BufferedImage src = InputImage(srcImgPath);
- int old_w = src.getWidth();
- // 得到源图宽
- int old_h = src.getHeight();
- // 得到源图长
- // 根据原图的大小生成空白画布
- BufferedImage tempImg = new BufferedImage(old_w, old_h,
- BufferedImage.TYPE_INT_RGB);
- // 在新的画布上生成原图的缩略图
- Graphics2D g = tempImg.createGraphics();
- g.setColor(Color.white);
- g.fillRect(0, 0, old_w, old_h);
- g.drawImage(src, 0, 0, old_w, old_h, Color.white, null);
- g.dispose();
- BufferedImage newImg = new BufferedImage(new_w, new_h,
- BufferedImage.TYPE_INT_RGB);
- newImg.getGraphics().drawImage(
- tempImg.getScaledInstance(new_w, new_h, Image.SCALE_SMOOTH), 0,
- 0, null);
- // 调用方法输出图片文件
- OutImage(outImgPath, newImg, per);
- }
- /**
- * * 将图片按照指定的尺寸比例、图片质量压缩
- *
- * @param srcImgPath
- * :源图片路径
- * @param outImgPath
- * :输出的压缩图片的路径
- * @param ratio
- * :压缩后的图片尺寸比例
- * @param per
- * :百分比
- */
- public static void Tosmallerpic(String srcImgPath, String outImgPath,
- float ratio, float per) {
- // 得到图片
- BufferedImage src = InputImage(srcImgPath);
- int old_w = src.getWidth();
- // 得到源图宽
- int old_h = src.getHeight();
- // 得到源图长
- int new_w = 0;
- // 新图的宽
- int new_h = 0;
- // 新图的长
- BufferedImage tempImg = new BufferedImage(old_w, old_h,
- BufferedImage.TYPE_INT_RGB);
- Graphics2D g = tempImg.createGraphics();
- g.setColor(Color.white);
- // 从原图上取颜色绘制新图g.fillRect(0, 0, old_w, old_h);
- g.drawImage(src, 0, 0, old_w, old_h, Color.white, null);
- g.dispose();
- // 根据图片尺寸压缩比得到新图的尺寸new_w = (int) Math.round(old_w * ratio);
- new_h = (int) Math.round(old_h * ratio);
- BufferedImage newImg = new BufferedImage(new_w, new_h,
- BufferedImage.TYPE_INT_RGB);
- newImg.getGraphics().drawImage(
- tempImg.getScaledInstance(new_w, new_h, Image.SCALE_SMOOTH), 0,
- 0, null);
- // 调用方法输出图片文件OutImage(outImgPath, newImg, per);
- }
- /**
- * * 指定长或者宽的最大值来压缩图片
- *
- * @param srcImgPath
- * :源图片路径
- * @param outImgPath
- * :输出的压缩图片的路径
- * @param maxLength
- * :长或者宽的最大值
- * @param per
- * :图片质量
- */
- public static void Tosmallerpic(String srcImgPath, String outImgPath,
- int maxLength, float per) {
- // 得到图片
- BufferedImage src = InputImage(srcImgPath);
- int old_w = src.getWidth();
- // 得到源图宽
- int old_h = src.getHeight();
- // 得到源图长
- int new_w = 0;
- // 新图的宽
- int new_h = 0;
- // 新图的长
- BufferedImage tempImg = new BufferedImage(old_w, old_h,
- BufferedImage.TYPE_INT_RGB);
- Graphics2D g = tempImg.createGraphics();
- g.setColor(Color.white);
- // 从原图上取颜色绘制新图
- g.fillRect(0, 0, old_w, old_h);
- g.drawImage(src, 0, 0, old_w, old_h, Color.white, null);
- g.dispose();
- // 根据图片尺寸压缩比得到新图的尺寸
- if (old_w > old_h) {
- // 图片要缩放的比例
- new_w = maxLength;
- new_h = (int) Math.round(old_h * ((float) maxLength / old_w));
- } else {
- new_w = (int) Math.round(old_w * ((float) maxLength / old_h));
- new_h = maxLength;
- }
- BufferedImage newImg = new BufferedImage(new_w, new_h,
- BufferedImage.TYPE_INT_RGB);
- newImg.getGraphics().drawImage(
- tempImg.getScaledInstance(new_w, new_h, Image.SCALE_SMOOTH), 0,
- 0, null);
- // 调用方法输出图片文件
- OutImage(outImgPath, newImg, per);
- }
- /**
- * * 将图片文件输出到指定的路径,并可设定压缩质量
- *
- * @param outImgPath
- * @param newImg
- * @param per
- */
- private static void OutImage(String outImgPath, BufferedImage newImg,
- float per) {
- // 判断输出的文件夹路径是否存在,不存在则创建
- File file = new File(outImgPath);
- if (!file.getParentFile().exists()) {
- file.getParentFile().mkdirs();
- }// 输出到文件流
- try {
- FileOutputStream newimage = new FileOutputStream(outImgPath);
- JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(newimage);
- JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(newImg);
- // 压缩质量
- jep.setQuality(per, true);
- encoder.encode(newImg, jep);
- newimage.close();
- } catch (FileNotFoundException e) {
- // TODO Auto-generated catch blocke.printStackTrace();
- } catch (ImageFormatException e) {
- // TODO Auto-generated catch blocke.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch blocke.printStackTrace();
- }
- }
- public static void main(String args[]) {
- String f = "c:/img/";
- File file = new File(f);
- if (file.exists()) {
- File[] filelist = file.listFiles();
- for (int i = 0; i < filelist.length; i++) {
- File fi = filelist[i];
- System.out.println(fi.length());
- String n = filelist[i].getName();
- // Tosmallerpic(f, filelist[i], "_ratio_small", n,
- // 0.303,(float)0.7);
- // Tosmallerpic(f, filelist[i], "_ratio_smaller", n,
- // 0.083,(float)0.7);
- }
- }
- String srcImg = "c:/img/car_2.jpg";
- String tarDir = "c:/img/newImg/";
- long startTime = new Date().getTime();
- Tosmallerpic(srcImg, tarDir + "car_1_maxLength_1.jpg", 400);
- Tosmallerpic(srcImg, tarDir + "car_1_maxLength_2.jpg", 0.5F);
- Tosmallerpic(srcImg, tarDir + "car_1_maxLength_3.jpg", 400, 500);
- Tosmallerpic(srcImg, tarDir + "car_1_maxLength_11.jpg", 400, 0.7F);
- Tosmallerpic(srcImg, tarDir + "car_1_maxLength_22.jpg", 0.5F, 0.8F);
- Tosmallerpic(srcImg, tarDir + "car_1_maxLength_33.jpg", 400, 500, 0.8F);
- System.out.println(new Date().getTime() - startTime);
- }
- }
第二次修改,只是对长宽尺寸压缩,按原图片质量
- import java.awt.Graphics2D;
- import java.awt.Image;
- import java.awt.image.BufferedImage;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.IOException;
- import javax.imageio.ImageIO;
- /**
- * * @author WQ * @date 2011-01-14 * @versions 1.0 图片压缩工具类 提供的方法中可以设定生成的
- * 缩略图片的大小尺寸等
- */
- public class ImageUtil {
- /** * 图片文件读取 * * @param srcImgPath * @return */
- private static BufferedImage InputImage(String srcImgPath) {
- BufferedImage srcImage = null;
- try {
- FileInputStream in = new FileInputStream(srcImgPath);
- srcImage = javax.imageio.ImageIO.read(in);
- } catch (IOException e) {
- System.out.println("读取图片文件出错!" + e.getMessage());
- e.printStackTrace();
- }
- return srcImage;
- }
- /**
- * * 将图片按照指定的图片尺寸压缩 * * @param srcImgPath :源图片路径 * @param outImgPath *
- * :输出的压缩图片的路径 * @param new_w * :压缩后的图片宽 * @param new_h * :压缩后的图片高
- */
- public static void compressImage(String srcImgPath, String outImgPath,
- int new_w, int new_h) {
- BufferedImage src = InputImage(srcImgPath);
- disposeImage(src, outImgPath, new_w, new_h);
- }
- /**
- * * 指定长或者宽的最大值来压缩图片 * * @param srcImgPath * :源图片路径 * @param outImgPath *
- * :输出的压缩图片的路径 * @param maxLength * :长或者宽的最大值
- */
- public static void compressImage(String srcImgPath, String outImgPath,
- int maxLength) {
- // 得到图片
- BufferedImage src = InputImage(srcImgPath);
- if (null != src) {
- int old_w = src.getWidth();
- // 得到源图宽
- int old_h = src.getHeight();
- // 得到源图长
- int new_w = 0;
- // 新图的宽
- int new_h = 0;
- // 新图的长
- // 根据图片尺寸压缩比得到新图的尺寸
- if (old_w > old_h) {
- // 图片要缩放的比例
- new_w = maxLength;
- new_h = (int) Math.round(old_h * ((float) maxLength / old_w));
- } else {
- new_w = (int) Math.round(old_w * ((float) maxLength / old_h));
- new_h = maxLength;
- }
- disposeImage(src, outImgPath, new_w, new_h);
- }
- }
- /** * 处理图片 * * @param src * @param outImgPath * @param new_w * @param new_h */
- private synchronized static void disposeImage(BufferedImage src,
- String outImgPath, int new_w, int new_h) {
- // 得到图片
- int old_w = src.getWidth();
- // 得到源图宽
- int old_h = src.getHeight();
- // 得到源图长
- BufferedImage newImg = null;
- // 判断输入图片的类型
- switch (src.getType()) {
- case 13:
- // png,gifnewImg = new BufferedImage(new_w, new_h,
- // BufferedImage.TYPE_4BYTE_ABGR);
- break;
- default:
- newImg = new BufferedImage(new_w, new_h, BufferedImage.TYPE_INT_RGB);
- break;
- }
- Graphics2D g = newImg.createGraphics();
- // 从原图上取颜色绘制新图
- g.drawImage(src, 0, 0, old_w, old_h, null);
- g.dispose();
- // 根据图片尺寸压缩比得到新图的尺寸
- newImg.getGraphics().drawImage(
- src.getScaledInstance(new_w, new_h, Image.SCALE_SMOOTH), 0, 0,
- null);
- // 调用方法输出图片文件
- OutImage(outImgPath, newImg);
- }
- /**
- * * 将图片文件输出到指定的路径,并可设定压缩质量 * * @param outImgPath * @param newImg * @param
- * per
- */
- private static void OutImage(String outImgPath, BufferedImage newImg) {
- // 判断输出的文件夹路径是否存在,不存在则创建
- File file = new File(outImgPath);
- if (!file.getParentFile().exists()) {
- file.getParentFile().mkdirs();
- }// 输出到文件流
- try {
- ImageIO.write(newImg, outImgPath.substring(outImgPath
- .lastIndexOf(".") + 1), new File(outImgPath));
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
相关推荐
网上找的缩略图生成方法都不够清晰,于是决定自己研究和改进生成缩略图方法。此方法压缩后的图片小,清晰度高,压缩速度快。5000张图片大概抽根烟的功夫就压缩完了。高清的哦。各种参数都是可配的,方便移植到自己...
6. **Java bindings for FFmpeg:** 如果不希望通过命令行接口,还可以使用Java对FFmpeg的绑定库,如JAVE(Java Audio Video Encoder),它提供了一个友好的API来执行FFmpeg的任务,包括生成缩略图。 7. **处理步骤...
thumbnailator(包括jar包跟api) java用于图片压缩 生成缩略图 添加水印等 这是我见过最好的压缩工具了 使用方法: Thumbnails.of(new File("path/to/directory").listFiles()) .size(640, 480) .outputFormat(...
在IT行业中,生成缩略图和压缩图片是常见的图像处理任务,尤其在网站开发、社交媒体分享、移动应用以及存储和传输大量图像时显得尤为重要。本文将深入探讨如何生成缩略图以及有效地压缩图片,帮助您解决相关问题。 ...
* 压缩图片方法 * * @param oldFile 将要压缩的图片 * @param width 压缩宽 * @param height 压缩高 * @param quality 压缩清晰度 建议为1.0 * @param smallIcon 压缩图片后,添加的扩展名(在图片后缀名前添加...
可以控制宽高大小的缩略图生成函数
在Java中生成缩略图是一项常见的任务,尤其是在开发Web应用或者需要处理用户上传图片的系统中。这个过程涉及对原始图像进行重新尺寸调整,以创建一个较小的版本,通常用于预览或节省存储空间。在提供的代码片段中,...
实现"jSP上传图片生成缩略图",首先需要处理文件上传。jspSmartUpload.jar很可能是一个用于文件上传的库,如SmartUpload,这是一个Java组件,提供了一套完整的文件上传解决方案,包括上传进度显示、文件大小限制、多...
- **质量控制**:生成缩略图时,可以调整JPEG的压缩质量或PNG的压缩级别,以平衡图片质量与文件大小。 - **裁剪与填充**:如果需要特定尺寸的缩略图,可能需要裁剪多余部分或填充空白区域,保持原始画面的关键内容...
- **服务器端生成**:服务器在接收到请求后,通过编程语言(如Python的PIL库、Java的ImageIO、Node.js的sharp库等)处理图片,生成缩略图并返回给客户端。这种方式可以保证所有用户获得一致的体验,但服务器负载...
在本文中,我们将深入探讨如何使用JSP和jspsmart组件来实现图片上传及生成缩略图的功能。jspsmart组件是一个强大的文件上传工具,它提供了便捷的API用于处理文件上传,包括验证文件类型和大小,以及错误处理。 首先...
2. Java实现批量压缩图片裁剪压缩多种尺寸缩略图一键批量上传图片的实现思路:先把本地磁盘目录中的所有图片资源通过IO流读出来,读到内存中,然后对图片的名称根据定义好的业务规则解析,生成不同的图片名,然后对...
EGCodec.createJPEGEncoder(out); JPEGEncodeParam param = ...总的来说,这段Java代码提供了一个实用的工具,能够在不失真过大(通过调整压缩质量)的前提下,根据图片原始大小智能地压缩图片,满足不同场景的需求。
在Java编程环境中,图片压缩和生成缩略图是常见的任务,尤其在处理大量图像数据或者优化网站性能时显得尤为重要。本文将深入探讨如何利用Java进行图片处理,包括压缩和生成缩略图的关键技术。 首先,Java提供了丰富...
然而,需要注意的是,在实际部署中,应考虑资源消耗和性能优化,例如使用缓存机制避免重复生成缩略图,以及优化图像压缩参数以达到更好的视觉效果和加载速度。此外,对于动态生成的缩略图,还应确保处理过程中的异常...
实现图片的压缩 1.按照固定的比例缩放图片 2.以宽度为基准等比例放缩图片 3.以高度为基准,等比例缩放图片 4.按照最大高度限制,生成最大的等比例缩略图
java上传图片功能,图片太大,等比例压缩算法(原尺寸压缩)
3. 图像质量优化:在生成缩略图时,为了减少文件大小,可能会对图片进行质量压缩。这涉及到JPEG、PNG等格式的编码参数调整,以平衡图片质量和文件大小。 4. 输出保存:最后,生成的缩略图会被保存为新的文件,其...
4. **质量控制**:在生成缩略图时,为了减小文件大小,可以调整JPEG的质量因子或选择不同的压缩算法,平衡图像质量和文件大小。 5. **保存和展示**:将生成的缩略图保存到服务器,然后在JSP页面上显示。可以提供预览...
为了解决这一问题,本篇将详细介绍如何使用ImageMagick及其Java接口JMagick来高效地处理图片,并生成高质量的缩略图及水印图片。 #### ImageMagick简介 ImageMagick是一款强大的跨平台图像处理工具,它支持多种...