我团队中的一个人正在计算一个导致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;
答案 0 :(得分:2)
您可以在无头环境中安全地使用BufferedImage
,Raster
,DataBuffer
和ImageIO
等类。无法在无头模式下使用的类和方法通常标记为:
@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...");
}