图片转二进制——各种方法汇总

5 篇文章 0 订阅

使用Base64转换图片

     利用Base64实现二进制和图片之间的转换,具体代码如下:

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

import org.apache.tomcat.util.codec.binary.Base64;

public class ImageBinary {

	public static void main(String[] args) {
		String fileName = "D://code//test.jpg";
		System.out.println(getImageBinary(fileName));
		saveImage(getImageBinary(fileName));
	}

	/*
	 * 图片转换为二进制
	 * 
	 * @param fileName
	 *            本地图片路径
	 * @return
	 *       图片二进制流
	 * */
	public static String getImageBinary(String fileName) {
		File f = new File(fileName);
		BufferedImage bi;
		try {
			bi = ImageIO.read(f);
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			ImageIO.write(bi, "jpg", baos);
			byte[] bytes = baos.toByteArray();
			return Base64.encodeBase64String(bytes);
			//return encoder.encodeBuffer(bytes).trim();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 将二进制转换为图片
	 * 
	 * @param base64String
	 *            图片二进制流
	 *       
	 */
	public static void saveImage(String base64String) {
		try {
			byte[] bytes1 = Base64.decodeBase64(base64String);
			ByteArrayInputStream bais = new ByteArrayInputStream(bytes1);
			BufferedImage bi1 = ImageIO.read(bais);
			File w2 = new File("D://code//22.jpg");// 可以是jpg,png,gif格式
			ImageIO.write(bi1, "jpg", w2);// 不管输出什么格式图片,此处不需改动
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

url获取图片字节流

    若通过url访问图片并转换为二进制流,就不能按照上述方法。通过url获取图片涉及url、网络状态等各种情况。在代码中涉及两种不同的方法:一个是通过url的形式,另一个是直接访问本地资源(即图片路径)。详见以下代码:

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class ImageUtil {

	/**
	 * 根据地址获得数据的字节流
	 *
	 * @param strUrl
	 *            网络连接地址
	 * @return
	 */
	public static byte[] getImageFromNetByUrl(String strUrl) {
		try {
			URL url = new URL(strUrl);
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setRequestMethod("GET");
			conn.setConnectTimeout(5 * 1000);
			InputStream inStream = conn.getInputStream();// 通过输入流获取图片数据
			byte[] btImg = readInputStream(inStream);// 得到图片的二进制数据
			return btImg;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 根据地址获得数据的字节流
	 *
	 * @param strUrl
	 *            本地连接地址
	 * @return
	 */
	public byte[] getImageFromLocalByUrl(String strUrl) {
		try {
			File imageFile = new File(strUrl);
			InputStream inStream = new FileInputStream(imageFile);
			byte[] btImg = readInputStream(inStream);// 得到图片的二进制数据
			return btImg;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 从输入流中获取数据
	 *
	 * @param inStream
	 *            输入流
	 * @return
	 * @throws IOException
	 * @throws Exception
	 */
	private static byte[] readInputStream(InputStream inStream) throws IOException {
		ByteArrayOutputStream outStream = new ByteArrayOutputStream();
		byte[] buffer = new byte[10240];
		int len = 0;
		while ((len = inStream.read(buffer)) != -1) {
			outStream.write(buffer, 0, len);
		}
		inStream.close();
		return outStream.toByteArray();

	}
	
	public static void main(String[] args) {
		String url = "http://images.cnitblog.com/blog/536814/201412/051633343733092.png";
		byte[] b = getImageFromNetByUrl(url);
		System.out.println(b);
	}
}

url获取图片字节流

   本节介绍的方法可以说是前两种方法的结合体,但是在两者的基础上有所优化,如对url的状态做判断,此方法仅供参考,可根据具体需求做相应调整。

import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

import javax.imageio.ImageIO;

import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;

public class ImageUtils {

    /*
     * 获取原图片二进制流
     * 
     * @param imageUrl
     *             原图片地址
     * */
    public static String getImageBinary(String imageUrl) {
        String data = null;
        try {
            int HttpResult = 0; // 服务器返回的状态
            URL url = new URL(imageUrl); // 创建URL
            URLConnection urlconn = url.openConnection(); // 试图连接并取得返回状态码
            urlconn.connect();
            HttpURLConnection httpconn = (HttpURLConnection) urlconn;
            HttpResult = httpconn.getResponseCode();
            if (HttpResult != HttpURLConnection.HTTP_OK) // 不等于HTTP_OK则连接不成功
                System.out.print("failed");
            else {
                BufferedInputStream bis = new BufferedInputStream(urlconn.getInputStream());
                BufferedImage bm = ImageIO.read(bis);
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                String type = imageUrl.substring(imageUrl.length() - 3);
                ImageIO.write(bm, type, bos);
                bos.flush();
                data = Base64.encode(bos.toByteArray());
                bos.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return data;

    }

    public static void main(String[] args) {
        String url = "http://images.cnitblog.com/blog/536814/201412/051633343733092.png";
        String result = getImageBinary(url);
        System.out.println(result);
    }
}

url获取图片字节流

   本方法实现了主要实现了以下几个功能:

   1、通过url将图片转换为字节流(十六进制的形式),并实现字节流与图片之间的相互转换;

   2、将本地图片转换为字节流(十六进制的形式),并实现字节流与图片之间的相互转换;

import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

import javax.imageio.ImageIO;

public class Utils {
	/**
	 * 图片转换成二进制字符串
	 * 
	 * @param imageUrl
	 *            图片url
	 * @return String 二进制流
	 */
	public static String getImgeHexStringByUrl(String imageUrl) {
		String res = null;
		try {
			int HttpResult = 0; // 服务器返回的状态
			URL url = new URL(imageUrl); // 创建URL
			URLConnection urlconn = url.openConnection(); // 试图连接并取得返回状态码
			urlconn.connect();
			HttpURLConnection httpconn = (HttpURLConnection) urlconn;
			HttpResult = httpconn.getResponseCode();
			if (HttpResult != HttpURLConnection.HTTP_OK) // 不等于HTTP_OK则连接不成功
				System.out.print("failed");
			else {
				BufferedInputStream bis = new BufferedInputStream(urlconn.getInputStream());
				BufferedImage bm = ImageIO.read(bis);
				ByteArrayOutputStream bos = new ByteArrayOutputStream();
				String type = imageUrl.substring(imageUrl.length() - 3);
				ImageIO.write(bm, type, bos);
				bos.flush();
				byte[] data = bos.toByteArray();
				res = byte2hex(data);
				bos.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return res;
	}

	/**
	 * 本地图片转换成二进制字符串
	 * 
	 * @param imageUrl
	 *            图片url
	 * @return String 二进制流
	 */
	public static String getImgeHexStringByLocalUrl(String imageUrl) {
		String res = null;

		try {
			File imageFile = new File(imageUrl);
			InputStream inStream = new FileInputStream(imageFile);
			BufferedInputStream bis = new BufferedInputStream(inStream);
			BufferedImage bm = ImageIO.read(bis);
			ByteArrayOutputStream bos = new ByteArrayOutputStream();
			String type = imageUrl.substring(imageUrl.length() - 3);
			ImageIO.write(bm, type, bos);
			bos.flush();
			byte[] data = bos.toByteArray();
			res = byte2hex(data);
			bos.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return res;
	}

	/**
	 * @title 根据二进制字符串生成图片
	 * @param data
	 *            生成图片的二进制字符串
	 * @param fileName
	 *            图片名称(完整路径)
	 * @param type
	 *            图片类型
	 * @return
	 */
	public static void saveImage(String data, String fileName, String type) {

		BufferedImage image = new BufferedImage(300, 300, BufferedImage.TYPE_BYTE_BINARY);
		ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
		try {
			ImageIO.write(image, type, byteOutputStream);
			// byte[] date = byteOutputStream.toByteArray();
			byte[] bytes = hex2byte(data);
			RandomAccessFile file = new RandomAccessFile(fileName, "rw");
			file.write(bytes);
			file.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 反格式化byte
	 * 
	 * @param s
	 * @return
	 */
	public static byte[] hex2byte(String s) {
		byte[] src = s.toLowerCase().getBytes();
		byte[] ret = new byte[src.length / 2];
		for (int i = 0; i < src.length; i += 2) {
			byte hi = src[i];
			byte low = src[i + 1];
			hi = (byte) ((hi >= 'a' && hi <= 'f') ? 0x0a + (hi - 'a') : hi - '0');
			low = (byte) ((low >= 'a' && low <= 'f') ? 0x0a + (low - 'a') : low - '0');
			ret[i / 2] = (byte) (hi << 4 | low);
		}
		return ret;
	}

	/**
	 * 格式化byte
	 * 
	 * @param b
	 * @return
	 */
	public static String byte2hex(byte[] b) {
		char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
		char[] out = new char[b.length * 2];
		for (int i = 0; i < b.length; i++) {
			byte c = b[i];
			out[i * 2] = Digit[(c >>> 4) & 0X0F];
			out[i * 2 + 1] = Digit[c & 0X0F];
		}

		return new String(out);
	}

	public static void main(String[] args) {
		String fileName = "D://code//cc.png";
		String url = "http://images.cnitblog.com/blog/536814/201412/051633343733092.png";
		String outImage = "D://code//11.png";
		/*
		 * url形式
		 * */
		String result = getImgeHexStringByUrl(url);
		System.out.println(result);
		saveImage(result,fileName,"png");
		/*
		 * 本地图片形式
		 * */
		String result1 = getImgeHexStringByLocalUrl(fileName);
		System.out.println(result1);
		saveImage(result1,outImage,"png");
	}

}

通过url下载图片

   在给定url的情况下,可将url所访问的图片下载至本地。具体代码如下:

import java.io.BufferedInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;

public class downimageUtil {

	private static final String filePath = "C://Users//lizhihui//Desktop//";

	/*
	 * 根据url下载图片
	 * 
	 * @param  destUrl
	 *             url连接
	 * @return 
	 *       图片保存路径
	 * */
	public String saveToFile(String destUrl) {
		String fileName = "";
		FileOutputStream fos = null;
		BufferedInputStream bis = null;
		HttpURLConnection httpUrl = null;
		URL url = null;
		int BUFFER_SIZE = 1024;
		byte[] buf = new byte[BUFFER_SIZE];
		int size = 0;
		try {
			url = new URL(destUrl);
			httpUrl = (HttpURLConnection) url.openConnection();
			httpUrl.connect();
			bis = new BufferedInputStream(httpUrl.getInputStream());
			for (String string : destUrl.split("/")) {
				if (string.contains("png") || string.contains("png") || string.contains("gif")) {
					fileName = string;
				}
			}
			fos = new FileOutputStream(filePath + fileName);
			while ((size = bis.read(buf)) != -1) {
				fos.write(buf, 0, size);
			}
			fos.flush();
		} catch (IOException e) {
		} catch (ClassCastException e) {
		} finally {
			try {
				fos.close();
				bis.close();
				httpUrl.disconnect();
			} catch (IOException e) {
			} catch (NullPointerException e) {
			}
		}
		return filePath + fileName;
	}
	
	public static void main(String[] args) {
		downimageUtil dw = new downimageUtil();
		String url = "http://images.cnitblog.com/blog/536814/201412/051633343733092.png";
		System.out.println(dw.saveToFile(url));
	}
}

   到此,对于图片的处理结束,这是在写图片压缩服务器时所用到的部分技术,当然在此基本上有所改进,在此不再一一列举,对于图片的压缩方法后续也会整理出来,欢迎查看!虽然写出来了,但还没进行压力测试,优化等一系列后续工作。就先这样吧......

  • 5
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图片的常见存储与读取凡是有以下几种: 存储图片:以二进制的形式存储图片时,要把数据库中的字段设置为Image数据类型(SQL Server),存储的数据是Byte[]. 1.参数是图片路径:返回Byte[]类型: public byte[] GetPictureData(string imagepath) { /**/////根据图片文件的路径使用文件流打开,并保存为byte[] FileStream fs = new FileStream(imagepath, FileMode.Open);//可以是其他重载方法 byte[] byData = new byte[fs.Length]; fs.Read(byData, 0, byData.Length); fs.Close(); return byData; }2.参数类型是Image对象,返回Byte[]类型: public byte[] PhotoImageInsert(System.Drawing.Image imgPhoto) { //将Image换成流数据,并保存为byte[] MemoryStream mstream = new MemoryStream(); imgPhoto.Save(mstream, System.Drawing.Imaging.ImageFormat.Bmp); byte[] byData = new Byte[mstream.Length]; mstream.Position = 0; mstream.Read(byData, 0, byData.Length); mstream.Close(); return byData; }好了,这样通过上面的方法就可以把图片换成Byte[]对象,然后就把这个对象保存到数据库中去就实现了把图片二进制格式保存到数据库中去了。下面我就谈谈如何把数据库中的图片读取出来,实际上这是一个相反的过程。 读取图片:把相应的字段换成Byte[]即:Byte[] bt=(Byte[])XXXX 1.参数是Byte[]类型,返回值是Image对象: public System.Drawing.Image ReturnPhoto(byte[] streamByte) { System.IO.MemoryStream ms = new System.IO.MemoryStream(streamByte); System.Drawing.Image img = System.Drawing.Image.FromStream(ms); return img; }2.参数是Byte[] 类型,没有返回值,这是针对asp.net中把图片从输出到网页上(Response.BinaryWrite) public void WritePhoto(byte[] streamByte) { // Response.ContentType 的默认值为默认值为“text/html” Response.ContentType = "image/GIF"; //图片输出的类型有: image/GIF image/JPEG Response.BinaryWrite(streamByte); }补充: 针对Response.ContentType的值,除了针对图片的类型外,还有其他的类型: Response.ContentType = "application/msword"; Response.ContentType = "application/x-shockwave-flash"; Response.ContentType = "application/vnd.ms-excel";另外可以针对不同的格式,用不同的输出类型以适合不同的类型: switch (dataread("document_type")) { case "doc": Response.ContentType = "application/msword"; case "swf": Response.ContentType = "application/x-shockwave-flash"; case "xls": Response.ContentType = "application/vnd.ms-excel"; case "gif": Response.ContentType = "image/gif"; case "Jpg": Response.ContentType = "image/jpeg"; }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值