图片读取异常

读取一个jpg图片,后台提示 后台提示javax.imageio.IIOException: Unsupported Image Type

BufferedImage bufferImage = ImageIO.read(new FileInputStream(picUrl));

摘自网络 它们的区别在于颜色组成。 就像画画调和颜料,用红黄蓝三种颜色按照不同比例调出可以各种不同的颜色。 RGB: R.红色(Red) G.绿色(Green) B.蓝色(Blue) CMYK: C. 青色(Cyan) M. 洋红色(Magenta) Y. 黄色(Yellow) K. 黑色(blacK) RGB是光学三原色,所以普遍用于电视、电脑 CMYK是印刷用的颜色,所有彩色打印机都装着4个墨盒,就是这4种颜色 如果你的图片是用来发布在网络,那用RGB 如果你的图片需要打印,那就用CMYK,因为打印机直接打印RGB的图片会发生色彩失真


以下是参考网上方式做的测试类,结果不理想,色彩颜色会突变,效果不展示,可以自己测试。

package com.example.demo;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import org.junit.Test;
import javax.imageio.IIOException;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import java.awt.*;
import java.awt.color.ColorSpace;
import java.awt.image.*;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
/**
 * <p>测试rgb模式转cmky     风险:图片色彩会变化</p>
 * @author : shaominjie  shaominjie 2018-12-10
 * @package : com.example.demo
 * @modify by reason: {新增}
 */
public class OrderTest {
    @Test
    public void testRead() throws IOException {
        String filename = "C:\\Users\\xxx.jpg";
        checkRgb(filename);
    }
    public void checkRgb(String filename) throws IOException {
        File file = new File(filename);
//        boolean isRgb;//true是Rgb否则是Cmyk
        //创建输入流
        ImageInputStream input = ImageIO.createImageInputStream(file);
        Iterator readers = ImageIO.getImageReaders(input);
        if (readers == null || !readers.hasNext()) {
            throw new RuntimeException("No ImageReaders found");
        }
        ImageReader reader = (ImageReader) readers.next();
        reader.setInput(input);
        //获取文件格式
        BufferedImage image;
        try {
            // 尝试读取图片 (包括颜色的转换).
            image = reader.read(0); // RGB
//            isRgb=true;
        } catch (IIOException e) {
            // 读取Raster (没有颜色的转换).
            Raster raster = reader.readRaster(0, null);// CMYK
            image = createJPEG4(raster);
//            isRgb=false;
        }
        image.getGraphics().drawImage(image, 0, 0, null);
        //String newfilename = filename.substring(0,filename.lastIndexOf("."))+"_rgb"+filename.substring(filename.lastIndexOf("."));
        String newfilename = filename;
        File newFile = new File("C:\\Users\\xxxxx.jpg");
        FileOutputStream out = new FileOutputStream(newFile);
        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
        encoder.encode(image);
        out.flush();
        out.close();
    }
    private static BufferedImage createJPEG4(Raster raster) {
        int w = raster.getWidth();
        int h = raster.getHeight();
        byte[] rgb = new byte[w * h * 3];
        //彩色空间转换
        float[] Y = raster.getSamples(0, 0, w, h, 0, (float[]) null);
        float[] Cb = raster.getSamples(0, 0, w, h, 1, (float[]) null);
        float[] Cr = raster.getSamples(0, 0, w, h, 2, (float[]) null);
        float[] K = raster.getSamples(0, 0, w, h, 3, (float[]) null);
        for (int i = 0, imax = Y.length, base = 0; i < imax; i++, base += 3) {
            float k = 220 - K[i], y = 255 - Y[i], cb = 255 - Cb[i],
                    cr = 255 - Cr[i];

            double val = y + 1.402 * (cr - 128) - k;
            val = (val - 128) * .65f + 128;
            rgb[base] = val < 0.0 ? (byte) 0 : val > 255.0 ? (byte) 0xff
                    : (byte) (val + 0.5);

            val = y - 0.34414 * (cb - 128) - 0.71414 * (cr - 128) - k;
            val = (val - 128) * .65f + 128;
            rgb[base + 1] = val < 0.0 ? (byte) 0 : val > 255.0 ? (byte) 0xff
                    : (byte) (val + 0.5);

            val = y + 1.772 * (cb - 128) - k;
            val = (val - 128) * .65f + 128;
            rgb[base + 2] = val < 0.0 ? (byte) 0 : val > 255.0 ? (byte) 0xff
                    : (byte) (val + 0.5);
        }
        raster = Raster.createInterleavedRaster(new DataBufferByte(rgb, rgb.length), w, h, w * 3, 3, new int[]{0, 1, 2}, null);
        ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB);
        ColorModel cm = new ComponentColorModel(cs, false, true, Transparency.OPAQUE, DataBuffer.TYPE_BYTE);
        return new BufferedImage(cm, (WritableRaster) raster, true, null);
    }
}

转载于:https://my.oschina.net/MjShao/blog/2992851

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值