`
竹临仙
  • 浏览: 37845 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

设置图片等比例缩小

J# 
阅读更多
//-------------------------------可以将图片等比例缩小
//========还学到了获得图片的宽,高
BufferedImage im = ImageIO.read(new File("E:\\Vista.jpg")); 
width = im.getWidth(); 
  height =im.getHeight(); 


//===============================

package com.Utils;

import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

public class ImageScale {

    private int width; 
    private int height; 
    private int scaleWidth; 
    double support = (double) 3.0; 
    double PI = (double) 3.14159265358978; 
    double[] contrib; 
    double[] normContrib; 
    double[] tmpContrib; 
    int startContrib, stopContrib; 
    int nDots; 
    int nHalfDots; 
 
    public BufferedImage imageZoomOut(BufferedImage srcBufferImage, int w, int h) { 
        width = srcBufferImage.getWidth(); 
        height = srcBufferImage.getHeight(); 
        scaleWidth = w; 
 
        if (DetermineResultSize(w, h) == 1) { 
            return srcBufferImage; 
        } 
        CalContrib(); 
        BufferedImage pbOut = HorizontalFiltering(srcBufferImage, w); 
        BufferedImage pbFinalOut = VerticalFiltering(pbOut, h); 
        return pbFinalOut; 
    } 
 
    /**
     * 决定图像尺寸
     */ 
    private int DetermineResultSize(int w, int h) { 
        double scaleH, scaleV; 
        scaleH = (double) w / (double) width; 
        scaleV = (double) h / (double) height; 
        // 需要判断一下scaleH,scaleV,不做放大操作 
        if (scaleH >= 1.0 && scaleV >= 1.0) { 
            return 1; 
        } 
        return 0; 
 
    } // end of DetermineResultSize() 
 
    private double Lanczos(int i, int inWidth, int outWidth, double Support) { 
        double x; 
 
        x = (double) i * (double) outWidth / (double) inWidth; 
 
        return Math.sin(x * PI) / (x * PI) * Math.sin(x * PI / Support) 
                / (x * PI / Support); 
 
    } // end of Lanczos() 
 
    // 
    // Assumption: same horizontal and vertical scaling factor 
    // 
    private void CalContrib() { 
        nHalfDots = (int) ((double) width * support / (double) scaleWidth); 
        nDots = nHalfDots * 2 + 1; 
        try { 
            contrib = new double[nDots]; 
            normContrib = new double[nDots]; 
            tmpContrib = new double[nDots]; 
        } catch (Exception e) { 
            System.out.println("init contrib,normContrib,tmpContrib" + e); 
        } 
 
        int center = nHalfDots; 
        contrib[center] = 1.0; 
 
        double weight = 0.0; 
        int i = 0; 
        for (i = 1; i <= center; i++) { 
            contrib[center + i] = Lanczos(i, width, scaleWidth, support); 
            weight += contrib[center + i]; 
        } 
 
        for (i = center - 1; i >= 0; i--) { 
            contrib[i] = contrib[center * 2 - i]; 
        } 
 
        weight = weight * 2 + 1.0; 
 
        for (i = 0; i <= center; i++) { 
            normContrib[i] = contrib[i] / weight; 
        } 
 
        for (i = center + 1; i < nDots; i++) { 
            normContrib[i] = normContrib[center * 2 - i]; 
        } 
    } // end of CalContrib() 

   // 处理边缘 
   private void CalTempContrib(int start, int stop) { 
       double weight = 0; 

       int i = 0; 
       for (i = start; i <= stop; i++) { 
           weight += contrib[i]; 
       } 

       for (i = start; i <= stop; i++) { 
           tmpContrib[i] = contrib[i] / weight; 
       } 

   } // end of CalTempContrib() 

   private int GetRedValue(int rgbValue) { 
       int temp = rgbValue & 0x00ff0000; 
       return temp >> 16; 
   } 

   private int GetGreenValue(int rgbValue) { 
       int temp = rgbValue & 0x0000ff00; 
       return temp >> 8; 
   } 

   private int GetBlueValue(int rgbValue) { 
       return rgbValue & 0x000000ff; 
   } 

   private int ComRGB(int redValue, int greenValue, int blueValue) { 

       return (redValue << 16) + (greenValue << + blueValue; 
   } 

   // 行水平滤波 
   private int HorizontalFilter(BufferedImage bufImg, int startX, int stopX, 
           int start, int stop, int y, double[] pContrib) { 
       double valueRed = 0.0; 
       double valueGreen = 0.0; 
       double valueBlue = 0.0; 
       int valueRGB = 0; 
       int i, j; 

       for (i = startX, j = start; i <= stopX; i++, j++) { 
           valueRGB = bufImg.getRGB(i, y); 

           valueRed += GetRedValue(valueRGB) * pContrib[j]; 
           valueGreen += GetGreenValue(valueRGB) * pContrib[j]; 
           valueBlue += GetBlueValue(valueRGB) * pContrib[j]; 
       } 

       valueRGB = ComRGB(Clip((int) valueRed), Clip((int) valueGreen), 
               Clip((int) valueBlue)); 
       return valueRGB; 

   } // end of HorizontalFilter() 

   // 图片水平滤波 
   private BufferedImage HorizontalFiltering(BufferedImage bufImage, int iOutW) { 
       int dwInW = bufImage.getWidth(); 
       int dwInH = bufImage.getHeight(); 
       int value = 0; 
       BufferedImage pbOut = new BufferedImage(iOutW, dwInH, 
               BufferedImage.TYPE_INT_RGB); 

       for (int x = 0; x < iOutW; x++) { 

           int startX; 
           int start; 
           int X = (int) (((double) x) * ((double) dwInW) / ((double) iOutW) + 0.5); 
           int y = 0; 

           startX = X - nHalfDots; 
           if (startX < 0) { 
               startX = 0; 
               start = nHalfDots - X; 
           } else { 
               start = 0; 
           } 

           int stop; 
           int stopX = X + nHalfDots; 
           if (stopX > (dwInW - 1)) { 
               stopX = dwInW - 1; 
               stop = nHalfDots + (dwInW - 1 - X); 
           } else { 
               stop = nHalfDots * 2; 
           } 

           if (start > 0 || stop < nDots - 1) { 
               CalTempContrib(start, stop); 
               for (y = 0; y < dwInH; y++) { 
                   value = HorizontalFilter(bufImage, startX, stopX, start, 
                           stop, y, tmpContrib); 
                   pbOut.setRGB(x, y, value); 
               } 
           } else { 
               for (y = 0; y < dwInH; y++) { 
                   value = HorizontalFilter(bufImage, startX, stopX, start, 
                           stop, y, normContrib); 
                   pbOut.setRGB(x, y, value); 
               } 
           } 
       } 

       return pbOut; 

   } // end of HorizontalFiltering() 

   private int VerticalFilter(BufferedImage pbInImage, int startY, int stopY, 
           int start, int stop, int x, double[] pContrib) { 
       double valueRed = 0.0; 
       double valueGreen = 0.0; 
       double valueBlue = 0.0; 
       int valueRGB = 0; 
       int i, j; 

       for (i = startY, j = start; i <= stopY; i++, j++) { 
           valueRGB = pbInImage.getRGB(x, i); 

           valueRed += GetRedValue(valueRGB) * pContrib[j]; 
           valueGreen += GetGreenValue(valueRGB) * pContrib[j]; 
           valueBlue += GetBlueValue(valueRGB) * pContrib[j]; 
           // System.out.println(valueRed+"->"+Clip((int)valueRed)+"<-"); 
           // 
           // System.out.println(valueGreen+"->"+Clip((int)valueGreen)+"<-"); 
           //System.out.println(valueBlue+"->"+Clip((int)valueBlue)+"<-"+"-->") 
           // ; 
       } 

       valueRGB = ComRGB(Clip((int) valueRed), Clip((int) valueGreen), 
               Clip((int) valueBlue)); 
       // System.out.println(valueRGB); 
       return valueRGB; 

   } // end of VerticalFilter() 

   private BufferedImage VerticalFiltering(BufferedImage pbImage, int iOutH) { 
 
       int iW = pbImage.getWidth(); 
       int iH = pbImage.getHeight(); 
       int value = 0; 
       BufferedImage pbOut = new BufferedImage(iW, iOutH, 
               BufferedImage.TYPE_INT_RGB); 

       for (int y = 0; y < iOutH; y++) { 

           int startY; 
           int start; 
           int Y = (int) (((double) y) * ((double) iH) / ((double) iOutH) + 0.5); 

           startY = Y - nHalfDots; 
           if (startY < 0) { 
               startY = 0; 
               start = nHalfDots - Y; 
           } else { 
               start = 0; 
           } 

           int stop; 
           int stopY = Y + nHalfDots; 
           if (stopY > (int) (iH - 1)) { 
               stopY = iH - 1; 
               stop = nHalfDots + (iH - 1 - Y); 
           } else { 
               stop = nHalfDots * 2; 
           } 

           if (start > 0 || stop < nDots - 1) { 
               CalTempContrib(start, stop); 
               for (int x = 0; x < iW; x++) { 
                   value = VerticalFilter(pbImage, startY, stopY, start, stop, 
                           x, tmpContrib); 
                   pbOut.setRGB(x, y, value); 
               } 
           } else { 
               for (int x = 0; x < iW; x++) { 
                   value = VerticalFilter(pbImage, startY, stopY, start, stop, 
                           x, normContrib); 
                   pbOut.setRGB(x, y, value); 
               } 
           } 

       } 

       return pbOut; 

   } // end of VerticalFiltering() 

   int Clip(int x) { 
       if (x < 0) 
           return 0; 
       if (x > 255) 
           return 255; 
       return x; 
   } 

   public static void main(String[] args) throws Exception{ 
        
       BufferedImage im = ImageIO.read(new File("E:\\Vista.jpg")); 
       BufferedImage image2 = new ImageScale().imageZoomOut(im,100,100); 
       ImageIO.write(image2, "JPEG", new File("e:\\6.jpg")); 
        
        
        
   } 
}
分享到:
评论

相关推荐

    jquery图片插件设置图片等比例缩放

    "jQuery图片插件设置图片等比例缩放"是一个实用的功能,能够确保图片在不同尺寸的屏幕上保持其原始比例,从而避免图片变形,提供良好的视觉效果。jQuery作为一款强大的JavaScript库,提供了丰富的功能来处理DOM操作...

    jquery图片插件设置图片等比例缩放.rar

    jquery图片插件设置图片等比例缩放.rarjquery图片插件设置图片等比例缩放.rarjquery图片插件设置图片等比例缩放.rarjquery图片插件设置图片等比例缩放.rarjquery图片插件设置图片等比例缩放.rarjquery图片插件设置...

    js实现图片等比例缩放

    在网页设计中,图片的等比例缩放是一个常见的需求,特别是在响应式布局中,为了保持图像的原始比例,避免拉伸或压缩导致变形,我们通常会利用JavaScript来动态调整图片大小。本文将深入探讨如何使用JavaScript实现...

    php图片等比例缩放

    从开源代码中总结的php图片等比例缩放 测试可用

    图片等比例缩放,网页图片处理方法

    ### 图片等比例缩放——网页图片处理方法 在网页设计与开发中,为了确保页面布局的美观性和响应性,经常需要对图片进行等比例缩放处理。这不仅可以提高用户体验,还能有效减少页面加载时间。本文将详细介绍如何利用...

    JS图片等比例缩放方法完整示例

    为了保持图片的原始比例,避免拉伸或压缩导致失真,开发者通常会使用等比例缩放的方法。本篇将详细介绍如何使用JavaScript实现图片的等比例缩放,并通过一个完整的示例来解析其工作原理。 首先,我们需要理解等比例...

    图片等比例缩小(JS)

    使用一个方法可以等比例缩小你的,让图片不失去原本的效果。

    图片按比例缩放

    这些工具通常提供“自由变换”功能,允许用户输入特定的缩放比例,或者通过拖动角落的控制点来等比例调整图片大小。 在编程领域,我们也可以利用各种编程语言实现图片的按比例缩放。例如,Python中的PIL(Pillow)...

    jquery图片等比例缩放

    有时候我们需要图片在不同的屏幕尺寸下保持等比例缩放,以确保图片的视觉效果不被破坏。jQuery,一个广泛使用的JavaScript库,提供了方便的API来实现这样的功能。本文将深入探讨如何利用jQuery实现图片的等比例缩放...

    图片等比例缩放个人最优化版(IE6,IE7,FF)

    《图片等比例缩放技术详解及优化实践》 在网页设计中,图片的展示效果往往直接影响用户体验。尤其是当图片尺寸不一,或者需要在不同设备上展示时,等比例缩放成为一种必不可少的技术手段。本文将深入探讨如何实现...

    图片等比例缩放代码,图片等比例缩放JS代码,图片缩放代码

    在网页设计和开发中,图片的处理是一项非常重要的工作,特别是在响应式布局中,确保图片能够根据屏幕尺寸等比例缩放是必要的。本篇将详细讲解如何使用JavaScript实现图片等比例缩放,以及相关的编程知识。 一、图片...

    JavaScript实现网页图片等比例缩放 图片等比例缩放

    ### JavaScript 实现网页图片等比例缩放 在网页设计与开发过程中,经常遇到的一个问题是确保图片能在不同设备、不同分辨率的屏幕上保持良好的显示效果。图片的等比例缩放是其中一种解决方案,它能够保证图片在缩放...

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

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

    图片等比例缩放问题

    ### 图片等比例缩放问题解析 在处理图像时,经常需要对图片进行等比例缩放,以适应不同的显示需求或优化存储空间。本篇文章将详细介绍如何实现图片的等比例缩放,包括缩放的基本原理、实现方法以及注意事项。 ####...

    图片等比例缩放,动态加载

    图片等比例缩放和动态加载是两种常见的优化技术,它们可以提高页面加载速度,节省用户流量,同时保持图片的视觉一致性。以下将详细介绍这两种技术及其实现方法。 一、图片等比例缩放 等比例缩放是指在不改变图片宽...

    js图片缩放效果制作鼠标滚动图片等比例缩放

    在网页设计中,动态的图片展示效果可以提升用户体验,其中一种常见的技术是通过JavaScript实现鼠标滚动时图片等比例缩放。这个技术的核心在于利用JavaScript事件监听和CSS3变换功能,来实现图片随着页面滚动而优雅地...

    Python代码批处理图片,按照宽度等比例缩放

    本文将深入探讨如何使用Python进行图片批处理,特别是按照宽度等比例缩放,以提升工作效率,适用于电商网店的商品图批量处理。 首先,我们需要了解基本的图像处理概念。图像通常由像素组成,其尺寸可以用宽度和高度...

    CSS3的background-size属性,实现响应式式图片等比例缩放。

    CSS3的`background-size`属性就是实现响应式图片等比例缩放的关键技术之一,它解决了传统方法中图片在不同屏幕尺寸下显示不适应的问题。 `background-size`属性允许我们自定义背景图片的大小,而不仅仅是局限于图片...

    图片等比例缩放.txt 图片等比例缩放.txt

    ### 图片等比例缩放知识点解析 #### 一、知识点概述 在网页设计与开发过程中,经常需要处理图片的大小调整问题。为了保持图片的视觉效果不失真,等比例缩放成为了常用的一种处理方式。本篇文章将从一个具体的...

Global site tag (gtag.js) - Google Analytics