首页 > 编程语言 >java中判断图片格式并且等比例压缩图片

java中判断图片格式并且等比例压缩图片

时间:2023-07-30 18:04:40浏览次数:30  
标签:java File 图片格式 file import 图片 压缩 String

最近项目中需要判断上传的图片必须是png,jpg,gif三种格式的图片,并且当图片的宽度大于600px时,压缩图片至600px,并且等比例的压缩图片的高度。

具体的实现形式:

大致的思路是:

  1. 判断根据文件名判断图片的格式是否是png,jpg,gif三种图片文件   定义了 方法
  2. 如果是的,则进入到scaleImage(String imgSrc, String imgDist)方法中判断图片大小,如果图片大小合适,则直接利用copyFile(File fromFile, File toFile)方法复制图片
  3. 在缩放图片中利用到java.awt里面的几个类,并且利用BufferedImage可以加快图片的压缩速度。
package com.ctbri.test;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.*;


public class PictureChange {

    static String suffix = "";

    public static void main(String[] args) {
        String newfilebase = "E:/A_xia_program/image/";
        File file = new File(newfilebase + 1);
        File[] oldfiles = file.listFiles();
        for (File file2 : oldfiles) {
            if (isImageFile(file2)) {
                if (!scaleImage(newfilebase + 1 + "/" + file2.getName(), newfilebase + 11 + "/" + file2.getName())) {
                    System.out.println(file2.getName()+"转化成功!");
                }
            }
        }
    }


    public static boolean isImageFile(File file) {

        String fileName = file.getName();

        //获取文件名的后缀,可以将后缀定义为类变量,共后面的函数使用
        suffix = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length());

        // 声明图片后缀名数组
        if (!suffix.matches("^[(jpg)|(png)|(gif)]+$")) {
            System.out.println("请输入png,jpg,gif格式的图片");
            return false;
        }
        return true;
    }

    public static boolean scaleImage(String imgSrc, String imgDist) {
        try {
            File file = new File(imgSrc);
            if (!file.exists()) {
                return false;
            }

            InputStream is = new FileInputStream(file);
            Image src = ImageIO.read(is);
            if (src.getWidth(null) <= 600) {
                File tofile = new File(imgDist);
                copyFile(file, tofile);
                is.close();
                return true;
            }

            //获取源文件的宽高
            int imageWidth = ((BufferedImage) src).getWidth();
            int imageHeight = ((BufferedImage) src).getHeight();

            double scale = (double) 600 / imageWidth;

            //计算等比例压缩之后的狂傲
            int newWidth = (int) (imageWidth * scale);
            int newHeight = (int) (imageHeight * scale);

            BufferedImage newImage = scaleImage((BufferedImage) src, scale, newWidth, newHeight);

            File file_out = new File(imgDist);
            ImageIO.write(newImage, suffix, file_out);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;
    }

    //用于具体的转化
    public static BufferedImage scaleImage(BufferedImage bufferedImage, double scale, int width, int height) {
        int imageWidth = bufferedImage.getWidth();
        int imageHeight = bufferedImage.getHeight();
        AffineTransform scaleTransform = AffineTransform.getScaleInstance(scale, scale);
        AffineTransformOp bilinearScaleOp = new AffineTransformOp(scaleTransform, AffineTransformOp.TYPE_BILINEAR);

        return bilinearScaleOp.filter(bufferedImage, new BufferedImage(width, height, bufferedImage.getType()));
    }


    //复制文件
    public static void copyFile(File fromFile, File toFile) throws IOException {
        FileInputStream ins = new FileInputStream(fromFile);
        FileOutputStream out = new FileOutputStream(toFile);
        byte[] b = new byte[1024];
        int n = 0;
        while ((n = ins.read(b)) != -1) {
            out.write(b, 0, n);
        }
        ins.close();
        out.close();
    }
}


标签:java,File,图片格式,file,import,图片,压缩,String
From: https://blog.51cto.com/u_16209833/6901488

相关文章

  • 关于Java的多线程实现
    多线程介绍进程:进程指正在运行的程序。确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能。线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以......
  • JAVA实现海报背景填充qrCode
    packagecom.open.openbank.qrCode;importjavax.imageio.ImageIO;importjava.awt.*;importjava.awt.geom.RoundRectangle2D;importjava.awt.image.BufferedImage;importjava.io.File;importjava.io.IOException;/***生成海报*/publicclassPosterTest{......
  • java基础中(笔记)
    流程控制流程控制语句的分类:1、顺序结构:从上往下,从前往后;2、分支结构(if,switch);3、循环结构(for,while,do...while); if语句if格式:if(关系表达式){语句体;}if(关系表达式){语句体1;}else{语句体2;}if(关系表达式){语句体1;}elseif{语句体2;}elseif{语句体3;}elseif{语......
  • Java 中 == 与 equals() 的区别
    Java中==与equals()的区别1.====是一个比较运算符,在使用时有可以判断两种情况在用于基本类型时,即判断两边数据的值是否相等。在用于引用类型时,即判断两边是否为同一个对象即有相同的地址。2.equals()方法equals()方法是Object的一个方法,只能判断引用类型。O......
  • 懒得改变原始对象?JavaScript代理模式教你怎样一步步偷懒!
    前言系列首发于公众号『非同质前端札记』,若不想错过更多精彩内容,请“星标”一下,敬请关注公众号最新消息。懒得改变原始对象?JavaScript代理模式教你怎样一步步偷懒!何为代理模式例如,你想预约一家公司的董事长会面,按照正常流程,你只能通过先联系他的秘书,然后跟他的秘书预约时间,约好时......
  • Java利用Rxtx进行串口通讯
    最近在做传感器数据采集的工作,底层是基于Zigbee的无线传感网络,所有数据采集到Zigbee协调器上然后通知上位机数据采集完成,上位机通过USB转串口去读取数据就可以了。那么问题来了,如何进行串口通讯呢?老板说你用Java写个程序好了嘛,用Java写串口程序也是醉了。实验室也没别人写了,所以就......
  • java基础上(笔记)
    变量变量:程序运行过程中,其值可以发生改变的量。变量由三部分组成:变量名、变量值、数据类型。格式:数据类型变量名=变量值;如:inta=10;(定义变量)变量的使用:取值与修改值。取值格式:变量名修改格式:变量名=变量值;注意事项:不能定义已存在的变量;不能使用未定义的变量;整数默认最大......
  • Java概述
    第一章·内容介绍......
  • JavaScript学习 -- 对称加密算法DES
    在现代的互联网时代,数据安全性备受关注。为了保护敏感数据的机密性,对称加密算法是一种常用的方法。在JavaScript中,DES(DataEncryptionStandard)是一种常用的对称加密算法。本篇博客将为您展示如何在JavaScript中使用DES算法进行加密和解密,并提供一个实际的例子。首先,我们需要使用Cr......
  • java学习前须知(笔记)
    Path环境变量的配置我的电脑单击右键选择属性,就进入了设置的关于选项,找到高级系统设置,高级里面选环境变量,弹出窗口里面选系统变量下的新建,取名JAVA_HOME;路径选为jdk-8的根目录,即可得到一个系统变量;选中系统变量里的Path,编辑即可,可新建%JAVA_HOME%\bin,这样就可以直接在cmd里启......