`
冷静
  • 浏览: 146013 次
  • 性别: Icon_minigender_1
  • 来自: 佛山
社区版块
存档分类
最新评论

一个JAVA图形缩放处理工具类

    博客分类:
  • Java
阅读更多

调用的例子

import java.io.FileOutputStream; 
import java.io.IOException; 


import javax.imageio.ImageIO; 


public class T { 
  public static void main(String[] args) throws Exception, IOException { 
    ImageIO.write(ImageUtils.resizeImage("d:/www.java2000.net.gif", ImageUtils.IMAGE_GIF, 30, 20), 
        "JPEG", new FileOutputStream("d:/test.jpg")); 
  } 
}

 

import java.awt.Dimension; 
import java.awt.Image; 
import java.awt.image.BufferedImage; 
import java.awt.image.PixelGrabber; 
import java.io.File; 
import java.io.IOException; 
import java.util.Iterator; 
import java.util.Locale; 

import javax.imageio.IIOImage; 
import javax.imageio.ImageIO; 
import javax.imageio.ImageWriteParam; 
import javax.imageio.ImageWriter; 
import javax.imageio.plugins.jpeg.JPEGImageWriteParam; 
import javax.imageio.stream.ImageOutputStream; 


public class ImageUtils { 
  public static final int IMAGE_UNKNOWN = -1; 
  public static final int IMAGE_JPEG = 0; 
  public static final int IMAGE_PNG = 1; 
  public static final int IMAGE_GIF = 2; 

  /** 
   * Resizes an image 
   *  
   * @param imgName 
   *          The image name to resize. Must be the complet path to the file 
   * @param type 
   *          int 
   * @param maxWidth 
   *          The image's max width 
   * @param maxHeight 
   *          The image's max height 
   * @return A resized <code>BufferedImage</code> 
   */ 
  public static BufferedImage resizeImage(String imgName, int type, int maxWidth, int maxHeight) { 
    try { 
      return resizeImage(ImageIO.read(new File(imgName)), type, maxWidth, maxHeight); 
    } catch (IOException e) { 
      e.printStackTrace(); 
      return null; 
    } 
  } 

  /** 
   * Resizes an image. 
   *  
   * @param image 
   *          The image to resize 
   * @param maxWidth 
   *          The image's max width 
   * @param maxHeight 
   *          The image's max height 
   * @return A resized <code>BufferedImage</code> 
   * @param type 
   *          int 
   */ 
  public static BufferedImage resizeImage(BufferedImage image, int type, int maxWidth, int maxHeight) { 
    Dimension largestDimension = new Dimension(maxWidth, maxHeight); 

    // Original size 
    int imageWidth = image.getWidth(null); 
    int imageHeight = image.getHeight(null); 

    float aspectRatio = (float) imageWidth / imageHeight; 

    if (imageWidth > maxWidth || imageHeight > maxHeight) { 
      if ((float) largestDimension.width / largestDimension.height > aspectRatio) { 
        largestDimension.width = (int) Math.ceil(largestDimension.height * aspectRatio); 
      } else { 
        largestDimension.height = (int) Math.ceil(largestDimension.width / aspectRatio); 
      } 

      imageWidth = largestDimension.width; 
      imageHeight = largestDimension.height; 
    } 

    return createHeadlessSmoothBufferedImage(image, type, imageWidth, imageHeight); 
  } 

  /** 
   * Saves an image to the disk. 
   *  
   * @param image 
   *          The image to save 
   * @param toFileName 
   *          The filename to use 
   * @param type 
   *          The image type. Use <code>ImageUtils.IMAGE_JPEG</code> to save as 
   *          JPEG images, or <code>ImageUtils.IMAGE_PNG</code> to save as PNG. 
   * @return <code>false</code> if no appropriate writer is found 
   */ 
  public static boolean saveImage(BufferedImage image, String toFileName, int type) { 
    try { 
      return ImageIO.write(image, type == IMAGE_JPEG ? "jpg" : "png", new File(toFileName)); 
    } catch (IOException e) { 
      e.printStackTrace(); 
      return false; 
    } 
  } 

  /** 
   * Compress and save an image to the disk. Currently this method only supports 
   * JPEG images. 
   *  
   * @param image 
   *          The image to save 
   * @param toFileName 
   *          The filename to use 
   * @param type 
   *          The image type. Use <code>ImageUtils.IMAGE_JPEG</code> to save as 
   *          JPEG images, or <code>ImageUtils.IMAGE_PNG</code> to save as PNG. 
   */ 
  public static void saveCompressedImage(BufferedImage image, String toFileName, int type) { 
    try { 
      if (type == IMAGE_PNG) { 
        throw new UnsupportedOperationException("PNG compression not implemented"); 
      } 

      Iterator iter = ImageIO.getImageWritersByFormatName("jpg"); 
      ImageWriter writer; 
      writer = (ImageWriter) iter.next(); 

      ImageOutputStream ios = ImageIO.createImageOutputStream(new File(toFileName)); 
      writer.setOutput(ios); 

      ImageWriteParam iwparam = new JPEGImageWriteParam(Locale.getDefault()); 

      iwparam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 
      iwparam.setCompressionQuality(0.7F); 

      writer.write(null, new IIOImage(image, null, null), iwparam); 

      ios.flush(); 
      writer.dispose(); 
      ios.close(); 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } 
  } 

  /** 
   * Creates a <code>BufferedImage</code> from an <code>Image</code>. This 
   * method can function on a completely headless system. This especially 
   * includes Linux and Unix systems that do not have the X11 libraries 
   * installed, which are required for the AWT subsystem to operate. This method 
   * uses nearest neighbor approximation, so it's quite fast. Unfortunately, the 
   * result is nowhere near as nice looking as the 
   * createHeadlessSmoothBufferedImage method. 
   *  
   * @param image 
   *          The image to convert 
   * @param w 
   *          The desired image width 
   * @param h 
   *          The desired image height 
   * @return The converted image 
   * @param type 
   *          int 
   */ 
  public static BufferedImage createHeadlessBufferedImage(BufferedImage image, int type, int width, 
      int height) { 
    if (type == ImageUtils.IMAGE_PNG && hasAlpha(image)) { 
      type = BufferedImage.TYPE_INT_ARGB; 
    } else { 
      type = BufferedImage.TYPE_INT_RGB; 
    } 

    BufferedImage bi = new BufferedImage(width, height, type); 

    for (int y = 0; y < height; y++) { 
      for (int x = 0; x < width; x++) { 
        bi.setRGB(x, y, image.getRGB(x * image.getWidth() / width, y * image.getHeight() / height)); 
      } 
    } 

    return bi; 
  } 

  /** 
   * Creates a <code>BufferedImage</code> from an <code>Image</code>. This 
   * method can function on a completely headless system. This especially 
   * includes Linux and Unix systems that do not have the X11 libraries 
   * installed, which are required for the AWT subsystem to operate. The 
   * resulting image will be smoothly scaled using bilinear filtering. 
   *  
   * @param source 
   *          The image to convert 
   * @param w 
   *          The desired image width 
   * @param h 
   *          The desired image height 
   * @return The converted image 
   * @param type 
   *          int 
   */ 
  public static BufferedImage createHeadlessSmoothBufferedImage(BufferedImage source, int type, 
      int width, int height) { 
    if (type == ImageUtils.IMAGE_PNG && hasAlpha(source)) { 
      type = BufferedImage.TYPE_INT_ARGB; 
    } else { 
      type = BufferedImage.TYPE_INT_RGB; 
    } 

    BufferedImage dest = new BufferedImage(width, height, type); 

    int sourcex; 
    int sourcey; 

    double scalex = (double) width / source.getWidth(); 
    double scaley = (double) height / source.getHeight(); 

    int x1; 
    int y1; 

    double xdiff; 
    double ydiff; 

    int rgb; 
    int rgb1; 
    int rgb2; 

    for (int y = 0; y < height; y++) { 
      sourcey = y * source.getHeight() / dest.getHeight(); 
      ydiff = scale(y, scaley) - sourcey; 

      for (int x = 0; x < width; x++) { 
        sourcex = x * source.getWidth() / dest.getWidth(); 
        xdiff = scale(x, scalex) - sourcex; 

        x1 = Math.min(source.getWidth() - 1, sourcex + 1); 
        y1 = Math.min(source.getHeight() - 1, sourcey + 1); 

        rgb1 = getRGBInterpolation(source.getRGB(sourcex, sourcey), source.getRGB(x1, sourcey), 
            xdiff); 
        rgb2 = getRGBInterpolation(source.getRGB(sourcex, y1), source.getRGB(x1, y1), xdiff); 

        rgb = getRGBInterpolation(rgb1, rgb2, ydiff); 

        dest.setRGB(x, y, rgb); 
      } 
    } 

    return dest; 
  } 

  private static double scale(int point, double scale) { 
    return point / scale; 
  } 

  private static int getRGBInterpolation(int value1, int value2, double distance) { 
    int alpha1 = (value1 & 0xFF000000) >>> 24; 
    int red1 = (value1 & 0x00FF0000) >> 16; 
    int green1 = (value1 & 0x0000FF00) >> 8; 
    int blue1 = (value1 & 0x000000FF); 

    int alpha2 = (value2 & 0xFF000000) >>> 24; 
    int red2 = (value2 & 0x00FF0000) >> 16; 
    int green2 = (value2 & 0x0000FF00) >> 8; 
    int blue2 = (value2 & 0x000000FF); 

    int rgb = ((int) (alpha1 * (1.0 - distance) + alpha2 * distance) << 24) 
        | ((int) (red1 * (1.0 - distance) + red2 * distance) << 16) 
        | ((int) (green1 * (1.0 - distance) + green2 * distance) << 8) 
        | (int) (blue1 * (1.0 - distance) + blue2 * distance); 

    return rgb; 
  } 

  /** 
   * Determines if the image has transparent pixels. 
   *  
   * @param image 
   *          The image to check for transparent pixel.s 
   * @return <code>true</code> of <code>false</code>, according to the result 
   */ 
  public static boolean hasAlpha(Image image) { 
    try { 
      PixelGrabber pg = new PixelGrabber(image, 0, 0, 1, 1, false); 
      pg.grabPixels(); 

      return pg.getColorModel().hasAlpha(); 
    } catch (InterruptedException e) { 
      return false; 
    } 
  } 
}

 

分享到:
评论

相关推荐

    java图片处理工具类

    在Java编程语言中,处理图片是一项常见的任务,尤其在网页开发、移动应用或者图形用户界面设计中。本篇文章将深入探讨如何使用Java...通过深入理解这些技术,我们可以创建出强大的图片处理工具类,满足日常开发需求。

    图片裁剪、缩放工具类

    总结来说,这个图片裁剪和缩放工具类是一个实用的Java库,涵盖了图片操作的基本需求,同时具备生成图形验证码的能力。它的两种处理方式提供了灵活性,适应不同的应用场景,且其有效性已经在实际项目中得到验证。对于...

    毕业论文设计-IT计算机-java图形图象处理(论文+系统).zip

    这篇毕业论文设计主要聚焦在IT计算机领域,使用Java语言进行图形图像处理的实践与研究。...通过这样的项目,学生可以深入理解Java图形图像处理的原理,同时掌握软件开发的完整流程,为未来的职业生涯打下坚实的基础。

    java图形图象处理(论文+系统).zip

    Java图形图像处理是一个涵盖广泛的领域,它涉及到使用Java编程语言来创建、编辑、分析和显示图像。这个领域的应用包括但不限于科学可视化、艺术创作、工程设计、数据可视化以及各种软件界面的美化。在这个“java图形...

    java图形图象处理(论文+系统)

    5. **毕业设计与论文**:在Java图形图像处理的毕业设计中,学生通常会面临创建一个具有特定功能的图像处理系统,比如图像编辑器、人脸识别系统或图像分析工具。论文则需要详细阐述所采用的技术、实现方法以及实验...

    java图片加水印工具类

    总之,这个“java图片加水印工具类”是一个实用的组件,可以帮助Java开发者轻松地在图片上添加水印,提升工作效率,同时保持代码的整洁和可维护性。无论你是进行个人项目还是企业级应用,它都能成为一个有价值的辅助...

    java 图片缩放类

    `DwindlePic` 类是一个简单的Java图片缩放工具,通过合理地利用Java标准库中的类和接口,实现了基本的图片加载、缩放和保存功能。在实际应用中可以根据需要进一步扩展该类的功能,例如添加异常处理机制、支持更多的...

    JAVA源码JAVA图形图象处理(论文+系统)

    - `java.awt.image.BufferedImage`是Java自带的一个用于处理图像的类。 - 它提供了读取、写入和修改图像的基本方法。 2. **JAI (Java Advanced Imaging)** - JAI是一个强大的图像处理库,它可以实现复杂图像操作...

    java从图片缩放

    在Java编程中,图片缩放是一项常见的任务,特别是在开发图形用户界面(GUI)或处理图像数据时。这个主题涉及到图像处理的基本概念、Java中的图像API以及如何使用它们来实现缩放功能。以下是对这一主题的详细说明: ...

    java图形图象处理(系统)

    Java图形图像处理是一个涵盖广泛的领域,它涉及到使用Java编程语言来创建、操作和显示各种图形和图像。在Java中,图形图像处理主要依赖于Java AWT(Abstract Window Toolkit)和Swing这两个库,它们提供了丰富的API...

    java图形图象处理.zip

    Java图形图像处理是一个涵盖广泛的领域,它涉及到使用Java编程语言来创建、操作和显示各种图形和图像。在Java中,图形图像处理主要依赖于Java 2D API(Application Programming Interface)和Java AWT(Abstract ...

    java图形图象处理(论文+系统).rar

    Java图形图像处理的一个关键部分是`java.awt.image`包,它包含了一系列用于图像操作的类,如`BufferedImage`用于存储和操作图像,`ImageFilter`用于图像过滤和转换,`ColorModel`和`Raster`则用于处理像素数据。...

    (毕业设计)java图形图象处理(论文+系统)

    Java图形图像处理是一个涵盖广泛的领域,它涉及到使用Java编程语言来创建、编辑、分析和展示图像。在Java中,这主要通过Java的丰富的图形库,如Java AWT(Abstract Window Toolkit)和Swing来实现。这些库提供了丰富...

    毕业答辩-java图形图象处理(论文系统).rar

    Java图形图像处理是一个涵盖广泛领域的主题,特别是在软件开发中,尤其是在毕业设计或论文项目中,它经常被用作展示技术能力和创新思维的平台。在这个Java图形图像处理的论文系统中,我们可以推测它可能包含了以下几...

    java图形图象处理(文+系统).zip

    Java图形图像处理是一个涵盖广泛的领域,它涉及到使用Java编程语言来创建、操作和显示各种图形和图像。在Java中,图形图像处理主要依赖于Java 2D API和JavaFX库,这两个工具集提供了丰富的功能,使得开发者能够进行...

    JAVA开发java图形图象处理(论文+系统)

    Java图形图像处理是Java开发中的一个重要领域,尤其在软件工程的毕业设计中,它经常作为学生展示编程技能和解决问题能力的课题。这个压缩包文件很可能包含了一篇关于该主题的论文以及一个实际的图像处理系统源代码。...

    java图形图象处理毕设论文源代码程序

    Java图形图像处理是计算机科学领域中的一个重要分支,特别是在软件开发和毕业设计中常常被用作实践项目。这篇毕设论文的源代码程序旨在探讨如何利用Java语言进行有效的图像操作和处理。下面将详细阐述Java在图形图像...

    Java图片处理工具ImageMagick

    Java图片处理工具ImageMagick是一个强大的跨平台图形处理库,它允许开发人员在Java应用程序中进行复杂的图像操作,包括但不限于转换、编辑、合成图像以及处理大量格式的图像文件。ImageMagick是由C语言编写的,但...

Global site tag (gtag.js) - Google Analytics