读书人

网络BMP图片本土保存

发布时间: 2012-12-25 16:18:28 作者: rapoo

网络BMP图片本地保存

import java.awt.image.BufferedImage;import java.io.DataOutputStream;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;  public class BMPWriter {     public static void write(BufferedImage img, File out) {         int width = img.getWidth();        int tripleWidth = width * 3;        int height = img.getHeight();        int fullTriWidth = tripleWidth % 4 == 0 ? tripleWidth                : 4 * ((tripleWidth / 4) + 1);        int[] px = new int[width * height];        px = img.getRGB(0, 0, width, height, px, 0, width);        byte[] rgbs = new byte[tripleWidth * height];        int index = 0;        // r, g, b数组        for (int i = height - 1; i >= 0; i--) {            for (int j = 0; j < width; j++) {                int pixel = px[i * width + j];                rgbs[index++] = (byte) pixel;                rgbs[index++] = (byte) (pixel >>> 8);                rgbs[index++] = (byte) (pixel >>> 16);            }        }        // 补齐扫描行长度为4的倍数        byte[] fullrgbs = new byte[fullTriWidth * height];        for (int i = 0; i < height; i++) {            for (int j = 0; j < fullTriWidth; j++) {                if (j < tripleWidth) {                    fullrgbs[fullTriWidth * i + j] = rgbs[i * tripleWidth + j];                } else {                    fullrgbs[fullTriWidth * i + j] = 0;                }            }        }         index = 0;         int fheader = 14;        int infoheader = 40;        int board = 0;        int offset = fheader + infoheader + board;        int length = width * height * 3 + offset;        short frame = 1;        short deep = 24;        int fbl = 3800;        DataOutputStream dos = null;        try {            FileOutputStream fos = new FileOutputStream(out);            dos = new DataOutputStream(fos);            dos.write('B');            dos.write('M');// 1格式头            wInt(dos, length);// 2-3文件大小            wInt(dos, 0);// 4-5保留            wInt(dos, offset);// 6-7偏移量            wInt(dos, infoheader);// 8-9头信息            wInt(dos, width);// 10-11宽            wInt(dos, height);// 12-13高            wShort(dos, frame);// 14 = 1帧数            wShort(dos, deep);// 15 = 24位数            wInt(dos, 0);// 16-17压缩            wInt(dos, 4);// 18-19 size            wInt(dos, fbl);// 20-21水平分辨率            wInt(dos, fbl);// 22-23垂直分辨率            wInt(dos, 0);// 24-25颜色索引 0为所有            wInt(dos, 0);// 26-27重要颜色索引 0为所有            // wInt(0);//28-35            // wInt(0);            // wInt(0);            // wInt(0);//28-35彩色板            dos.write(fullrgbs);         } catch (FileNotFoundException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        } finally {            try {                dos.close();            } catch (IOException e) {                e.printStackTrace();            }        }    }     private static void wInt(DataOutputStream dos, int i) throws IOException {        dos.write(i);        dos.write(i >> 8);        dos.write(i >> 16);        dos.write(i >> 24);    }     private static void wShort(DataOutputStream dos, short i)            throws IOException {        dos.write(i);        dos.write(i >> 8);    } }

?

上述代码是bmp写入类;

?

剩下的就是下载的事了,

try {
???url = new URL(src);
???HttpURLConnection con;
???con = (HttpURLConnection) url.openConnection();
???con.setRequestMethod("GET");
???InputStream is = con.getInputStream();
???byte[] data = readInputStream(is);
???File imageFile = new File(localFileName);???
???if(source.equals("bmp")) {
????ByteArrayInputStream in = new ByteArrayInputStream(data);??? //将b作为输入流;
????BufferedImage image = ImageIO.read(in);
????BMPWriter.write(image, imageFile);
???}else {
????FileOutputStream fos = new FileOutputStream(imageFile);
????fos.write(data);
????fos.close();
???}???

??} catch (IOException e) {
???// TODO Auto-generated catch block
???e.printStackTrace();
??}

?

PS:还要用到的将

BufferedImage与byte[]互转?http://qianxunniao.iteye.com/admin/blogs/1730291

?

读书人网 >编程

热点推荐