【问题标题】:Applet: Convert image bytes data to an Image小程序:将图像字节数据转换为图像
【发布时间】:2014-02-10 10:47:10
【问题描述】:

我有一个放置了图像视图的小程序。我在 Applet 中有一个“连接”按钮。单击此按钮,正在连接 java 套接字程序。这工作正常。每当 Applet 与其连接时,套接字都会返回一个图像数据(字节格式)。图像数据正确地进入小程序,没有任何问题。但是,我不知道,如何转换此图像数据并将其作为图像放置在该图像视图中?

可以帮忙解决这个问题吗?

我的 Apple 代码如下:

public void actionPerformed(ActionEvent e)
{
    if(e.getSource() == connectBtn)
        //Create a socket
    try
    {
        localSocket = new Socket(this.getCodeBase().getHost(), 8080);
        input = localSocket.getInputStream();
        outStream = new PrintStream(localSocket.getOutputStream());

        byte[] data = new byte[0];
        byte[] buffer = new byte[1024];
        int bytesRead;

        try {
            do {

                bytesRead = input.read(buffer);

                byte[] newData = new byte[data.length + bytesRead];

                System.arraycopy(data, 0, newData, 0, data.length);

                System.arraycopy(buffer, 0, newData, data.length, bytesRead);
                // set data equal to newData in prep for next block of data
                data = newData;
            } while (input.available() != 0);
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        System.out.println("data length: " + data.length);

        // STEP 1: Convert this "data" to an Image
        // STEP 2: Need to update this image with the existing image. Should I have to repaint?


    }
    catch(UnknownHostException unc)
    {
        System.out.println("Connection why not connected");
    }
    catch(IOException ioe)
    {
        System.out.println(ioe.getMessage());
    }
}
public void paint (final Graphics g)
{
    super.paint(g);
    g.drawString(str, 50, 50);
    sharedImage = getImage(getDocumentBase(), "/Users/ScreenShare/testImage.png");
    g.drawImage(sharedImage, 100, 100, this);
}

【问题讨论】:

  • 我试过这个,但它不起作用,在运行时尝试创建 RGB 图像时,会出现“数据数组太小(应该 > 29999”)的错误。
  • 你上传的是图片文件的字节数,还是压缩包的字节数?
  • 图片文件的字节数。我只需要将这个字节数据转换成图像并在 g.drawImage(sharedImage, 100, 100, this); 中更新即可;

标签: java applet


【解决方案1】:

这是一个如何将图像加载到小程序的简单示例:
http://docs.oracle.com/javase/tutorial/2d/images/loadimage.html

如果您只想要图像本身,这里是另一个示例:
http://www.mkyong.com/java/how-to-convert-byte-to-bufferedimage-in-java/

【讨论】:

  • 第二个链接是存储图像文件等。但我只想将字节转换为图像并直接显示在图像视图中。我不应该将图像存储在系统中的任何位置。
  • 相关部分在“//将字节数组转换回BufferedImage”下方。生成的 BufferedImage 可用于“drawImage()”
  • OK..我试过了,当这一行“InputStream in = new ByteArrayInputStream(data); BufferedImage bImageFromConvert = ImageIO.read(in)”时,它会给出类似“读取PNG图像数据时出错”的错误执行。
  • 现在,这正在工作。但另一个问题。根据您在该链接中提到的以下代码,我将其存储在文件夹路径中以进行测试。它只提供 16 kb 的图像而不是 50 kb 的数据。我确信 Applet 正在读取所有(50 kb 数据),因为在放入此 BufferedImage bImageFromConvert = ImageIO.read(in) 之前,数据长度在日志中显示完美。
  • 它工作正常。最后一个问题是,我转换为 jpg,而不是 png,因为实际字节是 png 格式。
【解决方案2】:

您的字节数组是 b

image = new ImageIcon(b).getImage();

然后在你的代码中设置它:

 g.drawImage(image, 100, 100, this);

【讨论】:

  • 看起来很简单..但是在这个地方“sharedImage = new ImageIcon(data).getImage(); repaint()”给出了错误“java.util.zip.ZipException: invalid window size” ; "知道为什么吗?
猜你喜欢
  • 1970-01-01
  • 2011-11-26
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
  • 2015-08-16
  • 2013-05-19
相关资源
最近更新 更多