Note:
图片转二进制数据只需转化为bate数组二进制数据即可,例如要求httpclient发送图片二进制数据即是把生成的bate数组数据发送过去。如果对方明确提出是字符串格式编码,再进一步转化就好了
使用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