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);
        }
     
    }
    
  • 相关阅读:
    The Mac Application Environment 不及格的程序员
    Xcode Plugin: Change Code In Running App Without Restart 不及格的程序员
    The property delegate of CALayer cause Crash. 不及格的程序员
    nil localizedTitle in SKProduct 不及格的程序员
    InApp Purchase 不及格的程序员
    Safari Web Content Guide 不及格的程序员
    在Mac OS X Lion 安装 XCode 3.2 不及格的程序员
    illustrate ARC with graphs 不及格的程序员
    Viewing iPhoneOptimized PNGs 不及格的程序员
    What is the dSYM? 不及格的程序员
  • 原文地址:https://www.cnblogs.com/wcyBlog/p/3992464.html
Copyright © 2011-2022 走看看