java 转换tif图片为jpg,解决转换后颜色异常问题
说明
· 正常情况下,tif转换jpg图片会出现颜色失真,丢失部分颜色,原因是两种图片的色彩模式不同,jpg默认使用的是RGB色彩模式,TIF默认使用的是CMYK色彩模式,RGB的色域比CMYK的色域大,在转换过程中如果找不到对应的颜色,就会找相近的颜色进行代替,所以就会出现色彩失真的情况(例如图片背景变成紫色/红色,白色变成黑色等);
· 处理方案就是获取原图片的色彩模式,根据原图的颜色和色彩模式创建新的对应色彩模式,重新渲染到转换后的图片,(该转换过程较为复杂,就交给专业的图片处理工具处理吧…例如hutool的ImgUtil工具)
转换代码
import cn.hutool.core.img.Img;
import org.slf4j.LoggerFactory;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* 图片处理工具类
*/
public class ImageUtils {
private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(ImageUtils.class);
/**
* 判断图片是否为tiff
* @param b
* @return
*/
public static boolean checkImageType(byte[] b) {
try {
// 判断是否为tiff格式
if((b[0] & 0xFF) == 0x49 && (b[1] & 0xFF)==0x49 && (b[2] & 0xFF)==0x2A){
return true;
}else {
return false;
}
}catch(Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 将tiff图片转化为jpg
* @param in 原图片文件流
*/
public static ByteArrayOutputStream tiffToJpg(InputStream in) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
BufferedImage bufferegImage= ImageIO.read(in);
// 正常情况下,直接使用图片转换,得到的jpg图片会有色彩失真的情况
// ImageIO.write(bufferegImage,"jpg",out);
// 此处使用hutool的图片处理工具,将tif图片转换为jpg,可完美解决图片失真的问题
Img.from(bufferegImage).write(out);
}catch(IOException e) {
e.printStackTrace();
}finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
LOG.error(e.getMessage(), e);
}
}
}
return out;
}
}
参考文章:
https://blog.csdn.net/clair_chen/article/details/112990181
https://blog.csdn.net/qq_45822970/article/details/117354256