中易网

Java中如何把图片转换成二进制流

答案:3  悬赏:60  
解决时间 2021-02-23 20:02
Java中如何把图片转换成二进制流
最佳答案
使用java的IO流对图片进行二进制读取操作即可
示例为:读取图片为二进制流,并写入到其他图片中
static void testCopyImage(){
File source=new File("E:\share\Wallpaper\Bliss.jpg");
File desk=new File("d:\images");
if(!desk.exists()){
desk.mkdir();
}

try {
FileInputStream inputStream=new FileInputStream(source);
FileOutputStream outputStream=new FileOutputStream(new File("d:/images/Bliss.jpg"));

int ch=inputStream.read();
while(ch!=-1){
outputStream.write(ch);
ch=inputStream.read();
}

inputStream.close();
outputStream.close();
System.out.println("图片复制成功!");
} catch (FileNotFoundException e) {
System.out.println("文件不存在:"+e.getMessage());
} catch (IOException e) {
System.out.println("文件读取错误:"+e.getMessage());
}

}
全部回答


我们知道数据库里的Image类型的数据是"二进制数据",因此必须将图像文件转换成字节数组才能存入数据库中。
  //根据文件名(完全路径)
  public byte[] SetImageToByteArray(string fileName)
  { FileStream fs = new 
FileStream(fileName, FileMode.Open);
  int streamLength = (int)fs.Length; byte[] image = new 
byte[streamLength];
  fs.Read(image, 0, streamLength);
  fs.Close();
  return image; }
  //另外,在ASP.NET中通过FileUpload控件得到的图像文件可以通过以下方法
  public byte[]
  SetImageToByteArray(FileUpload FileUpload1)
  { Stream stream = FileUpload1.PostedFile.InputStream;
  byte[] photo = new byte[FileUpload1.PostedFile.ContentLength];
  stream.Read(photo, 0, FileUpload1.PostedFile.ContentLength);
  stream.Close();
  return photo;
  }
  2.从SQL Server数据库读取Image类型的数据,并转换成bytes[]或Image图像文件
  //要使用SqlDataReader要加载using System.Data.SqlClient命名空间
  //将数据库中的Image类型转换成byte[] public byte[] SetImage(SqlDataReader reader)
  { return (byte[])reader["Image"];//Image为数据库中存放Image类型字段 }
  //将byte[]转换成Image图像类型 //加载以下命名空间using System.Drawing;/using System.IO;
  using System.Data.SqlClient;*/ public Image SetByteToImage(byte[] 
mybyte)
  { Image image; MemoryStream mymemorystream = new MemoryStream(mybyte,0, 
mybyte.Length);
  image = Image.FromStream(mymemorystream);
  return image;
  }

Java中将图片转为二进制流只需要使用FileImageInputStream取得图片文件,然后使用ByteArrayOutputStream 写入到二进制流中即可,下面是详细代码:
  //图片到byte数组
  public byte[] image2byte(String path){
    byte[] data = null;
    FileImageInputStream input = null;
    try {
      input = new FileImageInputStream(new File(path));
      ByteArrayOutputStream output = new ByteArrayOutputStream();
      byte[] buf = new byte[1024];
      int numBytesRead = 0;
      while ((numBytesRead = input.read(buf)) != -1) {
      output.write(buf, 0, numBytesRead);
      }
      data = output.toByteArray();
      output.close();
      input.close();
    }
    catch (FileNotFoundException ex1) {
      ex1.printStackTrace();
    }
    catch (IOException ex1) {
      ex1.printStackTrace();
    }
    return data;
  }
另外,如果需要将byte[]存回图片或转为String,则:  //byte数组到图片
  public void byte2image(byte[] data,String path){
    if(data.length<3||path.equals("")) return;
    try{
    FileImageOutputStream imageOutput = new FileImageOutputStream(new File(path));
    imageOutput.write(data, 0, data.length);
    imageOutput.close();
    System.out.println("Make Picture success,Please find image in " + path);
    } catch(Exception ex) {
      System.out.println("Exception: " + ex);
      ex.printStackTrace();
    }
  }
  //byte数组到16进制字符串
  public String byte2string(byte[] data){
    if(data==null||data.length<=1) return "0x";
    if(data.length>200000) return "0x";
    StringBuffer sb = new StringBuffer();
    int buf[] = new int[data.length];
    //byte数组转化成十进制
    for(int k=0;k<data.length;k++){
      buf[k] = data[k]<0?(data[k]+256):(data[k]);
    }
    //十进制转化成十六进制
    for(int k=0;k<buf.length;k++){
      if(buf[k]<16) sb.append("0"+Integer.toHexString(buf[k]));
      else sb.append(Integer.toHexString(buf[k]));
    }
    return "0x"+sb.toString().toUpperCase();
  }
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
傲世九重天 记二少吃了媾蛟毒在那个章节
乐步楼梯在哪里啊,我有事要去这个地方
郑州现在有没有高铁到广州啊啊啊啊啊啊。。。
圣薇尔美容SPA会所地址在什么地方,想过去办
你好,我的手机oppox907有时候没信号,还经常
嫂子生日快乐做首诗
科伦新材料公司地址有知道的么?有点事想过去
9台5匹空调还有5千瓦的照明需要多少平方的缆
汉中·福禧国际大酒店地址在什么地方,想过去
关于气胸胸腔镜胸膜固定术
谁在微信上买过衣服,上面耐克,阿迪,和我在
报考三支一扶怎样退考
魔塔60层攻 第65层怎么移动神符?急
lt ________so nice a.feel b.feels c.feelin
土城牙科地址在什么地方,想过去办事
推荐资讯
芜湖易电电器有限公司地址有知道的么?有点事
清香参鱼片这个地址在什么地方,我要处理点事
京福南路/S6(路口)在什么地方啊,我要过去处
请问今天早上怎么在360登不上淘宝网,在IE浏
蓝黑相间的女士衬衫配什么颜色裤子穿
恒润昕药房在什么地方啊,我要过去处理事情
利豪这个地址在什么地方,我要处理点事
宝平冷饮批发部在哪里啊,我有事要去这个地方
数学题有3个1,3个3,3个5,3个9,能否找出5张加
环保型家装防水涂料著名品牌有哪些
“小虎队”相聚2010春晚后就各奔东西了吗?
本命年属羊的1991年感情运怎样
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?