`

java 实现对图片进行指定的缩小或放大

    博客分类:
  • java
 
阅读更多
import java.awt.Graphics2D;    
import java.awt.Rectangle;    
import java.awt.RenderingHints;    
import java.awt.geom.AffineTransform;    
import java.awt.image.BufferedImage;    
import java.awt.image.ColorModel;    
import java.awt.image.WritableRaster;    
import java.io.File;    
import java.io.FileInputStream;    
import java.io.IOException;    
import java.io.InputStream;    
import javax.imageio.ImageIO;    

/**   
 * 图片工具类,完成图片的截取   
 *    
 * @author inc062977   
 *    
 */   
public class AlterUploadImage {    
 /**   
  * 实现图像的等比缩放   
  * @param source   
  * @param targetW   
  * @param targetH   
  * @return   
  */   
 private 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_INTERPOLATION,    
    RenderingHints.VALUE_INTERPOLATION_BICUBIC);    
  g.drawRenderedImage(source, AffineTransform.getScaleInstance(sx, sy));    
  g.dispose();    
  return target;    
 }    

 /**   
  * 实现图像的等比缩放和缩放后的截取   
  * @param inFilePath 要截取文件的路径   
  * @param outFilePath 截取后输出的路径   
  * @param width 要截取宽度   
  * @param hight 要截取的高度   
  * @param proportion   
  * @throws Exception   
  */   

 public static void saveImageAsJpg(String inFilePath, String outFilePath,    
   int width, int hight, boolean proportion)throws Exception {    
  File file = new File(inFilePath);    
  InputStream in = new FileInputStream(file);    
  File saveFile = new File(outFilePath);    

  BufferedImage srcImage = ImageIO.read(in);    
  if (width > 0 || hight > 0) {    
   // 原图的大小    
   int sw = srcImage.getWidth();    
   int sh = srcImage.getHeight();    
   // 如果原图像的大小小于要缩放的图像大小,直接将要缩放的图像复制过去    
   if (sw > width && sh > hight) {    
    srcImage = resize(srcImage, width, hight);    
   } else {    
    String fileName = saveFile.getName();    
    String formatName = fileName.substring(fileName    
      .lastIndexOf('.') + 1);    
    ImageIO.write(srcImage, formatName, saveFile);    
    return;    
   }    
  }    
  // 缩放后的图像的宽和高    
  int w = srcImage.getWidth();    
  int h = srcImage.getHeight();    
  // 如果缩放后的图像和要求的图像宽度一样,就对缩放的图像的高度进行截取    
  if (w == width) {    
   // 计算X轴坐标    
   int x = 0;    
   int y = h / 2 - hight / 2;    
   saveSubImage(srcImage, new Rectangle(x, y, width, hight), saveFile);    
  }    
  // 否则如果是缩放后的图像的高度和要求的图像高度一样,就对缩放后的图像的宽度进行截取    
  else if (h == hight) {    
   // 计算X轴坐标    
   int x = w / 2 - width / 2;    
   int y = 0;    
   saveSubImage(srcImage, new Rectangle(x, y, width, hight), saveFile);    
  }    
  in.close();    
 }    
 /**   
  * 实现缩放后的截图   
  * @param image 缩放后的图像   
  * @param subImageBounds 要截取的子图的范围   
  * @param subImageFile 要保存的文件   
  * @throws IOException   
  */   
 private static void saveSubImage(BufferedImage image,    
   Rectangle subImageBounds, File subImageFile) throws IOException {    
  if (subImageBounds.x < 0 || subImageBounds.y < 0   
    || subImageBounds.width - subImageBounds.x > image.getWidth()    
    || subImageBounds.height - subImageBounds.y > image.getHeight()) {    
   System.out.println("Bad   subimage   bounds");    
   return;    
  }    
  BufferedImage subImage = image.getSubimage(subImageBounds.x,subImageBounds.y, subImageBounds.width, subImageBounds.height);    
  String fileName = subImageFile.getName();    
  String formatName = fileName.substring(fileName.lastIndexOf('.') + 1);    
  ImageIO.write(subImage, formatName, subImageFile);    
 }    

 public static void main(String[] args)
 {
  AlterUploadImage au = new AlterUploadImage();
  try {
   au.saveImageAsJpg("d://psu[3].jpg", "d://new.jpg", 900, 800, true);
   System.out.println("Done");
  } catch (Exception e) {
   e.printStackTrace();
  }
 }


} 


 

分享到:
评论

相关推荐

    java图片放大与缩小

    java实现对图片进行指定的缩小或放大。希望对大家有帮助

    Java课程设计报告 原代码 图片查看器 图片进行放大,缩小,左旋,右旋,另存,彻底删除

    本次设计的图片查看器实现了在用户选定的文件目录下循环浏览指定后缀的图片文件,并且可以对选择的图片进行放大,缩小,左旋,右旋,另存,彻底删除等操作。

    java源码包---java 源码 大量 实例

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    java源码包4

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    java源码包3

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    JAVA上百实例源码以及开源项目

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    java源码包2

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    JAVA上百实例源码以及开源项目源代码

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印 util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印...

    java工具类:图像处理类

    内容概要:图像处理工具类,图像任意格式互相转换,彩色图像转换为黑白图像,图像按尺寸或按比例放大和缩小,读取本地(文件流或文件名)图像,读取网络图像,截取图像,按指定格式输出,获取指定图像的大小和尺寸,...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印 util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    本书是第II卷,以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用Java进行桌面程序开发各个方面的知识和技巧,主要包括Java语法与面向对象技术、Java高级应用、窗体与控件应用、文件操作...

    js控制截取图片旋转缩放

    里面包含一个js结合canvas控制 组装本地或者动态从服务器取出图片成一个整体的图片,可控制调节图片的亮度 黑白 饱和度等等 还可以 点击canvas ...调节放大缩小旋转 比例等等 最后点击确认的时候 自带后台java处理方法

    notepad2 超级给力的代码编辑器

     PHP, CSS, Perl/CGI,C/C++, C#, Java, VB, Pascal, 汇编, SQL, Python, NSIS,INI, REG, INF, BAT,DIFF... 10 快速放大、缩小页面,不用再设定字体大小  11 可以指定ESC键最小化Notepad2到系统托盘或者关闭Notepad2

Global site tag (gtag.js) - Google Analytics