JAVA 如何将一个字节数组的内容转换成一张图片

时间:2023-01-11 15:35:01
我从终端收到一个包含有图片数据的字节数组,要怎么样才能把它转换成一张图片呢?

7 个解决方案

#1


用FileOutputStream ,代码如下,不过我就不做有效验证了



import java.io.*;
/**
 模拟一个jpeg位图到byte[]
 */
class Image2Buff
{
static byte[] image2Bytes(String imgSrc) throws Exception
{
FileInputStream fin = new FileInputStream(new File(imgSrc));
//可能溢出,简单起见就不考虑太多,如果太大就要另外想办法,比如一次传入固定长度byte[]
byte[] bytes  = new byte[fin.available()];
//将文件内容写入字节数组,提供测试的case
fin.read(bytes);
fin.close();
return bytes;
}
}

class Buff2Image
{
/**
 @param b 传入的byte
 @param tagSrc 目标文件名

 */
static void buff2Image(byte[] b,String tagSrc) throws Exception
{
FileOutputStream fout = new FileOutputStream(tagSrc);
//将字节写入文件
fout.write(b);
fout.close();
}
}

//本质上实现了copy 命令
public class ImageBufTest
{
public static void main(String[] args) throws Exception
{
//先模拟一个图形byte[]
byte[] b = Image2Buff.image2Bytes("c:/1.jpg");
//存为文件
Buff2Image.buff2Image(b,"c:/test.jpg");

System.out.println("Hello World!");
}
}

#2


但是,我的字节数组是从网络上获得的,并不是直接从一个现在有的Jpg文件上读取。
我把字节数组传给以下的fout对象后,得到的JPG文件,打开时显示无法预览!!!! 

FileOutputStream fout = new FileOutputStream(tagSrc);         //将字节写入文件         fout.write(b);         
fout.close(); 

#3


没啥区别,既然是byte[],就可以用FileOutputStream

如果没有得到图片,应该是byte[] 没读完吧? 下面实现通过URL 读取你论坛头像的方式
也是网络上得到的,本质还是一样的嘛,



import java.io.*;
import java.net.*;
/**
 模拟一个jpeg位图到byte[]
 */
class Image2Buff
{
static byte[] image2Bytes(String imgSrc) throws Exception
{
FileInputStream fin = new FileInputStream(new File(imgSrc));
//可能溢出,简单起见就不考虑太多,如果太大就要另外想办法,比如一次传入固定长度byte[]
byte[] bytes  = new byte[fin.available()];
//将文件内容写入字节数组,提供测试的case
fin.read(bytes);
fin.close();
return bytes;
}

//从网上读取图片地址,存入本地
static byte[] image2BytesFromURL(String address) throws Exception
{
URL url = new URL(address);
InputStream is = url.openStream();
byte[] bytes  = new byte[is.available()];
//将文件内容写入字节数组,提供测试的case
is.read(bytes);
return bytes;
}

}

class Buff2Image
{
/**
 @param b 传入的byte
 @param tagSrc 目标文件名

 */
static void buff2Image(byte[] b,String tagSrc) throws Exception
{
FileOutputStream fout = new FileOutputStream(tagSrc);
//将字节写入文件
fout.write(b);
fout.close();
}
}

 
public class ImageBufTest
{
public static void main(String[] args) throws Exception
{
//先模拟一个图形byte[]
byte[] b = Image2Buff.image2Bytes("c:/1.jpg");
//存为文件
Buff2Image.buff2Image(b,"c:/test.jpg");
//通过url 读取图片得到bytes,复制你的头像到本地
byte[] b2 = Image2Buff.image2BytesFromURL("http://avatar.profile.csdn.net/D/C/3/1_hjx_code.jpg");
Buff2Image.buff2Image(b2,"c:/test2.jpg");
System.out.println("Hello World!");
}
}

#4


楼主这个跟文件copy是一样的无非就是读流写流的过程。从网络中不断的读取图片的字节内容不断的写到图片文件中,直到读取和写入完就是了

#5


嗯,你的代码确实可行,也非常规范。
可能真的是我没有获取到所有字节数据的原因。
感谢你。

#6


楼上那老哥的代码 不知道自己测试没有,就贴上来告诉楼主
楼上的代码在image2Bytes的是 明显错误
你返回但只是一个拥有流的可读长度的 byte数组  说白了就是一个全部是0的byte的数组
并不是流的内容,然后你在把这个空数组写入文件,显然是失败的。


楼主应该这样
byte[] buf = new byte[in.available()];这个是用来存流的数据 但先在还只是全部由0组成的
int i = 0;
while((i=in.read(buf))!=-1){//这个时候 buf才是流的具体内容
  out.write(buf,0,i);
}
out.close();

#7


显然是失败的?
fin.read(bytes);
这句话没看到?

这和你写的
while((i=in.read(buf))!=-1){//这个时候 buf才是流的具体内容
  out.write(buf,0,i);
}

有什么本质区别? 你这么相信自己的眼睛啊?

#1


用FileOutputStream ,代码如下,不过我就不做有效验证了



import java.io.*;
/**
 模拟一个jpeg位图到byte[]
 */
class Image2Buff
{
static byte[] image2Bytes(String imgSrc) throws Exception
{
FileInputStream fin = new FileInputStream(new File(imgSrc));
//可能溢出,简单起见就不考虑太多,如果太大就要另外想办法,比如一次传入固定长度byte[]
byte[] bytes  = new byte[fin.available()];
//将文件内容写入字节数组,提供测试的case
fin.read(bytes);
fin.close();
return bytes;
}
}

class Buff2Image
{
/**
 @param b 传入的byte
 @param tagSrc 目标文件名

 */
static void buff2Image(byte[] b,String tagSrc) throws Exception
{
FileOutputStream fout = new FileOutputStream(tagSrc);
//将字节写入文件
fout.write(b);
fout.close();
}
}

//本质上实现了copy 命令
public class ImageBufTest
{
public static void main(String[] args) throws Exception
{
//先模拟一个图形byte[]
byte[] b = Image2Buff.image2Bytes("c:/1.jpg");
//存为文件
Buff2Image.buff2Image(b,"c:/test.jpg");

System.out.println("Hello World!");
}
}

#2


但是,我的字节数组是从网络上获得的,并不是直接从一个现在有的Jpg文件上读取。
我把字节数组传给以下的fout对象后,得到的JPG文件,打开时显示无法预览!!!! 

FileOutputStream fout = new FileOutputStream(tagSrc);         //将字节写入文件         fout.write(b);         
fout.close(); 

#3


没啥区别,既然是byte[],就可以用FileOutputStream

如果没有得到图片,应该是byte[] 没读完吧? 下面实现通过URL 读取你论坛头像的方式
也是网络上得到的,本质还是一样的嘛,



import java.io.*;
import java.net.*;
/**
 模拟一个jpeg位图到byte[]
 */
class Image2Buff
{
static byte[] image2Bytes(String imgSrc) throws Exception
{
FileInputStream fin = new FileInputStream(new File(imgSrc));
//可能溢出,简单起见就不考虑太多,如果太大就要另外想办法,比如一次传入固定长度byte[]
byte[] bytes  = new byte[fin.available()];
//将文件内容写入字节数组,提供测试的case
fin.read(bytes);
fin.close();
return bytes;
}

//从网上读取图片地址,存入本地
static byte[] image2BytesFromURL(String address) throws Exception
{
URL url = new URL(address);
InputStream is = url.openStream();
byte[] bytes  = new byte[is.available()];
//将文件内容写入字节数组,提供测试的case
is.read(bytes);
return bytes;
}

}

class Buff2Image
{
/**
 @param b 传入的byte
 @param tagSrc 目标文件名

 */
static void buff2Image(byte[] b,String tagSrc) throws Exception
{
FileOutputStream fout = new FileOutputStream(tagSrc);
//将字节写入文件
fout.write(b);
fout.close();
}
}

 
public class ImageBufTest
{
public static void main(String[] args) throws Exception
{
//先模拟一个图形byte[]
byte[] b = Image2Buff.image2Bytes("c:/1.jpg");
//存为文件
Buff2Image.buff2Image(b,"c:/test.jpg");
//通过url 读取图片得到bytes,复制你的头像到本地
byte[] b2 = Image2Buff.image2BytesFromURL("http://avatar.profile.csdn.net/D/C/3/1_hjx_code.jpg");
Buff2Image.buff2Image(b2,"c:/test2.jpg");
System.out.println("Hello World!");
}
}

#4


楼主这个跟文件copy是一样的无非就是读流写流的过程。从网络中不断的读取图片的字节内容不断的写到图片文件中,直到读取和写入完就是了

#5


嗯,你的代码确实可行,也非常规范。
可能真的是我没有获取到所有字节数据的原因。
感谢你。

#6


楼上那老哥的代码 不知道自己测试没有,就贴上来告诉楼主
楼上的代码在image2Bytes的是 明显错误
你返回但只是一个拥有流的可读长度的 byte数组  说白了就是一个全部是0的byte的数组
并不是流的内容,然后你在把这个空数组写入文件,显然是失败的。


楼主应该这样
byte[] buf = new byte[in.available()];这个是用来存流的数据 但先在还只是全部由0组成的
int i = 0;
while((i=in.read(buf))!=-1){//这个时候 buf才是流的具体内容
  out.write(buf,0,i);
}
out.close();

#7


显然是失败的?
fin.read(bytes);
这句话没看到?

这和你写的
while((i=in.read(buf))!=-1){//这个时候 buf才是流的具体内容
  out.write(buf,0,i);
}

有什么本质区别? 你这么相信自己的眼睛啊?