Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中获取字节并从中生成图像文件?_Java_Image_Image Processing_Png_Jpeg - Fatal编程技术网

如何在Java中获取字节并从中生成图像文件?

如何在Java中获取字节并从中生成图像文件?,java,image,image-processing,png,jpeg,Java,Image,Image Processing,Png,Jpeg,我团队中的一个人正在计算一个任务,该任务产生一个RGB字节数组。该程序在服务器上运行headless环境,这是否意味着我不能导入任何awt类?我想使用OutputStream将字节发送到HTTP GET中的浏览器。我可以处理保存在服务器硬盘上的PNG文件,但现在我想使用byte[]而不是文件 我的代码现在看起来像这样,用于读取文件。我很难让它工作一个字节[]。我试着给outputstream输入一些随机字节,但在浏览器中从未获得图像。我知道它看起来不会像文件,但我希望随机出现一些东西,但什么也没

我团队中的一个人正在计算一个任务,该任务产生一个RGB字节数组。该程序在服务器上运行headless环境,这是否意味着我不能导入任何awt类?我想使用OutputStream将字节发送到HTTP GET中的浏览器。我可以处理保存在服务器硬盘上的PNG文件,但现在我想使用byte[]而不是文件

我的代码现在看起来像这样,用于读取文件。我很难让它工作一个字节[]。我试着给outputstream输入一些随机字节,但在浏览器中从未获得图像。我知道它看起来不会像文件,但我希望随机出现一些东西,但什么也没有

File file = new File("images/test.png");
FileInputStream in = new FileInputStream(file);
OutputStream out = new OutputStream();
byte[] buf = new byte[1024];
int count = 0;
while((count = in.read(buf)) >=  0)
{
   out.write(buf, 0, count);
}
out.close;
in.close;

您可以在无头环境中安全地使用诸如
buffereImage
Raster
DataBuffer
ImageIO
之类的类。不能在headless模式下使用的类和方法通常标记为:

@throws HeadlessException if GraphicsEnvironment.isHeadless() returns true.
这通常包括Swing和AWT组件,如窗口、按钮等。例如,请参阅具有此限制的方法和类的列表

现在您知道了这一点,您所要做的就是使用
setRGB(…)
方法将“原始”RGB字节放入
buffereImage
,或者直接访问
DataBuffer
的备份数组。关于这个问题的多个问答已经在SO上提供了(谷歌的“从字节创建BuffereImage”)

@rayryeng当然是正确的,因为你需要知道图像的像素布局和宽度/高度,才能重建它。如果其他开发人员能够以一种已知的格式(如PNG或类似格式)向您发送图像,您可能会更容易

buffereImage
准备就绪时,使用
ImageIO
将映像写入servlet输出流,如下所示:

OutputStream out = ...; // the servlet or socket output stream
BufferedImage image = ...; // the image you just created

if (!ImageIO.write(image, "PNG", out)) {
    log.warn("Could not write image...");
}

它不起作用的原因是,PNG标准有一个带有一大堆参数的标题,这样您就可以正确地解码图像字节。你有诸如压缩质量、图像宽度和图像高度等东西。此外,颜色像素的原始PNG字节使用修改版本的Lempel Ziv Welch进行压缩,因此即使获得原始有效载荷,也必须运行解码算法以获得原始RGB数据。您可能应该使用
ImageIO
读取图像,然后在类解码颜色数据后访问字节。您能更详细地描述这个问题吗?其他开发人员是否正在发送原始RGB字节?接收字节的顺序是什么?行吗?按列排列?你知道图像的宽度和高度吗?如果不知道数据是如何发送的以及图像本身的大小,则无法基于原始RGB数据开始重建图像或创建图像文件。