文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java图片批量压缩像素的实现方法

2024-04-02 19:55

关注

图片压缩大法

为了防止用户流量的丢失,即使在5g 即将来临的情况下,压缩算法依旧是很有必要的,额跑题了,不好意思,今天介绍的不是压缩算法,讲啥呢?主要讲讲如何通过 java 将图片进行压缩,尽可能的控制压缩损比,不仅仅是为了减少存储,其目的是快速呈现给用户,只有良好的体验,才会在当今这个急躁的年代减少流量的损失。

最近因为公司要需要xxx认证上传测试用例功能的具体截图、发现有大小限制、所以就进行了图片压缩,简单记录一下。

压缩前大小:

压缩后大小:

具体代码实现:

main方法测试:


 public static void main(String[] args) throws IOException {

        String modpath = "C:\\Users\\Administrator\\Desktop\\鲲鹏认证\\test\\";

        getFiles("C:\\Users\\Administrator\\Desktop\\鲲鹏认证\\测试用例清单", modpath, 160);//将图片压缩至100宽

    }

文件大小处理




    public static void resizeImage(String srcPath, String desPath, int width, int height) throws IOException {

        File srcFile = new File(srcPath);

        Image srcImg = ImageIO.read(srcFile);

        BufferedImage buffImg = null;

        buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);

        //使用TYPE_INT_RGB修改的图片会变色

        buffImg.getGraphics().drawImage(srcImg.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);

        String filePath="";

        if (srcFile.getName().contains("#")) {

             filePath = srcFile.getName().replace("#", "");

        }else{

            filePath=srcFile.getName();

        }

        ImageIO.write(buffImg, "PNG", new File(desPath + filePath));

    }

获取目录文件信息




    public static void getFiles(String path, String modPath, int scaleSize) throws IOException {

        ArrayList<String> files = new ArrayList<String>();

        File file = new File(path);

        File[] tempList = file.listFiles();

        //循环读取目录下图片

        for (int i = 0; i < tempList.length; i++) {

            String filePath = tempList[i].getName();

            if (tempList[i].isFile()) {

                System.out.println("文件:" + filePath + "-" + tempList[i].getAbsolutePath().replaceAll("\\\\", "/"));

                String[] imagePath = tempList[i].getAbsolutePath().replaceAll("\\\\", "/").split("/");

                String imageNumber = null;

                FileUtil.resizeImage(tempList[i].getAbsolutePath().replaceAll("\\\\", "/"), modPath, 160, 160);

                files.add(tempList[i].toString());

            }

            if (tempList[i].isDirectory()) {

                  System.out.println("文件夹:" + tempList[i]);

            }

        }

        System.out.println(path + "下文件数量:" + files.size());

    }

控制台目录压缩成功保存到盘符:

附:利用Graphics类如何进行压缩图像

Graphics类提供基本绘图方法,Graphics类提供基本的几何图形绘制方法,主要有:画线段、画矩形、画圆、画带颜色的图形、画椭圆、画圆弧、画多边形、画字符串等。 这里不做一一赘述, 进重点介绍一下,利用Graphics类如何进行压缩图像。不多说直接上代码。


	

	public static byte[] compressImage(byte[] imageByte, int ppi) {

		byte[] smallImage = null;

		int width = 0, height = 0;

 

		if (imageByte == null)

			return null;

 

		ByteArrayInputStream byteInput = new ByteArrayInputStream(imageByte);

		try {

			Image image = ImageIO.read(byteInput);

			int w = image.getWidth(null);

			int h = image.getHeight(null);

			// adjust weight and height to avoid image distortion

			double scale = 0;

			scale = Math.min((float) ppi / w, (float) ppi / h);

			width = (int) (w * scale);

			width -= width % 4;

			height = (int) (h * scale);

 

			if (scale >= (double) 1)

				return imageByte;

 

			BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

			buffImg.getGraphics().drawImage(image.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);

			ByteArrayOutputStream out = new ByteArrayOutputStream();

			ImageIO.write(buffImg, "png", out);

			smallImage = out.toByteArray();

			return smallImage;

 

		} catch (IOException e) {

			log.error(e.getMessage());

			throw new RSServerInternalException("");

		}

	}

其实,关键点就两处


BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

buffImg.getGraphics().drawImage(image.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);

总结

到此这篇关于Java图片批量压缩像素实现的文章就介绍到这了,更多相关Java图片批量压缩像素内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯