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

时间:2014-08-22 19:02:52

标签: java image image-processing png jpeg

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

我的代码现在看起来像这样用于读取文件。我无法使其工作为一个字节[]。我试着给输出流添加一些随机字节,但我从来没有在浏览器中获得图像。我知道它看起来不像文件,但我期望随机出现一些东西,但没有做到。

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;

1 个答案:

答案 0 :(得分:2)

您可以在无头环境中安全地使用BufferedImageRasterDataBufferImageIO等类。无法在无头模式下使用的类和方法通常标记为:

@throws HeadlessException if GraphicsEnvironment.isHeadless() returns true.

这通常包括Swing和AWT组件,如窗口,按钮等。例如,请参阅usages of HeadlessException以获取具有此限制的方法和类的列表。

既然您已经知道这一点,那么您需要做的就是使用BufferedImage方法将“原始”RGB字节转换为setRGB(...),或者访问DataBuffer的支持数组直接。多个Q&关于这个已经在SO上可用(google用于“从字节创建BufferedImage”)。

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

准备好BufferedImage后,使用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...");
}