`

Java实现按照要求的尺寸对图进行的等比缩放

    博客分类:
  • Java
阅读更多
         这个是在参考网上一些代码基础上进行编写的,主要是首先实现图片的等比缩放,然后在进行截取,比如一张1024*768的图要截成263*150的,首先是等比缩放后变成263*197的,然后在对这个图片的高度进行截取,变成163*150的
java 代码
  1. import java.awt.Color;   
  2. import java.awt.Graphics;   
  3. import java.awt.Graphics2D;   
  4. import java.awt.Rectangle;   
  5. import java.awt.RenderingHints;   
  6. import java.awt.geom.AffineTransform;   
  7. import java.awt.image.BufferedImage;   
  8. import java.awt.image.ColorModel;   
  9. import java.awt.image.WritableRaster;   
  10. import java.io.File;   
  11. import java.io.FileInputStream;   
  12. import java.io.FileOutputStream;   
  13. import java.io.IOException;   
  14. import java.io.InputStream;   
  15. import javax.imageio.ImageIO;   
  16. import com.sun.image.codec.jpeg.JPEGCodec;   
  17. import com.sun.image.codec.jpeg.JPEGImageEncoder;   
  18.   
  19. /**  
  20.  * 图片工具类,完成图片的截取  
  21.  *   
  22.  * @author inc062977  
  23.  *   
  24.  */  
  25. public class ImageHepler {   
  26.     /**  
  27.      * 实现图像的等比缩放  
  28.      * @param source  
  29.      * @param targetW  
  30.      * @param targetH  
  31.      * @return  
  32.      */  
  33.     private static BufferedImage resize(BufferedImage source, int targetW,   
  34.             int targetH) {   
  35.         // targetW,targetH分别表示目标长和宽   
  36.         int type = source.getType();   
  37.         BufferedImage target = null;   
  38.         double sx = (double) targetW / source.getWidth();   
  39.         double sy = (double) targetH / source.getHeight();   
  40.         // 这里想实现在targetW,targetH范围内实现等比缩放。如果不需要等比缩放   
  41.         // 则将下面的if else语句注释即可   
  42.         if (sx < sy) {   
  43.             sx = sy;   
  44.             targetW = (int) (sx * source.getWidth());   
  45.         } else {   
  46.             sy = sx;   
  47.             targetH = (int) (sy * source.getHeight());   
  48.         }   
  49.         if (type == BufferedImage.TYPE_CUSTOM) { // handmade   
  50.             ColorModel cm = source.getColorModel();   
  51.             WritableRaster raster = cm.createCompatibleWritableRaster(targetW,   
  52.                     targetH);   
  53.             boolean alphaPremultiplied = cm.isAlphaPremultiplied();   
  54.             target = new BufferedImage(cm, raster, alphaPremultiplied, null);   
  55.         } else  
  56.             target = new BufferedImage(targetW, targetH, type);   
  57.         Graphics2D g = target.createGraphics();   
  58.         // smoother than exlax:   
  59.         g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,   
  60.                 RenderingHints.VALUE_INTERPOLATION_BICUBIC);   
  61.         g.drawRenderedImage(source, AffineTransform.getScaleInstance(sx, sy));   
  62.         g.dispose();   
  63.         return target;   
  64.     }   
  65.   
  66.     /**  
  67.      * 实现图像的等比缩放和缩放后的截取  
  68.      * @param inFilePath 要截取文件的路径  
  69.      * @param outFilePath 截取后输出的路径  
  70.      * @param width 要截取宽度  
  71.      * @param hight 要截取的高度  
  72.      * @param proportion  
  73.      * @throws Exception  
  74.      */  
  75.        
  76.     public static void saveImageAsJpg(String inFilePath, String outFilePath,   
  77.             int width, int hight, boolean proportion)throws Exception {   
  78.          File file = new File(inFilePath);   
  79.          InputStream in = new FileInputStream(file);   
  80.          File saveFile = new File(outFilePath);   
  81.   
  82.         BufferedImage srcImage = ImageIO.read(in);   
  83.         if (width > 0 || hight > 0) {   
  84.             // 原图的大小   
  85.             int sw = srcImage.getWidth();   
  86.             int sh = srcImage.getHeight();   
  87.             // 如果原图像的大小小于要缩放的图像大小,直接将要缩放的图像复制过去   
  88.             if (sw > width && sh > hight) {   
  89.                 srcImage = resize(srcImage, width, hight);   
  90.             } else {   
  91.                 String fileName = saveFile.getName();   
  92.                 String formatName = fileName.substring(fileName   
  93.                         .lastIndexOf('.') + 1);   
  94.                 ImageIO.write(srcImage, formatName, saveFile);   
  95.                 return;   
  96.             }   
  97.         }   
  98.         // 缩放后的图像的宽和高   
  99.         int w = srcImage.getWidth();   
  100.         int h = srcImage.getHeight();   
  101.         // 如果缩放后的图像和要求的图像宽度一样,就对缩放的图像的高度进行截取   
  102.         if (w == width) {   
  103.             // 计算X轴坐标   
  104.             int x = 0;   
  105.             int y = h / 2 - hight / 2;   
  106.             saveSubImage(srcImage, new Rectangle(x, y, width, hight), saveFile);   
  107.         }   
  108.         // 否则如果是缩放后的图像的高度和要求的图像高度一样,就对缩放后的图像的宽度进行截取   
  109.         else if (h == hight) {   
  110.             // 计算X轴坐标   
  111.             int x = w / 2 - width / 2;   
  112.             int y = 0;   
  113.             saveSubImage(srcImage, new Rectangle(x, y, width, hight), saveFile);   
  114.         }   
  115.         in.close();   
  116.     }   
  117.     /**  
  118.      * 实现缩放后的截图  
  119.      * @param image 缩放后的图像  
  120.      * @param subImageBounds 要截取的子图的范围  
  121.      * @param subImageFile 要保存的文件  
  122.      * @throws IOException  
  123.      */  
  124.     private static void saveSubImage(BufferedImage image,   
  125.             Rectangle subImageBounds, File subImageFile) throws IOException {   
  126.         if (subImageBounds.x < 0 || subImageBounds.y < 0  
  127.                 || subImageBounds.width - subImageBounds.x > image.getWidth()   
  128.                 || subImageBounds.height - subImageBounds.y > image.getHeight()) {   
  129.             System.out.println("Bad   subimage   bounds");   
  130.             return;   
  131.         }   
  132.         BufferedImage subImage = image.getSubimage(subImageBounds.x,subImageBounds.y, subImageBounds.width, subImageBounds.height);   
  133.         String fileName = subImageFile.getName();   
  134.         String formatName = fileName.substring(fileName.lastIndexOf('.') + 1);   
  135.         ImageIO.write(subImage, formatName, subImageFile);   
  136.     }   
  137.   
  138.   
  139. }   
分享到:
评论
9 楼 xyheritrix 2012-09-19  
算法明显有问题
8 楼 likehibernate 2008-07-23  
只能缩小不能放大啊!
7 楼 norwolfli 2008-06-28  
考走了,正好想用这个功能,真是太及时了。谢谢!
6 楼 form_rr 2008-06-28  
透明的png图片缩放后的图片就不透明了!
怎么解决啊?
5 楼 yangli 2007-10-24  
用的着,顶了
4 楼 badpeas 2007-10-24  
顶下,有时间来看看!
3 楼 pengpai 2007-10-20  
恩,我看看
2 楼 wangzhongjie 2007-10-19  
恩,刚好现在在做一个网站,里面又房屋发布模块,需要这样得东西,拿来看看!^_^
1 楼 loky 2007-10-14  
图片上传和等比缩放的技术我刚刚在一个项目中用过,
和你用的差不多,不过很是费了一番周折。希望能对以后的朋友有些帮助。

相关推荐

    JQuery实现等比缩放图片插件

    本文将详细介绍如何使用JQuery实现等比缩放图片的插件,并结合提供的`autoImg`文件进行解析。 首先,我们要理解等比缩放的基本原理。等比缩放是指保持图片的长宽比不变,根据指定的容器大小来调整图片的尺寸。在CSS...

    图片压缩、图片等比缩放软件

    2. 图片等比缩放:在XnView中,用户可以轻松地对图片进行等比缩放,只需在尺寸设置中保持宽度和高度的比例锁定即可。此外,软件还提供了预览功能,让用户在缩放前查看效果。 除了这些基本功能,XnView还有其他高级...

    用JAVA获取视频文件中的帧图片并等比缩放

    通过使用Java语言和javacv库,我们可以快速获取视频文件中的帧图片,并对其进行等比缩放,以满足不同的应用需求。 知识点一:视频文件中的帧图片获取 * 视频文件中的帧图片获取是指从视频文件中抽取出每一帧图片的...

    PC、移动端自适应等比缩放布局方案

    2. **VW布局**:使用视窗单位`vw`,即视口宽度的百分比来定义元素尺寸,可以实现等比缩放的效果。 结合两种布局方式的优点,可以在保证布局自适应的同时,解决由于屏幕尺寸变化导致的字体过大的问题。 #### 实施...

    java实现图片缩放

    这是个工具类,可以实现图片的等比缩放,坑根据图片百分比,或者固定尺寸等进行缩放,还可以给图片增加水印,很好用

    JS图片等比缩放

    等比缩放是指按照图片的宽高比进行缩放,保证长宽比不变,这样可以保持图片的原始形状。如果随意改变图片的宽高,可能会导致图片拉伸或压缩,失去原有的视觉效果。 实现JS图片等比缩放的核心在于计算图片的新尺寸,...

    上传图片 - 等比缩放

    例如,如果等比缩放后的图片大于目标尺寸,我们可以按照中心点进行裁剪。对于较小的尺寸,可能需要填充空白区域,通常采用背景色或模糊处理。 5. **保存缩略图**:使用图像处理库保存缩放后的图片,可以设置质量...

    图片等比缩放展示

    这段代码设置图片的最大宽度为容器宽度的100%,高度会自动根据宽度的比例进行调整,从而实现等比缩放。当容器大小改变时,图片也会相应地等比缩放。 在实现翻页滚动时,可以使用CSS的`overflow`属性。例如,如果...

    Qt点击等比缩放源码

    在Qt框架中,等比缩放是常见的图形用户界面(GUI)操作,尤其在处理图像或者自定义控件时显得尤为重要。等比缩放保证了对象的比例不会因为缩放而失真,保持原有的形状不变。以下是对“Qt点击等比缩放源码”相关知识...

    php+h5+canvas+jcrop 实现网页上传图片并对原图等比缩放后进行裁剪

    本例使用php+h5+canvas+jcrop 实现网页上传图片并对原图等比缩放后进行裁剪。实现过程:在HTML中对图片进行上传,在图片文件还未上传至服务器仍停留在form表单时,对该文件进行处理,在此过程中先获取原图的64位base...

    Winform无边框移动,修改窗体大小,并且等比缩放

    但是没有边框,窗体就不能移动,并且不能修改大小,经过修改,窗体可以移动,并且能移动大小,但是发现窗体拉到以后分辨率会降低,经过努力,终于把无边框窗体改成可以拖动,改变大小并且可以等比缩放窗体,...

    js等比缩放图片

    有时候,我们希望图片能够在不同的设备和屏幕尺寸下保持良好的显示比例,这就需要用到等比缩放技术。本文将深入探讨如何使用JavaScript实现图片的等比缩放,确保在火狐、IE、谷歌等主流浏览器中都能正常工作。 首先...

    图片自动等比缩放JS(实用)

    图片自动等比缩放JS(实用) 直接加载调用,不受IE、TT、火狐影响

    图片缩放、压缩技术java实现

    本教程将专注于使用Java语言实现图片的等比缩放和压缩技术,以满足存储和传输的需求。下面,我们将深入探讨这些关键知识点。 首先,我们来了解等比缩放。等比缩放是指在改变图片尺寸时,保持其长宽比不变,防止图片...

    android 等比缩小图片demo

    等比缩放是图像处理中的一个概念,指的是按照图片的原始比例(即宽高比)来调整其尺寸。这样可以确保图片不失真,不会出现拉伸或压缩的情况。在Android中,我们通常使用`Bitmap`类来处理图片,并通过`BitmapFactory`...

    java处理图片大小等比例缩放,自定义修改图片大小,截取,水印

    在Java编程语言中,处理图片是一项常见的任务,包括调整图片大小、等比例缩放、裁剪、压缩以及添加水印等。以下将详细介绍这些知识点: 1. **等比例缩放图片**: 在Java中,我们可以使用`java.awt.image....

    图片打水印及图片等比缩放

    2. **编程实现**:在编程中,可以通过设置缩放因子来实现等比缩放。例如,在Python的PIL库中,可以先计算出缩放比例,然后使用`resize()`函数,确保宽度和高度的缩放比例相等。 3. **分辨率与质量**:缩放过程中要...

    VC++ 实现窗体控件及元素随窗口缩放的代码

    VC++ 实现窗体控件及元素随窗口缩放的代码 VC++实现窗体控件及元素随窗口缩放的代码,在本例中,窗体中有ComBox、Calendar控件、TxtBox,这些大家在编程时候应该不陌生吧?对于本实例,它所要表达的不是这些控件如何...

    等比缩放图片

    - **尺寸调整**:使用 `Bitmap` 类的构造函数,将原图按照新的尺寸进行缩放。 - **资源释放**:使用完 `Bitmap` 对象后,应该调用 `Dispose()` 方法来释放内存资源。 ##### 2. 示例代码解析 ```csharp public void...

    JS显示图片等比缩放

    图片显示等比缩放 

Global site tag (gtag.js) - Google Analytics