我是靠谱客的博主 沉默小猫咪,最近开发中收集的这篇文章主要介绍maven编译提示:程序包com.sun.image.codec.jpeg不存在,替换为ImageIO解决办法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

前几天,遇见一个很头疼的问题,我解决了一下午现在和大家分享一下,再写一段图片压缩的代码使用了com.sun.image.codec.jpeg这个类,本地跑项目没有问题,但是jenkins构建的时候提示的程序包com.sun.image.codec.jpeg不存在,去各种百度才发现编译失败原因是:

JDK7的时候,com.sun.image.codec.jpeg类已经退休了,以后凡是带sun.*的类库将不会被支持。javac在编译代码时,当他尝试从rt.jar中找寻对应的类文件时,他会默认从对应的符号表文件ct.sym
(同样在jre/lib/下)中查找该类是否存在,由于ct.sym中有意或无意的遗失了部分rt.jar中的类,包括com.sun.image.codec.jpeg,因此导致编译报错。

解析失败原因我参考的:https://blog.csdn.net/eleanoryss/article/details/80015293,但是使用了之后确实编译通过的,因为我看他的解决办法就是不编译这个包所以可以通过,但是到了服务器上测试的时候,发现直接报错找不到这个类。
在这里插入图片描述
解决方法:既然这个包不可以用编译不通过,那就只好换一种写法来尝试一下了,下面我把更换的方法代码贴在下面:

	FileOutputStream out = new FileOutputStream(imgdist);
//  JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
//  encoder.encode(tag);
//  out.close();
    float per = (float) 0.85;
    saveAsJPEG(100, tag, per, out);
    

这里注释掉的是我之前使用的com.sun.image.codec.jpeg这个包下面的方法才导致编译不通过的,现在换一种思路使用ImageIO下面的包来解决:

/**
     * 以JPEG编码保存图片
     *
     * @param dpi             分辨率
     * @param image_to_save   要处理的图像图片
     * @param JPEGcompression 压缩比
     * @param fos             文件输出流
     * @throws IOException
     */
    public static void saveAsJPEG(Integer dpi, BufferedImage image_to_save, float JPEGcompression, FileOutputStream fos) throws IOException {
        // Image writer
        ImageWriter imageWriter = ImageIO.getImageWritersBySuffix("jpg").next();
        ImageOutputStream ios = ImageIO.createImageOutputStream(fos);
        imageWriter.setOutput(ios);
        //and metadata
        IIOMetadata imageMetaData = imageWriter.getDefaultImageMetadata(new ImageTypeSpecifier(image_to_save), null);


        if (dpi != null && !dpi.equals("")) {

            //new metadata
            Element tree = (Element) imageMetaData.getAsTree("javax_imageio_jpeg_image_1.0");
            Element jfif = (Element) tree.getElementsByTagName("app0JFIF").item(0);
            jfif.setAttribute("Xdensity", Integer.toString(dpi));
            jfif.setAttribute("Ydensity", Integer.toString(dpi));

        }


        if (JPEGcompression >= 0 && JPEGcompression <= 1f) {
            // new Compression
            JPEGImageWriteParam jpegParams = (JPEGImageWriteParam) imageWriter.getDefaultWriteParam();
            jpegParams.setCompressionMode(JPEGImageWriteParam.MODE_EXPLICIT);
            jpegParams.setCompressionQuality(JPEGcompression);

        }

        //new Write and clean up
        imageWriter.write(imageMetaData, new IIOImage(image_to_save, null, null), null);
        ios.close();
        imageWriter.dispose();

    }
    

这样就完美的解决了,亲测有效,如果想要整个工具类的朋友可以去我的另一篇播客查看https://blog.csdn.net/weixin_43549912/article/details/103269117

最后

以上就是沉默小猫咪为你收集整理的maven编译提示:程序包com.sun.image.codec.jpeg不存在,替换为ImageIO解决办法的全部内容,希望文章能够帮你解决maven编译提示:程序包com.sun.image.codec.jpeg不存在,替换为ImageIO解决办法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部