当前位置: 首页 > 知识库问答 >
问题:

如何将图像保存和读取为文本,嵌入到代码中

梁才
2023-03-14

我知道这是一个奇怪的问题,但我真的需要这个工作。我有一个非常小的.png映像,我需要将它导入(“type it”)到java源文件中,而不需要从文件系统读取。(至少不是在程序运行的时候,我可以用其他虚拟应用程序读取系统上的图像来解析是二进制的或者我不知道还有什么)。

换句话说,我真的需要代表图像的代码行,我只会把它放在那里一次(我不需要动态地导入,我只需要键入它并将它永远留在那里)。

图像需要存储为ImageIcon并且,既然您可以键入字节数组,我不明白为什么不能创建一个小jar来读取图像,将字节数组打印到.txt文件中,然后我可以复制并放入源文件中。我只是不知道这些步骤到底该怎么做。

注:我知道这不是一个人愿意或应该做的事情,这是为了一个特定的项目,我需要这样做,原因超出了我的范围。

注意2:我不能使用任何外部lib或依赖项。

共有1个答案

张丰
2023-03-14

请注意,与此类似的问题可能有助于提供一个更深入的解释/答案在这里和这里。

我的回答是为了解决你的问题,

我真的需要代表图像的代码行,我只会放在那里一次(我不需要在飞行中导入,我只是键入它并将它永远留在那里)。

import java.awt.BorderLayout;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.Base64;
import java.util.Scanner;

import javax.imageio.ImageIO;
import javax.swing.*;

public class App extends JFrame {
    public static void main(String args[]) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                App app = new App();
                app.setVisible(true);
            }
        });
    }
    public App() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JLabel photo = new JLabel();
        photo.setVerticalTextPosition(JLabel.BOTTOM);
        photo.setHorizontalTextPosition(JLabel.CENTER);
        photo.setHorizontalAlignment(JLabel.CENTER);
        photo.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
        add(photo, BorderLayout.CENTER);
        setSize(200, 100);
        setLocationRelativeTo(null);

        // Ex. stackoverflow.ico (then converted to png for this example)
        String imgBase64 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAJ+SURBVFhH7ZXbS1RRFMb7Y5qHiu4PEfUQRS9B9FBEBBVFT70WvQQhmJpdLUkMS0mNikDKlKxIDR+iCz3YmJgWCZmlKWPNPvd9vvZeZ8+ZS3NmzlzoYn2wHmatYe/f2etbey/Ab9Z/gPkFwCcGoTVtB/8yojL5VTYA1/gGdnIV4hULoV3cBFefU5XcKusJ2G96BECEIPT2A4LKUZVglQYgNuBTo+qHJ7P3PAHIMB+dUtlglQRgdh1HvHIx7Jc3VEbI5dCvH1QQEdjRblXIrqIB3NhHsDNr/a81Oo4AlubVhB+0+s1erWop+OdhymdTSSfgfp+C3rLbh9AatoB/fU81Pv0OrGYl5VndBrhslvKZKt2E3KFeJ8zHalbAHrpPJWfksZ/XW/eSZzJVMIA92CkW7qVep8oZfuiPodzU7KkScDas/nqVE6aUuQwVBODN+mpaTLuwEdbTFsolxGc+QGvc6m+oN++COzcJ/eYhsOpl6WZVKghAjpxcNLGBDFa9HGZ3hd972AaMO0eT9dNr4IwNgM+Oe/UMFeUB/inqbSJGMAkTocvHGe2n9tivbiN+YgnYufV0CkEqyYQum4H15BLY2XUpIKI9YgStZ61wxl/kfRdCAzhv+4QB74rxGvvZzcJs9ut70K7sSAOxBhrVH4IVGkC/tie5uLhc9Ks7qffyqPnkEEFIyRfR6DhMl5RrximXS+EB2vbTjKd+YVpULoJ2eRuMzmOwnrfTRIRRYR4Q5pJut6Nd4vKpFZfLPrBabywzQ7YsjAIBmttuUYSRG5sQF9EDmH119BCR87UY1fKtUxaAXCobQLZjzhUJzR+AYvX3A5QrgvTnAvwq/esAwA/q0/BiaJrlDgAAAABJRU5ErkJggg==";
        String data = imgBase64.substring(imgBase64.indexOf(",") + 1);
        ByteArrayInputStream stream = new ByteArrayInputStream(Base64.getDecoder().decode(data.getBytes()));
        BufferedImage image = null;
        try {
            image = ImageIO.read(stream);
        } catch (IOException e) {
            e.printStackTrace();
        }
        ImageIcon imgIcon = new ImageIcon(image.getScaledInstance(32, 32, 0));
        photographLabel.setIcon(imgIcon);
    }
}

这段代码不使用任何外部库,并且完成了您所请求的大部分任务--因此,为了完全完成答案,下面是我如何从控制台读取输入(也就是用户输入控制台)。注意:以下代码部分将添加在带有ByteArrayInputStream流对象声明的行之后。

Scanner sc = new Scanner(System.in);
System.out.println("Type .png input (base64): ");
StringBuilder sb = new StringBuilder();
while (sc.hasNext())
    sb.append(sc.next());
String data = sb.toString();

这将基本上替换前面示例片段中的两行“String imgbase64”和“String data”。

希望这回答了您的问题,请提供反馈以进一步澄清或标记为答案;)

假设您从某个地方加载了一个ImageIcon对象,您可以命名为url/stream/file。在我的示例中,我将使用一个本地文件:

ImageIcon icon = new ImageIcon("C:\\Users\\Nick\\Desktop\\favicon.png");

现在取下这个图像图标,得到你所问的base64字符串?这里有一种方法(使用已经加载的ImageIcon图标对象):

try (ByteArrayOutputStream os = new ByteArrayOutputStream();
        ImageOutputStream ios = ImageIO.createImageOutputStream(os)) {
    BufferedImage img = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), BufferedImage.BITMASK);
    Graphics g = img.createGraphics();
    icon.paintIcon(null, g, 0, 0);
    g.dispose();
    ImageIO.write(img, "png", ios);
    byte[] bytes = os.toByteArray();
    String data = Base64.getEncoder().encodeToString(bytes);
    System.out.println(data);
} catch (IOException e) {
    e.printStackTrace();
}

我想指出的一件事是正在使用的'BufferedImage.BitMask'标志。这很容易被混淆或切换,并导致与解码/编码的字符串值不一致。

 类似资料:
  • 问题内容: 是PIL的新功能,但希望从中获得快速解决方案。以下是我无法使用的第一枪: 错误说, 有任何想法吗?我不希望解决方案包含额外的程序包,谢谢。 问题答案: 请记住打电话,所以从:的开头开始阅读:

  • 问题内容: 我知道可以在Tkinter文本小部件中嵌入图像,但是我一直无法找到一些简单的示例代码。具体来说,我需要嵌入jpg,因此根据文档,我认为我需要使用photoimage类 我试图用这个: 其中imgfn是图像文件名,而text是我的文本窗口小部件,但是我得到“ _tkinter.TclError:无法识别图像文件中的数据……” 谢谢你的帮助! 问题答案: 仅处理和文件。为了与Tkinter

  • 我试图将字节保存为图像,但似乎不起作用。 以下是我尝试过的: 但我得到一个错误,说它不能写模式RGBA为JPEG,所以我猜这个方法只适用于PNG?如果是这样的话,有没有其他方法来处理jpeg图像?

  • 问题内容: 是否可以将JSON数据保存到本地文本文件中?因此,稍后我可以通过加载该文件再次使用它,并取回存储的JSON数据。其实我真正想做的是在文本文件中导出JSON数据,以便以后可以用作import.Any的建议或解决方案? 这是我要用于导出到文本的一些示例。 http://jsfiddle.net/k56eezxp/ 问题答案: 是否可以将JSON数据保存到本地文本文件中? 是。当前,链接的j

  • 问题内容: 我有以下代码 而且有效。但是首先将文件下载到当前目录的问题。是否可以直接在RAM中读取文件并将其解码为图像? 问题答案: 我建议使用io模块直接将文件读取到内存中,而根本不必使用临时文件。 例如: 如果您的数据是二进制的,也可以使用。