`

图片压缩

阅读更多
/**  
 * Copyright 2008 pantosoft. All rights reserved.  
 */  
import java.awt.Image;   
import java.awt.image.BufferedImage;   
import java.io.BufferedReader;   
import java.io.File;   
import java.io.FileNotFoundException;   
import java.io.FileOutputStream;   
import java.io.IOException;   
import java.io.InputStreamReader;   
import java.io.OutputStream;   
  
import com.sun.image.codec.jpeg.JPEGCodec;   
import com.sun.image.codec.jpeg.JPEGImageEncoder;   
  
/**  
 * 针对特定文件夹下的所有子目录图片文件缩略图  
 *      要求: 1.安装好jdk,并且配置好运行环境;  
 *              2.文件小于1mb;  
 *              3.文件后缀为:“jpg,jpeg,gif,bmp”中的一种或几种;  
 * 使用方法:1.widows平台下,安装JDK后,直接运行ImageResizer.bat即可。  
 * 注意:支持递归生成策略。  
 *   
 * @author Cheng 2008-9-22 上午11:26:46  
 * @version 1.0.0  
 */  
public class ImageResizer {   
    private static final String PIC_TEMPORARY   = "_temporary.db";   
    private static final String LOG_FILE_NAME   = "operate.log";   
    private static int          successed       = 0;   
    private static int          allFiles        = 0;   
    private String              dir             = null;   
    private StringBuilder       failedFiles     = new StringBuilder();   
    private StringBuilder       infomation      = new StringBuilder();   
  
    /**  
     * 构造函数,初始化目标文件夹  
     * @param dir  
     */  
    public ImageResizer(String dir) {   
        this.dir = dir;   
    }   
  
    public void operate(String _path) {   
        if (_path == null)   
            throw new NullPointerException("您还没有初始化需要操作的文件路径。");   
        File file = new File(_path);   
        if (!file.exists()) {   
            return;   
        }   
        File[] files = file.listFiles();   
        if (files.length >= 10000) {   
            write(_path + "目录下文件大于10000个,请分批处理!");   
            return;   
        } else {   
            for (int i = 0; i < files.length; i++) {   
                allFiles++;   
                if (files[i].isDirectory()) {   
                    write("处理目录:" + files[i].getAbsolutePath());   
                    this.operate(files[i].getAbsolutePath());   
                } else {   
                    write("\t处理文件:" + files[i].getName());   
                    if (files[i].length() > 1000000) {   
                        write("\t超大:" + files[i].getAbsoluteFile() + "["  
                                + files[i].length() + "]字节。");   
                        failedFiles.append("\t超大:" + files[i].getAbsoluteFile()   
                                + "[" + files[i].length() / 1000 + "]字节。\n");   
                        continue;   
                    }   
                    if (files[i].getName().indexOf(".") != -1) {   
                        //已经是缩略图文件了   
                        if (files[i].getName().indexOf(PIC_TEMPORARY) != -1)   
                            continue;   
                        String ext = files[i].getName().substring(   
                                files[i].getName().lastIndexOf("."),   
                                files[i].getName().length()).toLowerCase();   
                        if (ext.equals(".jpg") || ext.equals(".gif")   
                                || ext.equals(".bmp")) {   
                            write("\t压缩:" + files[i].getName() + "...");   
                            resize(files[i]);   
                            write("\t完成:" + files[i].getName() + "");   
                        }   
                    } else {   
                        write("文件类型未知!");   
                    }   
                }   
            }   
        }   
    }   
  
    /**  
     * 输出,方便拓展成log4j,或者其它形式。  
     * @param str  
     */  
    public void write(String str) {   
        infomation.append("\n").append(str);   
    }   
  
    private void flush() {   
        if (this.dir == null || this.dir.equals(""))   
            throw new NullPointerException(   
                    "destinate folder is null or its value is empty.");   
        File file = null;   
        if (file == null || file.exists()) {   
            file = new File(this.dir + "/" + LOG_FILE_NAME);   
        }   
        try {   
            OutputStream stream = new FileOutputStream(file, false);   
            stream.write((this.infomation.toString()).getBytes());   
            if (this.failedFiles.toString().length() != 0) {   
                stream.write("\n\n\n--失败文件列表--\n".getBytes());   
                stream.write((this.failedFiles.toString()).getBytes());   
                stream.write("\n--------------".getBytes());   
            }   
            stream.flush();   
            stream.close();   
        } catch (FileNotFoundException ex) {   
            // TODO Auto-generated catch block   
            ex.printStackTrace();   
        } catch (IOException ex) {   
            // TODO Auto-generated catch block   
            ex.printStackTrace();   
        }   
    }   
  
    public void resize(File _file) {   
        if (_file == null || _file.length() == 0) {   
            throw new NullPointerException("目标文件错误!");   
        }   
        ImageUtils imageUtils = null;   
        try {   
            imageUtils = new ImageUtils(_file);   
            imageUtils.resize(160, 140);   
  
        } catch (IOException ex) {   
            ex.printStackTrace();   
        }   
    }   
  
    /**  
     * 获取出如流,并转换成String  
     * @return  
     */  
    private static String inputString() {   
        BufferedReader bufferedreader = new BufferedReader(   
                new InputStreamReader(System.in));   
        String s = null;   
        try {   
            s = bufferedreader.readLine();   
        } catch (IOException ioexception) {   
            ioexception.printStackTrace();   
        }   
        return s;   
    }   
  
    /**  
     *   
     * @author Cheng 2008-9-27 上午10:32:18  
     * @version 1.0.0  
     */  
    private static class ImageUtils {   
        private Image   srcImage    = null;   
        /**  
         * 源图片文件  
         */  
        private File    srcFile     = null;   
        /**  
         * 目标文件  
         */  
        private File    destFile    = null;   
  
        private String  fileSuffix  = null;   
  
        /**  
         * 构造函数  
         * @param fileName  
         * @throws IOException  
         */  
        public ImageUtils(String fileName) throws IOException {   
            this(new File(fileName));   
        }   
  
        /**  
         *   
         * @param fileName  
         * @throws IOException  
         */  
        public ImageUtils(File fileName) throws IOException {   
            File _file = fileName;   
            _file.setReadOnly();   
            this.srcFile = _file;   
            this.fileSuffix = _file.getName().substring(   
                    (_file.getName().indexOf(".") + 1),   
                    (_file.getName().length()));   
            this.destFile = new File(this.srcFile.getPath().substring(0,   
                    (this.srcFile.getPath().lastIndexOf(".")))   
                    + PIC_TEMPORARY + "." + this.fileSuffix);   
            srcImage = javax.imageio.ImageIO.read(_file);   
        }   
  
        /**  
         * 强制压缩/放大图片到固定的大小  
         * @param w int 新宽度  
         * @param h int 新高度  
         * @throws IOException  
         */  
        public void resize(int w, int h) throws IOException {   
            //构建图片对象   
            BufferedImage _image = new BufferedImage(w, h,   
                    BufferedImage.TYPE_INT_RGB);   
            //绘制缩小后的图   
            _image.getGraphics().drawImage(srcImage, 0, 0, w, h, null);   
            //输出到文件流   
            FileOutputStream out = new FileOutputStream(destFile);   
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);   
            encoder.encode(_image);   
            out.flush();   
            out.close();   
            successed++;   
        }   
    }   
  
    /**  
     * 测试Main  
     * @param args  
     */  
    public static void main(String[] args) {   
        System.out.print("请输入目标文件夹:");   
        String s = inputString();   
        long currentTime = System.currentTimeMillis();   
        ImageResizer resizer = new ImageResizer(s);   
        resizer.operate(s);   
        long finishTime = System.currentTimeMillis();   
        long waste = finishTime - currentTime;   
        resizer.write(s + "下共有" + allFiles + "个文件\n" + "\t成功:" + successed   
                + "\n\t失败:" + (allFiles - successed));   
        resizer.write("耗时:" + waste / 1000 + "s");   
        resizer.flush();   
        System.out.println("处理完成,请看目标文件夹下日志文件。");   
    }   
}  
分享到:
评论

相关推荐

    C# core 图片压缩 图片无损压缩 图片无损剪切 无损图片压缩 无损图片剪切

    在C# Core中进行图片处理是一项常见的任务,其中包括图片压缩和剪切操作。无损压缩和剪切技术在保持原始图像质量的同时,可以减小文件大小或改变图像的形状。以下将详细介绍C# Core中如何实现这些功能。 首先,我们...

    图片压缩小工具

    《ImageResizer.exe:一款轻巧实用的图片压缩神器》 在数字时代,我们经常会遇到大量图片需要处理的情况,无论是为了存储空间的节省,还是为了网络传输的便捷,图片压缩都成为了必不可少的操作。今天,我们要介绍的...

    易语言图片压缩到最小

    在IT行业中,图片压缩是一项非常重要的技术,尤其是在网络传输、存储和显示图像时。"易语言图片压缩到最小"这个主题涉及到的是如何使用易语言这一编程工具来实现图片的高效压缩,以减小其占用的存储空间。易语言是...

    图片压缩到最小.rar

    在IT领域,图片压缩是一项重要的技术,特别是在网络传输、存储和显示方面。"图片压缩到最小.rar"这个压缩包文件的标题和描述直接指向了这一主题。本文将深入探讨图片压缩的基本原理、常见方法以及易语言...

    C#图片压缩工具源代码

    Grearo图片压缩工具 功能介绍【必读】: 1 图片批量压缩(30以内,依个人机器以及被压缩图片大小而定); 2 图片限定宽度,等比例压缩; 3 图片限定高度,等比例压缩; 4 图片限定高度,宽度压缩;...

    图片压缩节约内存

    在IT行业中,图片压缩是一个非常重要的技术,尤其是在内存管理和移动应用开发中。标题"图片压缩节约内存"直接指向了这个核心目标:通过压缩图片来减少应用程序对内存的占用,从而提高性能并避免内存溢出的问题。这在...

    java图片压缩处理(可以压缩为任意大小

    在Java编程语言中,处理图片压缩是一项常见的任务,特别是在存储、传输或展示大量图像资源时。本主题将深入探讨如何使用Java实现图片压缩,并能够将其调整到任意大小,同时保持图片质量并避免变形。 首先,我们需要...

    小巧的图片压缩工具,压缩比例可调。

    在IT领域,图片压缩是一个非常实用的技术,尤其在网页设计、社交媒体分享、存储空间有限的设备上。本文将深入探讨一款被描述为“小巧的图片压缩工具,压缩比例可调”的软件,它允许用户批量处理图片,降低文件大小而...

    事业单位图片压缩工具

    【事业单位图片压缩工具】是一款专为事业单位设计的高效图片压缩软件,它能够处理市面上常见的多种图片格式,如JPEG(JPG)、PNG、BMP、GIF等。该工具的主要功能在于大幅度减小图片的文件大小,例如,一个原本2MB的...

    移动端H5图片压缩上传

    在移动端H5应用中,图片压缩上传是一项常见的需求,它涉及到前端图像处理、文件上传以及与服务器的交互。本文将详细讲解如何实现这一功能,主要关注JavaScript开发中的图片展示处理。 首先,我们要理解图片压缩的...

    图片压缩flex demo

    在IT行业中,图片压缩是一个非常重要的领域,尤其是在网络传输、存储和显示方面。"图片压缩flex demo"这个项目显然关注的是使用Flex技术进行图片压缩的示例。Flex是一种基于Adobe Flash Player或Adobe AIR运行时的...

    蜂鸟图片压缩软件 JPG PNG 压缩

    【蜂鸟图片压缩软件 JPG PNG 压缩】 在数字媒体和互联网领域,图片的大小对网站加载速度和存储空间有着直接影响。为了优化用户体验和节省资源,图片压缩变得至关重要。"蜂鸟图片压缩软件"(Hummingbird)是专为此...

    VB6图片压缩处理源码

    总的来说,VB6图片压缩处理源码可能涵盖了图像读取、压缩算法应用、图像尺寸调整、文件I/O以及用户交互等多个方面,体现了VB6结合外部库进行图像处理的能力。通过理解这些知识点,可以对源码进行深入研究和扩展,以...

    pb 图片压缩、解压技术结合XML

    在本项目中,"pb 图片压缩、解压技术结合XML" 提到了如何使用PB进行图片处理,具体涉及图片的压缩和解压,并结合XML文件进行数据存储。以下是关于这个主题的详细知识点: 1. **图片压缩**:图片压缩通常是为了减小...

    html5 canvas 图片压缩

    HTML5 Canvas是Web开发中的一个强大工具,它允许开发者在网页上进行动态...通过理解并运用上述技术,你可以创建一个高效且兼容性强的图片压缩解决方案,确保在微信、Chrome、Firefox等不同环境中都能得到良好的效果。

    批量图片压缩处理工具

    在IT行业中,图片压缩是一个非常重要的领域,尤其是在网络传输、存储和显示图像时,为了减少带宽需求和存储空间,通常需要对图片进行压缩。批量图片压缩处理工具就是专门针对这种情况设计的,它能帮助用户一次性处理...

    前端图片压缩base64后台还原图片

    本文将深入探讨“前端图片压缩base64”这一主题,以及如何在后台还原这些压缩后的图片。 一、前端图片压缩 前端图片压缩的主要目标是减小图片大小,从而减少HTTP请求的数据量,加快网页加载速度。这通常通过以下两...

    图片压缩工具PNG图片压缩工具压缩率高不失真

    PNG图片压缩工具是一种高效优化图像文件大小的软件,尤其适用于需要高质量、透明度支持的图像。PNG(Portable Network Graphics)格式因其无损压缩和广泛的颜色范围而被广泛使用,但通常其文件大小比其他格式如JPEG...

    瑞影无损图片压缩大师

    《瑞影无损图片压缩大师:打造高效且高质量的图像管理》 在数字时代,图片文件的体积常常成为存储和传输的一大难题。【瑞影无损图片压缩大师】这款软件,便是为解决这一问题而生的利器。它专门针对市面上的各种图片...

    图片压缩Caesium.zip

    《深入理解图片压缩技术——以Caesium软件为例》 在数字化时代,图片处理与分享成为日常生活的一部分,而图片压缩则是其中的关键环节。Caesium是一款高效、实用的图片压缩工具,它能够大幅度减小图片文件的大小,...

Global site tag (gtag.js) - Google Analytics