zoukankan      html  css  js  c++  java
  • 图片bmp格式转换为jpg格式

    一下代码经过个人测试,可用

    注意:将jpg格式的图片重命名为bmp格式,在该代码中是不能转换的,会报空值异常!而且IE10是显示不了这样的图片的

    import java.awt.Image;
    import java.awt.Toolkit;
    import java.awt.image.BufferedImage;
    import java.awt.image.MemoryImageSource;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import com.sun.image.codec.jpeg.JPEGCodec;
    import com.sun.image.codec.jpeg.JPEGImageEncoder;
     
    public class BmpReader {
     
        /**
         * 图片格式转换 BMP -> JPG
         * @param file
         * @param dstFile
         */
        public static void bmpTojpg(String file, String dstFile) {
            try {
                FileInputStream in = new FileInputStream(file);
                Image TheImage = read(in);
                int wideth = TheImage.getWidth(null);
                int height = TheImage.getHeight(null);
                BufferedImage tag = new BufferedImage(wideth, height,BufferedImage.TYPE_INT_RGB);
                tag.getGraphics().drawImage(TheImage, 0, 0, wideth, height, null);
                FileOutputStream out = new FileOutputStream(dstFile);
                JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
                encoder.encode(tag);
                out.close();
            } catch (Exception e) {
                System.out.println(e);
            }
        }
     
        public static int constructInt(byte[] in, int offset) {
            int ret = ((int) in[offset + 3] & 0xff);
            ret = (ret << 8) | ((int) in[offset + 2] & 0xff);
            ret = (ret << 8) | ((int) in[offset + 1] & 0xff);
            ret = (ret << 8) | ((int) in[offset + 0] & 0xff);
            return (ret);
        }
     
        public static int constructInt3(byte[] in, int offset) {
            int ret = 0xff;
            ret = (ret << 8) | ((int) in[offset + 2] & 0xff);
            ret = (ret << 8) | ((int) in[offset + 1] & 0xff);
            ret = (ret << 8) | ((int) in[offset + 0] & 0xff);
            return (ret);
        }
     
        public static long constructLong(byte[] in, int offset) {
            long ret = ((long) in[offset + 7] & 0xff);
            ret |= (ret << 8) | ((long) in[offset + 6] & 0xff);
            ret |= (ret << 8) | ((long) in[offset + 5] & 0xff);
            ret |= (ret << 8) | ((long) in[offset + 4] & 0xff);
            ret |= (ret << 8) | ((long) in[offset + 3] & 0xff);
            ret |= (ret << 8) | ((long) in[offset + 2] & 0xff);
            ret |= (ret << 8) | ((long) in[offset + 1] & 0xff);
            ret |= (ret << 8) | ((long) in[offset + 0] & 0xff);
            return (ret);
        }
     
        public static double constructDouble(byte[] in, int offset) {
            long ret = constructLong(in, offset);
            return (Double.longBitsToDouble(ret));
        }
     
        public static short constructShort(byte[] in, int offset) {
            short ret = (short) ((short) in[offset + 1] & 0xff);
            ret = (short) ((ret << 8) | (short) ((short) in[offset + 0] & 0xff));
            return (ret);
        }
     
        static class BitmapHeader {
            public int iSize, ibiSize, iWidth, iHeight, iPlanes, iBitcount,
                    iCompression, iSizeimage, iXpm, iYpm, iClrused, iClrimp;
     
            // 读取bmp文件头信息
            public void read(FileInputStream fs) throws IOException {
                final int bflen = 14;
                byte bf[] = new byte[bflen];
                fs.read(bf, 0, bflen);
                final int bilen = 40;
                byte bi[] = new byte[bilen];
                fs.read(bi, 0, bilen);
                iSize = constructInt(bf, 2);
                ibiSize = constructInt(bi, 2);
                iWidth = constructInt(bi, 4);
                iHeight = constructInt(bi, 8);
                iPlanes = constructShort(bi, 12);
                iBitcount = constructShort(bi, 14);
                iCompression = constructInt(bi, 16);
                iSizeimage = constructInt(bi, 20);
                iXpm = constructInt(bi, 24);
                iYpm = constructInt(bi, 28);
                iClrused = constructInt(bi, 32);
                iClrimp = constructInt(bi, 36);
            }
        }
     
        public static Image read(FileInputStream fs) {
            try {
                BitmapHeader bh = new BitmapHeader();
                bh.read(fs);
                if (bh.iBitcount == 24) {
                    return (readImage24(fs, bh));
                }
                if (bh.iBitcount == 32) {
                    return (readImage32(fs, bh));
                }
                fs.close();
            } catch (IOException e) {
                System.out.println(e);
            }
            return (null);
        }
     
        // 24位
        protected static Image readImage24(FileInputStream fs, BitmapHeader bh)
                throws IOException {
            Image image;
            if (bh.iSizeimage == 0) {
                bh.iSizeimage = ((((bh.iWidth * bh.iBitcount) + 31) & ~31) >> 3);
                bh.iSizeimage *= bh.iHeight;
            }
            int npad = (bh.iSizeimage / bh.iHeight) - bh.iWidth * 3;
            int ndata[] = new int[bh.iHeight * bh.iWidth];
            byte brgb[] = new byte[(bh.iWidth + npad) * 3 * bh.iHeight];
            fs.read(brgb, 0, (bh.iWidth + npad) * 3 * bh.iHeight);
            int nindex = 0;
            for (int j = 0; j < bh.iHeight; j++) {
                for (int i = 0; i < bh.iWidth; i++) {
                    ndata[bh.iWidth * (bh.iHeight - j - 1) + i] = constructInt3(
                            brgb, nindex);
                    nindex += 3;
                }
                nindex += npad;
            }
            image = Toolkit.getDefaultToolkit().createImage(
                    new MemoryImageSource(bh.iWidth, bh.iHeight, ndata, 0,
                            bh.iWidth));
            fs.close();
            return (image);
        }
     
        // 32位
        protected static Image readImage32(FileInputStream fs, BitmapHeader bh)
                throws IOException {
            Image image;
            int ndata[] = new int[bh.iHeight * bh.iWidth];
            byte brgb[] = new byte[bh.iWidth * 4 * bh.iHeight];
            fs.read(brgb, 0, bh.iWidth * 4 * bh.iHeight);
            int nindex = 0;
            for (int j = 0; j < bh.iHeight; j++) {
                for (int i = 0; i < bh.iWidth; i++) {
                    ndata[bh.iWidth * (bh.iHeight - j - 1) + i] = constructInt3(
                            brgb, nindex);
                    nindex += 4;
                }
            }
            image = Toolkit.getDefaultToolkit().createImage(
                    new MemoryImageSource(bh.iWidth, bh.iHeight, ndata, 0,
                            bh.iWidth));
            fs.close();
            return (image);
        }
     
        public static void main(String[] args) {
            String srcfile = "D:\33.bmp";
            String dstFile = "D:\33.jpg";
            bmpTojpg(srcfile, dstFile);
        }
     
    }
    
  • 相关阅读:
    函数如何命名
    jsp/servlet
    hibernate主键生成策略
    Java项目经验(ssh)
    jvm的内存区划分
    @Override
    Java成长简介(转载)
    接口 转载
    SpringBoot项目jar、war方式的部署
    服务注册与发现及其优雅停服
  • 原文地址:https://www.cnblogs.com/wcyBlog/p/3992464.html
Copyright © 2011-2022 走看看