`

以目标图片尺寸按原比例缩放切割图片

    博客分类:
  • java
 
阅读更多

以目标图片尺寸按原比例缩放切割图片

来源:http://my.oschina.net/u/873047/blog/106551

 

需求:原始图片缩放为目标尺寸后,要求缩放后的图片保持原图片的样式不改变,但是缩放后图片的四边可以裁减。
原理:将待裁剪图片宽高相除值和目标尺寸宽高相除值进行比较,如果前者较大,说明待裁剪图片相对于目标尺寸来说要宽出一块,现在已高为基准进行裁剪,即将原始图片的高度缩放到目标尺寸的高度。计算出原始图片高度和目标尺寸高度的比例,和原始图片宽度相乘,得到缩放后的宽度。此时的缩缩放后的高度就是目标尺寸的高度,但是宽度*肯定*会比目标尺寸宽度宽。将缩放后的多余的宽度分为两份右边和左边各裁去一份。
以宽为基准原理类似。

代码:

 

public class ImgUtil {
/**
 *
 * @param srcImgPath 待切割图片路径
 * @param destImgPath 切割后图片路径
 * @param destImgW 所需宽度
 * @param destImgH 所需高度
 */
public static void createThumb (String srcImgPath , String destImgPath, int destImgW , int destImgH){
    //原图片等比例缩小或放大之后的图片
    int narrowImgW ;
    int narrowImgH ;
    //原图片大小
    int srcImgW ;
    int srcImgH ;
    try {
        BufferedImage bi = ImageIO. read(new File(srcImgPath));
        srcImgW = bi.getWidth();
        srcImgH = bi.getHeight();
        // 转换图片尺寸与目标尺寸比较 , 如果转换图片较小,说明转换图片相对于目标图片来说高较小,需要以高为基准进行缩放。
        if((float )srcImgW /srcImgH > (float)destImgW / destImgH){
            narrowImgW = ( int)(((float )destImgH / (float)srcImgH)*srcImgW);
            narrowImgH = destImgH;
            //按照原图以高为基准等比例缩放、或放大。这一步高为所需图片的高度,宽度肯定会比目标宽度宽。
            int cutNarrowImgSize = (narrowImgW - destImgW)/2;
            BufferedImage narrowImg = new BufferedImage(narrowImgW, narrowImgH,BufferedImage.TYPE_INT_RGB);
            narrowImg.getGraphics().drawImage(bi.getScaledInstance(narrowImgW, narrowImgH, Image.SCALE_SMOOTH ), 0, 0, null);
            //等比例缩放完成后宽度与目标尺寸宽度相比较 , 将多余宽的部分分为两份 ,左边删除一部分
            Image image = narrowImg.getScaledInstance(narrowImgW, narrowImgH, Image.SCALE_DEFAULT );
            CropImageFilter cropFilter = new CropImageFilter(cutNarrowImgSize, 0, narrowImgW-cutNarrowImgSize, narrowImgH);
            Image img = Toolkit.getDefaultToolkit().createImage( new FilteredImageSource(image.getSource(), cropFilter));
            BufferedImage cutLiftNarrowImg = new BufferedImage( narrowImgW-cutNarrowImgSize, narrowImgH,BufferedImage.TYPE_INT_RGB );
            cutLiftNarrowImg.getGraphics().drawImage(img, 0, 0, null);
            //右边删除一部分
            image = cutLiftNarrowImg.getScaledInstance(narrowImgW-cutNarrowImgSize, narrowImgH, Image.SCALE_DEFAULT );
            cropFilter = new CropImageFilter(0, 0, narrowImgW-cutNarrowImgSize*2, narrowImgH);
            img = Toolkit.getDefaultToolkit().createImage( new FilteredImageSource(image.getSource(), cropFilter));
            BufferedImage cutRightNarrowImg = new BufferedImage( narrowImgW-cutNarrowImgSize*2, narrowImgH,BufferedImage.TYPE_INT_RGB );
            Graphics g = cutRightNarrowImg.getGraphics();
            g.drawImage(img, 0, 0, null); // 绘制截取后的图
            g.dispose();
            //输出为文件 最终为所需要的格式
            ImageIO. write(cutRightNarrowImg, "JPEG", new File(destImgPath));
        }
        else{ //以宽度为基准
            narrowImgW = destImgW;
            narrowImgH = ( int) (((float )destImgW / (float)srcImgW)*srcImgH);
            int cutNarrowImgSize = (narrowImgH - destImgH)/2;

            BufferedImage narrowImg = new BufferedImage(narrowImgW, narrowImgH,BufferedImage.TYPE_INT_RGB);
            narrowImg.getGraphics().drawImage(bi.getScaledInstance(narrowImgW, narrowImgH, Image.SCALE_SMOOTH ), 0, 0, null);

            Image image = narrowImg.getScaledInstance(narrowImgW, narrowImgH, Image.SCALE_DEFAULT );
            CropImageFilter cropFilter = new CropImageFilter(0, cutNarrowImgSize, narrowImgW, narrowImgH-cutNarrowImgSize);
            Image img = Toolkit.getDefaultToolkit().createImage( new FilteredImageSource(image.getSource(), cropFilter));
            BufferedImage cutTopNarrowImg = new BufferedImage( narrowImgW, narrowImgH-cutNarrowImgSize,BufferedImage. TYPE_INT_RGB);
            cutTopNarrowImg.getGraphics().drawImage(img, 0, 0, null);

            image = cutTopNarrowImg.getScaledInstance(narrowImgW, narrowImgH-cutNarrowImgSize, Image. SCALE_DEFAULT);
            cropFilter = new CropImageFilter(0, 0, narrowImgW, narrowImgH-cutNarrowImgSize*2);
            img = Toolkit.getDefaultToolkit().createImage( new FilteredImageSource(image.getSource(), cropFilter));
            BufferedImage cutBottomNarrowImg = new BufferedImage( narrowImgW, narrowImgH-cutNarrowImgSize*2,BufferedImage. TYPE_INT_RGB);
            Graphics g = cutBottomNarrowImg.getGraphics();
            g.drawImage(img, 0, 0, null);
            g.dispose();
            ImageIO. write(cutBottomNarrowImg, "JPEG", new File(destImgPath));
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
public static void main(String []args){
    createThumb("G://3.png", "G://223.jpg", 320, 212);
}

 

分享到:
评论

相关推荐

    C#拼图游戏 图片分割和缩放

    设定源矩形和目标矩形的尺寸,即可按比例缩放图片。 5. **拼图游戏逻辑**: - 游戏的核心部分是处理拼图的移动和旋转。这需要维护一个二维数组或链表结构来表示拼图的状态,每个元素对应一块子图片。 - 键盘输入...

    图片无损缩放.rar

    在IT领域,图片无损缩放是一项常见的图像处理技术,其目标是减小图像尺寸的同时,尽可能保持图像质量不变,避免出现像素化或其他质量损失。本文将深入探讨这个主题,并结合"易语言图片无损缩放源码",来解析实现这一...

    图片比例缩放-易语言

    总结来说,"图片比例缩放-易语言"是一个关于易语言中图片处理的实践案例,主要利用"精易模块"的"图片_缩放"命令实现图片尺寸的调整。通过对源代码的学习,开发者可以学习到如何在易语言中进行图片操作,并探索提高...

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

    等比缩放是指在改变图片尺寸时,保持其长宽比不变,防止图片变形。在Java中,我们可以利用`java.awt.Image`类和`java.awt.Graphics2D`类来实现这一功能。`Image`类提供了多种方法来处理图像,而`Graphics2D`则允许...

    易语言-易语言实现图片快速缩放和无损缩放

    4. **执行缩放**:使用“位图缩放”命令,将原位图按比例缩放后复制到新位图上。这一步可能涉及到插值算法,如最近邻插值或双线性插值,以实现快速缩放。 对于无损缩放,过程相对复杂,可能涉及以下方法: 1. **...

    Android下利用Bitmap切割图片

    这个方法可以将Bitmap缩放到指定的尺寸,同时保持原图像的比例: ```java // 缩放Bitmap至新的尺寸 Bitmap scaledBitmap = Bitmap.createScaledBitmap(originalBitmap, newWidth, newHeight, true); ``` 此外,...

    ImageUtil 图片高保真缩放与裁剪,不依赖于任何第三方库

    高保真缩放的目标是在缩小图片尺寸的同时,尽可能地保留原始图片的细节和质量,避免出现像素化的现象。`ImageUtil`可能使用了插值算法来实现这一目标,如双线性插值或三次立方插值,这些算法能在缩放过程中创建新的...

    javascript 指定区域内图片等比例缩放实现代码 脚本之家整合版 <font color=red>原创</font>

    在页面加载完成后,通过`window.onload`事件触发图片的等比例缩放函数`controlImg`,确保在DOM元素完全加载后进行图片尺寸调整。 综上所述,通过JavaScript实现指定区域内图片的等比例缩放功能,需要综合运用...

    图片随机块状缩放显示源码

    4. 缩放与定位:块状图片的缩放和定位可能涉及到矩阵运算,以保持图像的原始比例并正确地在画布上摆放各个块。 5. 图像合成:在所有块处理完毕后,需要将它们合并成一个整体,这通常通过像素级操作完成,将每个块的...

    php图片上传类,目录自动分割、等比例缩略图 开发技术.zip

    通过计算源图像和目标尺寸的比例,然后进行相应的裁剪或缩放。 - 缩略图类通常包含方法如`createThumbnail()`,它接受源图像路径、目标尺寸和保持比例的标志,返回缩略图的路径。 4. **开发技术**: - 在实现这些...

    ThinkPHP中图片按比例切割的代码实例

    在ThinkPHP框架中,处理图片按比例切割是一个常见的需求,特别是在网页设计和移动应用中,保持图片比例不变是非常重要的,可以防止图片变形,确保视觉效果的一致性。本篇文章将详细解析如何在ThinkPHP中实现图片按...

    php url 图片切割 EvaThumber

    在Web开发中,我们经常遇到需要处理图片的需求,例如调整图片尺寸、裁剪、缩放等。PHP作为服务器端脚本语言,可以很好地实现这些功能。EvaThumber是一款基于PHP的图片处理库,它专门用于处理图片的切割、缩放和其他...

    将图片保存为不同尺寸的PHP类.zip

    - 类可能提供一个方法,接受目标尺寸作为参数,根据原图自动调整比例,生成不同尺寸的图片。这对于创建缩略图、预览图或适应不同设备的显示非常有用。 通过这个PHP类,开发者可以简化图片处理流程,提高代码的可...

    jsp图片压缩

    图像切割是指将一张大图片分割成多个小图片,通常用于创建图片网格或者分块加载大图片以提高加载速度。在代码示例中,通过循环遍历原图,利用`CropImageFilter`类对原图进行裁剪。 - **参数解析**: - `...

    Android-Android加载大图可以高清显示10000*10000像素的图片轻松实现微博长图功能

    2. **缩放算法**:基于原始尺寸和目标视口大小,我们可以计算出合适的缩放因子(`inSampleSize`),使得加载到内存的图片大小适合屏幕显示。常用的缩放算法有平方根缩放、等比缩放等。 3. **内存管理**:使用`...

    java图片处理工具类

    - **按比例缩放**: - `ImageUtils.scale(srcImageFile, result, scale, flag)`: 其中`srcImageFile`表示源图片路径,`result`表示目标图片路径,`scale`表示缩放倍数(如2表示放大两倍),`flag`表示是否为等比...

    图片处理工具类

    文字水印通常是将一段文字以透明度较低的形式叠加在图像上,而图片水印则是将另一张图片以类似的方式添加到原图。`addTextWatermark`和`addImageWatermark`可能是用于实现这两个功能的方法,它们接受源图像、水印...

    基于opencv的YOLOV3对图片的目标检测

    3. **Anchor Boxes**:YOLOV3借鉴了Faster R-CNN的Anchor Boxes思想,预先定义了一组比例和宽高比的参考框,以适应不同形状的目标,减少定位误差。 4. **新损失函数**:YOLOV3使用了联合的分类和定位损失函数,包括...

    类似淘宝的图片放大功能

    可能需要引入polyfill或降级策略,以确保功能在所有目标浏览器中都能正常运行。 通过以上知识点的综合运用,我们可以构建出一个功能完备且用户体验良好的图片放大镜效果,如同淘宝网站上所见到的那样。这不仅提升了...

    车牌定位之字符分割

    对于大小不一的字符,可以利用图像缩放使字符尺寸标准化。 另外,基于深度学习的方法,如卷积神经网络(CNN),近年来也在车牌字符分割中展现出强大的性能。通过训练特定的模型,可以直接在原始图像上画出字符的...

Global site tag (gtag.js) - Google Analytics