java 使用Thumbnails压缩图片后 表面红色 解决方案

        <dependency>
            <groupId>net.coobird</groupId>
            <artifactId>thumbnailator</artifactId>
            <version>0.4.8</version>
        </dependency>
public static boolean saveFileByMultipartFile(String directoryPath, String fileName, MultipartFile multipartFile) {
        try {
            if (StringUtils.isEmpty(directoryPath)) {
                throw new Exception("文件夹不能为空");
            }
            File tmp = new File(directoryPath);
            if (!tmp.exists()) {
                tmp.mkdirs();
            }
            String filePath = directoryPath + fileName;
            multipartFile.transferTo(new File(filePath));

            String fileType = multipartFile.getContentType();
            if (!StringUtils.isEmpty(fileType) && fileType.contains("image")) {
//                File file = new File(filePath);
//                log.error("压缩前图片大小:Byte:" + file.length());

                // 压缩代码
                //防止图片变红
                Image src = Toolkit.getDefaultToolkit().getImage(filePath);
                BufferedImage image = toBufferedImage(src);
                Thumbnails.of(image).scale(1f).toFile(filePath);

//                log.error("压缩前图片大小:Byte:" + file.length());
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    public static BufferedImage toBufferedImage(Image image) {
        if (image instanceof BufferedImage) {
            return (BufferedImage) image;
        }
        // This code ensures that all the pixels in the image are loaded
        image = new ImageIcon(image).getImage();
        BufferedImage bimage = null;
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        try {
            int transparency = Transparency.OPAQUE;
            GraphicsDevice gs = ge.getDefaultScreenDevice();
            GraphicsConfiguration gc = gs.getDefaultConfiguration();
            bimage = gc.createCompatibleImage(image.getWidth(null), image.getHeight(null), transparency);
        } catch (HeadlessException e) {
            // The system does not have a screen
        }
        if (bimage == null) {
            // Create a buffered image using the default color model
            int type = BufferedImage.TYPE_INT_RGB;
            bimage = new BufferedImage(image.getWidth(null), image.getHeight(null), type);
        }
        // Copy image to buffered image
        Graphics g = bimage.createGraphics();
        // Paint the image onto the buffered image
        g.drawImage(image, 0, 0, null);
        g.dispose();
        return bimage;
    }

我测试过 可以解决

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: RGB无损压缩是指对RGB图像进行压缩,以减小图像文件的存储空间,而不影响图像质量。C语言可以实现对RGB图像的无损压缩。 在RGB图像中,每个像素点由、绿、蓝三种颜色通道的数值组成。无损压缩的目标是尽量减少冗余数据,在保证图像质量的前提下减小存储空间。一个常见的无损压缩算法是Huffman编码。 Huffman编码是一种变长编码方法,通过统计不同颜色通道数值的出现频率,将出现频率高的颜色通道数值用较短的编码表示,而出现频率低的颜色通道数值用较长的编码表示,从而达到减少存储空间的效果。 在C语言中,可以使用数据结构来实现Huffman编码。首先,需要统计每个颜色通道数值的频率。然后,根据频率构建Huffman树,并生成相应的编码表。接下来,将原始RGB图像中的颜色通道数值转换成对应的编码,并将编码存储到压缩文件中。最后,解码时根据压缩文件中的编码表,将编码还原成原始的RGB图像。 需要注意的是,无损压缩虽然可以减小存储空间,但在解压缩时需要还原原始图像,因此解压缩算法的实现也是非常重要的。在C语言中,可以通过读取压缩文件中的编码和编码表,进行解码并将解码的颜色通道数值重新恢复成原始的RGB图像。 总结来说,通过使用Huffman编码算法,结合C语言的数据结构和文件读写操作,可以实现RGB图像的无损压缩和解压缩。 ### 回答2: RGB(绿蓝)是一种用于表示图像颜色的编码方式。RGB无损压缩是指在不损失图像质量的前提下,通过减少图像数据的存储空间来减小文件大小。 在C语言中实现RGB的无损压缩可以借助一些压缩算法和技术。以下是一个简单的示例: 1. 图像加载:首先,我们需要加载RGB图像数据,可以使用C语言提供的图像处理库(如OpenCV)或自己实现一个读取图像数据的函数。读取后的图像数据会包含像素点的RGB值。 2. 压缩算法:接下来,我们可以选择一种合适的无损压缩算法,比如哈夫曼编码(Huffman coding)。该算法通过根据像素点颜色的出现频率来分配短的编码给常见颜色,从而减小文件大小。在C语言中,可以使用二叉树来实现哈夫曼编码算法。 3. 数据转换:压缩算法通常需要将像素点的RGB值转换成对应的编码。通过遍历图像数据的每个像素点,将RGB值与对应的编码进行替换。 4. 数据存储:最后,将转换后的压缩数据存储到文件中,以便后续解压缩使用。在C语言中,可以使用文件操作函数(如fopen、fwrite)来实现文件的读写。 需要注意的是,以上仅是一个简单的示例,实际的RGB无损压缩算法可能会更加复杂和多样化。此外,在实际应用中,还需要考虑到压缩和解压缩的速度、内存占用等性能因素。 总之,通过选择适当的无损压缩算法,并结合C语言的文件操作和数据处理技术,我们可以实现RGB的无损压缩,从而减小图像文件的大小,而不会对图像质量造成明显损失。 ### 回答3: RGB是一种常用的颜色表示方法,通常用于电子设备的图像处理。在RGB表示中,每个像素由(R)、绿(G)、蓝(B)三个分量组成,每个分量的取值范围为0到255之间。 无损压缩是指在保持原始数据完整性的前提下,通过某种算法减小数据文件的大小。对于RGB图像的无损压缩,可以采用各种编码方法来减小图像文件的存储空间。 在C语言中实现RGB的无损压缩可以采用以下步骤: 首先,读取原始的RGB图像数据并将其存储在合适的数据结构中,例如一个二维数组。 然后,根据图像的特性,选择适合的无损压缩算法。常见的无损压缩算法有哈夫曼编码、LZW编码等。 接下来,根据选择的无损压缩算法,对RGB数据进行编码。编码过程中,需要根据像素的值和分布规律建立编码表,并将原始数据转换为编码后的数据。 最后,将编码后的数据存储到文件中,以便后续的解压缩使用。 在解压缩时,可以根据压缩文件中的编码表和编码数据,将编码数据重新转换为原始的RGB数据,并将其显示在屏幕上或进行其他处理。 需要注意的是,无损压缩并不会改变图像的内容,而只是减小了文件的大小。因此,在解压缩后,可以还原出与原始图像相同的RGB数据。 总结来说,通过在C语言中实现适当的编码算法,可以实现RGB图像的无损压缩。这样可以减小存储空间,但同时又保持了图像的完整性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值