`

Java实现缩略图的方法

    博客分类:
  • JAVA
 
阅读更多

 方法1:[第一种方法比后一种生成的缩略图要清晰]
 import javax.imageio.ImageIO;
 import java.awt.image.BufferedImage;
 import java.awt.image.ColorModel;
 import java.awt.image.WritableRaster;
 import java.awt.*;
 import java.awt.geom.AffineTransform;
 import java.io.InputStream;
 import java.io.File;
 import java.io.FileOutputStream;
 
 public class Test {
  public static BufferedImage resize(BufferedImage source, int targetW, int targetH) {
  // targetW,targetH分别表示目标长和宽
  int type = source.getType();
  BufferedImage target = null;
  double sx = (double) targetW / source.getWidth();
  double sy = (double) targetH / source.getHeight();
  //这里想实现在targetW,targetH范围内实现等比缩放。如果不需要等比缩放
  //则将下面的if else语句注释即可
  if(sx>sy)
  {
  sx = sy;
  targetW = (int)(sx * source.getWidth());
  }else{
  sy = sx;
  targetH = (int)(sy * source.getHeight());
  }
  if (type == BufferedImage.TYPE_CUSTOM) { //handmade
  ColorModel cm = source.getColorModel();
  WritableRaster raster = cm.createCompatibleWritableRaster(targetW, targetH);
  boolean alphaPremultiplied = cm.isAlphaPremultiplied();
  target = new BufferedImage(cm, raster, alphaPremultiplied, null);
  } else
  target = new BufferedImage(targetW, targetH, type);
  Graphics2D g = target.createGraphics();
  //smoother than exlax:
  g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY );
  g.drawRenderedImage(source, AffineTransform.getScaleInstance(sx, sy));
  g.dispose();
  return target;
  }
  public static void saveImageAsJpg (String fromFileStr,String saveToFileStr,int width,int hight)
  throws Exception {
  BufferedImage srcImage;
 // String ex = fromFileStr.substring(fromFileStr.indexOf("."),fromFileStr.length());
  String imgType = "JPEG";
  if (fromFileStr.toLowerCase().endsWith(".png")) {
  imgType = "PNG";
  }
 // System.out.println(ex);
  File saveFile=new File(saveToFileStr);
  File fromFile=new File(fromFileStr);
  srcImage = ImageIO.read(fromFile);
  if(width > 0 || hight > 0)
  {
  srcImage = resize(srcImage, width, hight);
  }
  ImageIO.write(srcImage, imgType, saveFile);
 
  }
 
  public static void main (String argv[]) {
  try{
  //参数1(from),参数2(to),参数3(宽),参数4(高)
  Test.saveImageAsJpg("E:/Document/My Pictures/3.gif","c:/6.gif",50,50);
  } catch(Exception e)
  {
  e.printStackTrace();
  }
 
  }
 }
 
 方法2:
  import java.io.*;
  import java.util.*;
  import com.sun.image.codec.jpeg.*;
  import java.awt.image.*;
  import java.awt.*;
  import java.net.*;
  import java.applet.*;
  import java.sql.*;
 
 //缩略图类,
 //本java类能将jpg图片文件,进行等比或非等比的大小转换。
 //具体使用方法
 //s_pic(大图片路径,生成小图片路径,大图片文件名,生成小图片文名,生成小图片宽度,生成小图片高度,是否等比缩放(默认为true))
  public class Tes {
  String InputDir; //输入图路径
  String OutputDir; //输出图路径
  String InputFileName; //输入图文件名
  String OutputFileName; //输出图文件名
  int OutputWidth = 80; //默认输出图片宽
  int OutputHeight = 80; //默认输出图片高
  int rate = 0;
  boolean proportion = true; //是否等比缩放标记(默认为等比缩放)
 
  public Tes() {
 //初始化变量
  InputDir = "";
  OutputDir = "";
  InputFileName = "";
  OutputFileName = "";
  OutputWidth = 80;
  OutputHeight = 80;
  rate = 0;
  }
 
  public void setInputDir(String InputDir) {
  this.InputDir = InputDir;
  }
 
  public void setOutputDir(String OutputDir) {
  this.OutputDir = OutputDir;
  }
 
  public void setInputFileName(String InputFileName) {
  this.InputFileName = InputFileName;
  }
 
  public void setOutputFileName(String OutputFileName) {
  this.OutputFileName = OutputFileName;
  }
 
  public void setOutputWidth(int OutputWidth) {
  this.OutputWidth = OutputWidth;
  }
 
  public void setOutputHeight(int OutputHeight) {
  this.OutputHeight = OutputHeight;
  }
 
  public void setW_H(int width, int height) {
  this.OutputWidth = width;
  this.OutputHeight = height;
  }
 
  public String s_pic() {
  BufferedImage image;
  String NewFileName;
 //建立输出文件对象
  File file = new File(OutputDir + OutputFileName);
  FileOutputStream tempout = null;
  try {
  tempout = new FileOutputStream(file);
  } catch (Exception ex) {
  System.out.println(ex.toString());
  }
  Image img = null;
  Toolkit tk = Toolkit.getDefaultToolkit();
  Applet app = new Applet();
  MediaTracker mt = new MediaTracker(app);
  try {
  img = tk.getImage(InputDir + InputFileName);
  mt.addImage(img, 0);
  mt.waitForID(0);
  } catch (Exception e) {
  e.printStackTrace();
  }
 
  if (img.getWidth(null) == -1) {
  System.out.println(" can't read,retry!" + "<BR>");
  return "no";
  } else {
  int new_w;
  int new_h;
  if (this.proportion == true) { //判断是否是等比缩放.
 //为等比缩放计算输出的图片宽度及高度
  double rate1 = ((double) img.getWidth(null)) /
  (double) OutputWidth + 0.1;
  double rate2 = ((double) img.getHeight(null)) /
  (double) OutputHeight + 0.1;
  double rate = rate1 > rate2 ? rate1 : rate2;
  new_w = (int) (((double) img.getWidth(null)) / rate);
  new_h = (int) (((double) img.getHeight(null)) / rate);
  } else {
  new_w = OutputWidth; //输出的图片宽度
  new_h = OutputHeight; //输出的图片高度
  }
  BufferedImage buffImg = new BufferedImage(new_w, new_h,
  BufferedImage.TYPE_INT_RGB);
 
  Graphics g = buffImg.createGraphics();
 
  g.setColor(Color.white);
  g.fillRect(0, 0, new_w, new_h);
 
  g.drawImage(img, 0, 0, new_w, new_h, null);
  g.dispose();
 
  JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(tempout);
  try {
  encoder.encode(buffImg);
  tempout.close();
  } catch (IOException ex) {
  System.out.println(ex.toString());
  }
  }
  return "ok";
  }
 
  public String s_pic(String InputDir, String OutputDir, String InputFileName,
  String OutputFileName) {
 //输入图路径
  this.InputDir = InputDir;
 //输出图路径
  this.OutputDir = OutputDir;
 //输入图文件名
  this.InputFileName = InputFileName;
 //输出图文件名
  this.OutputFileName = OutputFileName;
  return s_pic();
  }
 
  public String s_pic(String InputDir, String OutputDir, String InputFileName,
  String OutputFileName, int width, int height,
  boolean gp) {
 //输入图路径
  this.InputDir = InputDir;
 //输出图路径
  this.OutputDir = OutputDir;
 //输入图文件名
  this.InputFileName = InputFileName;
 //输出图文件名
  this.OutputFileName = OutputFileName;
 //设置图片长宽
  setW_H(width, height);
 //是否是等比缩放 标记
  this.proportion = gp;
  return s_pic();
  }
 
  public static void main(String[] a) {
 //s_pic(大图片路径,生成小图片路径,大图片文件名,生成小图片文名,生成小图片宽度,生成小图片高度)
  Tes mypic = new Tes();
  System.out.println(
  mypic.s_pic("E:\Document\My Pictures\",
  "E:\Document\My Pictures\",
  "topbg-3.gif", "3.gif", 400, 400, true)
  );
 
  }
  }
 
 3.jsp方式
 java.io.*,java.awt.Image,java.awt.image.*,com.sun.image.codec.jpeg.*,
 
   try
     {
  java.io.File file = new java.io.File("E:\Document\My Pictures\3.gif");
  String newurl="E:\Document\My Pictures\32.gif"; //新的缩略图保存地址
  Image src = javax.imageio.ImageIO.read(file); //构造Image对象
  float tagsize=200;
  int old_w=src.getWidth(null); //得到源图宽
  int old_h=src.getHeight(null);
  int new_w=0;
  int new_h=0; //得到源图长
  int tempsize;
  float tempdouble;
  if(old_w>old_h){
  tempdouble=old_w/tagsize;
  }else{
  tempdouble=old_h/tagsize;
  }
  new_w=Math.round(old_w/tempdouble);
  new_h=Math.round(old_h/tempdouble);//计算新图长宽
  BufferedImage tag = new BufferedImage(new_w,new_h,BufferedImage.TYPE_INT_RGB);
  tag.getGraphics().drawImage(src,0,0,new_w,new_h,null); //绘制缩小后的图
  FileOutputStream newimage=new FileOutputStream(newurl); //输出到文件流
  JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(newimage);
  encoder.encode(tag); //近JPEG编码
  newimage.close();
 
 }catch (Exception e){
 
 e.toString();
 
 }
 

分享到:
评论
6 楼 siashuayongsheng 2011-03-02  
图片大的话会不会导致内在溢出?
5 楼 ray_linn 2011-03-02  
JE帐号 写道
ray_linn 写道
直接用Jimi,略过上面的代码


这个,到底是该用Jimi还是JAI啊?



我觉得jimi好,不依赖X11库,独立发布没问题。只是sun不支持它了,不过凑合着用吧。
4 楼 JE帐号 2011-03-02  
ray_linn 写道
直接用Jimi,略过上面的代码


这个,到底是该用Jimi还是JAI啊?
3 楼 ray_linn 2011-03-02  
直接用Jimi,略过上面的代码
2 楼 zkl_1987 2011-03-02  
总感觉Java处理图片速度太慢,特别是200*20000这种类似的,或者大图,不知道楼主有什么好办法?
1 楼 ylm201 2011-03-01  
..楼主稍微排版一下啊

相关推荐

    java 图片生成缩略图

    在本文中,我们将介绍使用Java生成缩略图的方法。 缩略图生成方法 在 Java 中,生成缩略图可以使用多种方法,本文将介绍两种常见的方法。 方法一:使用BufferedImage类 使用BufferedImage类可以实现图片的缩略图...

    java 上传图片生成缩略图

    本文介绍了使用Java实现上传图片并生成缩略图的方法,包括获取文件路径、读取图像、创建缩略图及保存缩略图等步骤。通过这种方式,可以在不损失原图质量的前提下,有效地减少加载时间,提升用户体验。此外,本文还...

    java生成缩略图类(已经封装好)

    java 生成缩略图类 源代码 (已经封装好)

    java 缩略图实现

    总的来说,Java提供了一套强大的图像处理工具,可以方便地实现缩略图的生成。理解并熟练运用这些APIs,不仅可以帮助开发者在项目中创建高效的图像处理功能,还能为用户带来更好的体验。在实际应用中,还可以结合其他...

    JAVA获取视频缩略图

    首先,Java本身并不直接支持从视频文件中提取缩略图,但可以通过第三方库如JMF(Java Media Framework)或FFmpeg来实现。不过,JMF已经较为过时,目前更推荐使用FFmpeg库,它是一个强大的多媒体处理工具,提供了跨...

    java实现缩略图

    缩略图类(通用) 本java类能将jpg、bmp、png、gif图片文件,进行等比或非等比的大小转换。

    java生成缩略图

    根据提供的文件信息,我们可以总结出以下关于“Java生成缩略图”的相关知识点: ### Java生成缩略图基础知识 ...以上是对“Java生成缩略图”这一主题的详细解析和技术实现,希望对理解和应用相关技术有所帮助。

    Java实现图片等比例缩略图

    本篇文章将深入探讨如何使用Java实现图片的等比例缩略图,并提供相关代码示例。 首先,我们需要了解等比例缩略图的概念。等比例缩略图是指在保持原图宽高比的基础上,根据指定的最大尺寸进行缩小或放大。这样可以...

    java缩略图jar包

    Java 缩略图生成库,如“thumbnailator-0.4.4.jar”,是一个非常实用的工具,尤其对于那些在处理图像文件时需要快速创建预览或者缩略图的开发者而言。这个库提供了简单易用的API,可以方便地集成到Java项目中,大大...

    动态缩略图实现方案

    在Java中实现动态缩略图涉及到图像处理和流媒体技术。下面我们将深入探讨这个话题。 首先,Java提供了丰富的API来处理图像,如Java Advanced Imaging (JAI)库和Java 2D API。在Java 2D API中,`java.awt.image`和`...

    java生成缩略图的方法示例

    Java 生成缩略图的方法示例 Java 生成缩略图是指使用 Java 语言生成缩略图的过程,这个过程中涉及到各种图形处理技巧。下面将详细介绍 Java 生成缩略图的方法示例。 图像处理基础 在 Java 中,图像处理是通过使用...

    java利用ffmpeg获取视频缩略图

    本项目就是关于如何在Java环境中使用ffmpeg来获取视频的缩略图,提供了一个简单易用的解决方案。 首先,ffmpeg是一个强大的命令行工具,它支持多种视频、音频格式的处理,包括转换、合并、剪辑以及生成缩略图等。在...

    Java 制作缩略图

    NULL 博文链接:https://wenkaixuan.iteye.com/blog/785823

    java实现将图片和缩略图存储到数据库中.pdf

    ### Java 实现将图片和缩略图存储到数据库中的详细解析 #### 一、知识点概述 本文档主要介绍如何使用Java编程语言实现将图片及其对应的缩略图存储到数据库中的功能。这一技术在多种场景下都非常有用,比如在线商城...

    java缩略图

    一个不错的工具类,上传的图片根据长宽的判断,按比例缩放生成另一张小图,可以减少浏览的浪费

    java缩略图代码

    这个 Java 类实现了基本的图片处理功能,包括网络图片的下载、屏幕截图和生成缩略图。实际开发中,可能还需要考虑异常处理、多线程下载、图片格式转换等更多复杂情况。此外,由于 Sun Microsystems 的 `com.sun` 包...

    java视频生成图片(缩略图)-实例-(指定时间)

    以上就是关于"Java视频生成图片(缩略图)-实例-(指定时间)"的主要知识点,涵盖了从选择合适的库到实现具体功能的各种技术细节。在实际项目中,根据需求和资源可用性,可以选择最适合的方案来实现。

    Java 高清缩略图

    在这个场景下,我们关注的是如何在Java中生成缩略图,同时确保缩略图与原图的根目录不同,但其他路径保持一致。我们将探讨`simpleimage`库,它是一个用于图像处理的简洁工具,以及如何使用它来实现等比例缩放,以...

Global site tag (gtag.js) - Google Analytics