天天看點

java 的圖檔BufferedImage方式縮小後有嚴重色差/嚴重偏紅怎麼辦

今天遇到的兩個問題:

java 的圖檔BufferedImage方式縮小後有嚴重色差/嚴重偏紅怎麼辦
java 的圖檔BufferedImage方式縮小後有嚴重色差/嚴重偏紅怎麼辦

圖檔本如圖1所示,

java處理後,變成了圖2所示,嚴重失真,偏紅,怎麼辦?

以上直接上關鍵代碼:

原來處理的代碼:

import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class BufferedImageTool {

    public static void resize(String imgPath, double factor) throws IOException {

        File file = new File(imgPath);
        BufferedImage bufferedImage = ImageIO.read(file);

        int width = (int) (bufferedImage.getWidth() * factor);
        int height = (int) (bufferedImage.getHeight() *factor);

        BufferedImage bufferedImage1 = resize(bufferedImage, width, height);


        File outfile = new File("image.jpg");
        ImageIO.write(bufferedImage1, "jpg", outfile);
    }


    /**
     */
    public static BufferedImage resize(BufferedImage img, int newW, int newH) {
        Image tmp = img.getScaledInstance(newW, newH, Image.SCALE_SMOOTH);
        BufferedImage dimg = new BufferedImage(newW, newH, BufferedImage.TYPE_INT_ARGB);

        Graphics2D g2d = dimg.createGraphics();
        g2d.drawImage(tmp, 0, 0, null);
        g2d.dispose();

        return dimg;
    }

}
      

後來找到了一個庫,效果非常好,處理完後的圖檔大小比圖2還稍微小一點。

但卻沒有色差,幾乎跟原圖完全一樣,效果很好。

java 的圖檔BufferedImage方式縮小後有嚴重色差/嚴重偏紅怎麼辦

直接上代碼,

依賴 ​

​thumbnailator​

​庫。

<!-- https://mvnrepository.com/artifact/net.coobird/thumbnailator -->
        <dependency>
            <groupId>net.coobird</groupId>
            <artifactId>thumbnailator</artifactId>
            <version>0.4.14</version>
        </dependency>      

上代碼:

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import net.coobird.thumbnailator.Thumbnails;

/**
 *
 */
public class ThumbnailsTool {


    public static void resize(String imgPath, double factor) throws IOException {

        File localTempFile = new File(imgPath);

        BufferedImage bufferedImage = ImageIO.read(localTempFile);
        int width = (int) (bufferedImage.getWidth() * factor);
        int height = (int) (bufferedImage.getHeight() * factor);

        // BufferedImage 第三方庫壓縮圖檔畫幅。JDK自帶的會有嚴重色差
        Thumbnails.of(localTempFile)
            .size(width, height)
            .outputFormat("jpg")
            .toFile(new File("image2.jpg"));

    }

}
      

入口Main函數:

import image.ImageHelper;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.UUID;
import net.coobird.thumbnailator.Thumbnails;

public class Starter {

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

        String imageUrl = "D:\\MyJava\\java-image\\sky.jpg";

        //1. BufferedImage的形式處理
        BufferedImageTool.resize(imageUrl, 0.5);

        //2. Thumbnails 方式的處理
        ThumbnailsTool.resize(imageUrl, 0.5);
    }
}
      

産生的檔案截圖如下: