java 图片放大与缩小,java怎么把图片等比例缩小

  java 图片放大与缩小,java怎么把图片等比例缩小

  本文实例为大家分享了爪哇岛项目实现图片等比缩放的具体代码,供大家参考,具体内容如下

  包装常见;导入Java。awt。形象;导入Java。awt。形象。缓冲图像;导入Java。io。文件输出流;导入Java。io。io异常;导入Java。io。inputstream导入javax。imageio。imageio公共类图像压缩任务实现可运行的{私有输入流是私有字符串文件名;私有int宽度;私有int高度;/** * 初始化参数* @param是图片输入流* @param文件图片* @param文件名图片名称* @param宽度高* @param高度宽*/public ImageCompressionTask(InputStream is,String fileName,int width,int height){ this。is=是;this.fileName=文件名;this.width=宽度;this.height=高度;} public void run() { //TODO自动生成的方法存根试试{这个。压缩pic();} catch(异常e){ system。出去。println(文件压缩失败e);} }私有字符串压缩图片()抛出异常{ String path= E: 谢 //新图片存放路径字符串urlPath=路径文件名;buffered image buffeimagefile output stream输出=nullBufferedImage compress pic=null请尝试{ String imagetype=if(filename . lastindexof( . ))) !=-1){ imagetype=filename。子字符串(文件名。lastindexof( . ) 1).toLowerCase();} imagetype=imagetype。tolowercase();//文件后缀名output=新文件输出流(URL路径);buff image=imageio。读(是);//图片缩放compress pic=compress picmin(buff image,width,height);//输出图片ImageIO.write(compressPic,imagetype,output);}最后{如果(输出!=null){ try { output。close();} catch(io异常e){ e . getstacktrace();} }如果(是!=null){是。close();} }返回文件名;} /** * 图片等比缩放*@param图像图片输入缓存流*@param输出宽度图片压缩到的宽*@param outputHeight图片压缩到的高* @返回缓冲图像* */私有缓冲图像compressPicMin(缓冲图像

  e image,    int outputWidth, int outputHeight) {        // TODO Auto-generated method stub        if(image==null){            return null;        }                //如果图片本身的宽和高均小于要压缩到的宽和高,则不压缩直接返回        if(outputWidth>image.getWidth(null)&&outputHeight>image.getHeight(null)){            return image;        }                int newWidth;        int newHeight;        //宽和高等比缩放的率        double rate1=(double)image.getWidth(null)/(double)outputWidth;        double rate2=(double)image.getHeight(null)/(double)outputHeight;        //控制缩放大小        double rate=rate1<rate2 ? rate1:rate2;        newWidth=(int) (image.getWidth(null)/rate);        newHeight=(int) (image.getHeight(null)/rate);                BufferedImage newImage=new BufferedImage(newWidth, newHeight,BufferedImage.TYPE_INT_RGB);        newImage.createGraphics().drawImage(image.getScaledInstance(newWidth, outputHeight, Image.SCALE_SMOOTH), 0, 0, null);         return newImage;    }        public int getWidth() {        return width;    }      public void setWidth(int width) {        this.width = width;    }      public int getHeight() {        return height;    }      public void setHeight(int height) {        this.height = height;    }  }创建ImageTest写一个main()

  

package test1;  import java.io.File;import java.io.FileInputStream;import java.io.InputStream;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.LinkedBlockingQueue;import java.util.concurrent.SynchronousQueue;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit; import common.ImageCompressionTask;  public class ImageTest {     public static void main(String[] args){        String imgName = System.currentTimeMillis() + "_" + ((int) (Math.random() * 900) + 100) + "." + "jpg";        File f=new File("E:\xie\xxx.jpg");        try {            InputStream input = new FileInputStream(f);            ImageCompressionTask r=new ImageCompressionTask(input, imgName, 520, 320);            /*             * 方法一:             *              Thread thread1 = new Thread(r);             thread1.start(); // 启动线程            */                        /*             * 方法二:使用ThreadPoolExecutor创建线程池,并不提倡我们直接使用ThreadPoolExecutor             *              */            /* ThreadPoolExecutor executor = new ThreadPoolExecutor(                        5,  //核心池的大小(即线程池中的线程数目大于这个参数时,提交的任务会被放进任务缓存队列)                        10, //线程池最大能容忍的线程数                        200, //线程存活时间                           TimeUnit.MILLISECONDS, //参数keepAliveTime的时间单位                        new ArrayBlockingQueue<Runnable>(5) //任务缓存队列,用来存放等待执行的任务             );            executor.execute(r);*/            /*             * 方法三:并不提倡我们直接使用ThreadPoolExecutor,而是使用Executors类中提供的几个静态方法来创建线程池             *  以下是三个静态方法             *  Executors.newCachedThreadPool();        //创建一个缓冲池,缓冲池容量大小为Integer.MAX_VALUE                         *  Executors.newSingleThreadExecutor();   //创建容量为1的缓冲池                         *  Executors.newFixedThreadPool(int);    //创建固定容量大小的缓冲池             */             newCachedThreadPool().execute(r);             //newSingleThreadExecutor().execute(r);             //newFixedThreadPool(10).execute(r);            System.out.println("图片上传成功");        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }        /*静态方法的具体实现     * Executors.newCachedThreadPool()     * 创建一个缓冲池,缓冲池容量大小为Integer.MAX_VALUE     */    public static ExecutorService newCachedThreadPool() {        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,                                      60L, TimeUnit.SECONDS,                                      new SynchronousQueue<Runnable>());    }        /*静态方法的具体实现     * Executors.newSingleThreadExecutor()      * 创建容量为1的缓冲池     */    public static ExecutorService newSingleThreadExecutor() {        return  new ThreadPoolExecutor(1, 1,                                    0L, TimeUnit.MILLISECONDS,                                    new LinkedBlockingQueue<Runnable>());    }        /*静态方法的具体实现     * Executors.newFixedThreadPool(int)      * 创建固定容量大小的缓冲池     */    public static ExecutorService newFixedThreadPool(int nThreads) {        return new ThreadPoolExecutor(nThreads, nThreads,                                      0L, TimeUnit.MILLISECONDS,                                      new LinkedBlockingQueue<Runnable>());    }}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持盛行IT。

 

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: