ImageIO的使用

本人做了一个javaweb项目,其中有一部分需要根据商品的条码,生成条码图像。在本机上使用都没有问题,
但是当发布在新浪云服务器的时候,图像一直显示不了。

最后发现,是因为新浪云服务器时Linux操作系统,jdk中没有rt.jar包,因此也就使用不了
com.sun.image.codec.jpeg包中的类。后来在网上搜索,发现jpeg是可以用javax.imageio
中的类代替的。
package com.rongle.util;

import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.ImageWriter;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
import javax.imageio.stream.ImageOutputStream;

import org.w3c.dom.Element;

public class ImgCompressUtil {

    /**
     * 以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 {

        // 获取后缀名为jpg并已经注册ImageWriter
        ImageWriter imageWriter = ImageIO.getImageWritersBySuffix("jpg").next();
        //返回一个 ImageOutputStream,它将其输出发送到给定 fos。
        ImageOutputStream ios = ImageIO.createImageOutputStream(fos);
        //将目标设置为给定 ImageOutputStream
        imageWriter.setOutput(ios);
        // 与图像相关的元数据对象IIOMetadata,ImageTypeSpecifier允许以便捷方式指定图像格式
        IIOMetadata imageMetaData = imageWriter.getDefaultImageMetadata(new ImageTypeSpecifier(image_to_save), null);

        //分辨率
        if (dpi != null && !dpi.equals("")) {
            //返回 XML DOM Node 对象,该对象表示此对象所包含的元数据树的根
            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) {
            //返回适用于此文件格式的适当类型的新 ImageWriteParam 对象,
            //该对象包含默认值,即那些将在没有指定 ImageWriteParam 对象时使用的值。
            JPEGImageWriteParam jpegParams = (JPEGImageWriteParam) imageWriter.getDefaultWriteParam();
            //指定是否执行压缩,如果执行压缩,将如何确定 compression 参数。
            jpegParams.setCompressionMode(JPEGImageWriteParam.MODE_EXPLICIT);
            //将压缩质量设置为 0 和 1 之间的某个值。
            jpegParams.setCompressionQuality(JPEGcompression);

        }

        // 添加一个完整的图像流,该图像流包含一幅图像、相关的流、图像元数据和要输出的缩略图。
        imageWriter.write(imageMetaData, new IIOImage(image_to_save, null, null), null);
        ios.close();
        //允许释放此对象保存的所有资源
        imageWriter.dispose();

    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值