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

     2023-05-07     43

关键词:

【中文标题】如何将图像保存和读取为文本,嵌入在代码中【英文标题】:How to save and read image as text, embedded in the code 【发布时间】:2017-02-14 13:33:18 【问题描述】:

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

换句话说,我确实需要代表图像的代码行,我只会将其放在那里一次(我不需要即时导入,我只需键入它并永远留在那里)。

图像需要存储为ImageIcon,并且由于您可以输入字节数组,我不明白为什么不能创建一个读取图像、打印字节数组的小罐子到 .txt 文件,然后我可以将其复制并放入源文件中。我只是不知道如何准确地执行这些步骤。

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

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

【问题讨论】:

myjeeva.com/… 我认为这篇文章的布局很好。还提供了示例代码。 非常抱歉我忘记添加了,该文件必须没有依赖项,我不能使用 Apache。无论如何,我会看一下这篇文章,看看我是否可以从中做出一些事情,谢谢 您是否考虑过在您的应用程序中使用实际的 png 作为资源? 【参考方案1】:

仅供参考,与此类似的问题可能有助于提供更深入的解释/答案是here 和here。

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

我确实需要代表图像的代码行,我只会将其放在那里一次(我不需要即时导入,我只需输入它并永远留在那里)。

是使用 Base64 并以特定格式读取图像代码。

例如,以下代码制作了一个简单的 JFrame 以将 base64 字符串显示为图像图标:

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. ***.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();

这实际上将替换前面示例 sn-p 中的“String imgBase64”和“String data”两行。

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

干杯

编辑: 对于从图像到字符串,图像->字符串: 注意:我在这个例子中使用了一个文件,你也可以选择查看可以在 ImageIO.read() 方法中交替使用的 URL 或 Stream 选项。 另请注意:try-with-resources 是 java 1.7+(如果需要早期版本,可以轻松恢复为 try-catch)

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

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”标志。这很容易混淆或切换,并导致与解码/编码的字符串值不一致。

更多关于 ImageIcon 类的信息在这里:https://docs.oracle.com/javase/7/docs/api/javax/swing/ImageIcon.html

使用此工具将 *** 图标转换为 base64 https://www.base64-image.de/

【讨论】:

【参考方案2】:

以netpbm 格式“输入”您的图像,然后将其转换为 PNG 或其他格式。

例如,我正在使用 SE markdown 编辑器创建此图像:

P3 3 3 255
0 0 0  0 0 0    0 0 0 
0 0 0  0 255 0  0 0 0
0 0 0  0 0 0    0 0 0

这是一个 3x3 的图像,由一个被黑框包围的单个绿色像素。

将其保存为“image.ppm”。 使用 ImageMagick 将其转换为 PNG(将其放大 20 倍以便您可以看到):

magick convert image.ppm -sample 2000% image.png

(在这里您可以将 image.ppm 转换为您的 ImageIcon 格式)

显示它:

您不想直接“输入”到 PNG 格式,因为这会很奇怪:

data:image/png;base64,
UDMgMyAzIDI1NQogICAgMCAwIDAgIDAgMCAwICAgIDAgMCAwIAogICAgMCAwIDAgIDAgMjU1IDAg
IDAgMCAwCiAgICAwIDAgMCAgMCAwIDAgICAgMCAwIDAK

如果您从 PNG 开始并想“键入”它,您可以再次使用 ImageMagick,但方向相反。

例如,获取您的头像并将其转换为 mark.ppm

magick convert 8ede7*.png -compress none mark.ppm
cat mark.ppm
P3 32 32 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
255 255 255 255 255 255 255 232 136 234 255 255 255 255 255 255 255 255
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 229 119
231 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
255 255 255 255 239 174 241 255 255 255 255 255 255 255 255 255 255 255
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
255 255 255 255 255 255 255 255 255 255 232 136 234 207 1 211 255 255
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
255 255 255 255 207 1 211 229 119 231 255 255 255 255 255 255 255 255
[...]

如果你能处理“C”风格的标题,你可以试试

 magick 8ede7*.png mark.gif
 magick mark.gif mark.h
 cat mark.h
  mark.h (GIF).
*/
static unsigned char
  MagickImage[] =
  
    0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x20, 0x00, 0x20, 0x00, 0xF3, 0x0E,
    0x00, 0xCF, 0x01, 0xD3, 0xD7, 0x30, 0xDB, 0xD9, 0x38, 0xDC, 0xDA, 0x40,
    0xDD, 0xDC, 0x49, 0xDF, 0xE2, 0x67, 0xE4, 0xE5, 0x77, 0xE7, 0xE8, 0x88,
    0xEA, 0xEF, 0xAE, 0xF1, 0xF1, 0xB6, 0xF2, 0xF3, 0xBF, 0xF4, 0xF4, 0xC7,
[...]

【讨论】:

但是如果图像恰好更复杂,例如高度压缩的照片怎么办?

如何将 winforms 中文本框(带有滚动条)的全文保存为图像?

】如何将winforms中文本框(带有滚动条)的全文保存为图像?【英文标题】:HowcouldyousavethefulltextfromaTextbox(withscrollbars)inwinformsasanimage?【发布时间】:2014-08-1403:39:47【问题描述】:我正在寻找将文本另存为图像的解决方案,我找... 查看详情

如何将多个数据保存在一个文本文件中

】如何将多个数据保存在一个文本文件中【英文标题】:Howtosavemultipledatainonetextfile【发布时间】:2016-02-1807:18:08【问题描述】:我想将多个对象的高度和宽度值保存在一个文本文件中,但它只保存了最后处理的图像数据。这是... 查看详情

如何在节点js中使用单个api保存文本字段值以及文件上传?(代码片段)

我有一个用例,在这种情况下,我需要将注册表单字段值保存到数据库中,并且还需要上传用户图像。据我所知,我需要使用2种不同的api来存储表单字段值,并使用一种api来上传文件。像request.files这样上传的图像和request.body这... 查看详情

如何使用 C# 将 InkML 文件读取为图像或文本

】如何使用C#将InkML文件读取为图像或文本【英文标题】:HowtoreadInkMLfiletoimageortextusingC#【发布时间】:2019-08-1907:30:38【问题描述】:我正在尝试从Microsoft提供的API中读取onenote中的手写文本。我能够从onenote中获取作为inkML的手写... 查看详情

当嵌入为文本输入边框样式的类时,如何在 flex 中平滑嵌入的图像

】当嵌入为文本输入边框样式的类时,如何在flex中平滑嵌入的图像【英文标题】:howtosmoothanembededimageinflexwhenitsembedasaclassfortextinputborderstyle【发布时间】:2011-03-1609:42:55【问题描述】:你好,我的***er伙伴,我正在寻找平滑和嵌... 查看详情

如何将表情符号嵌入到 Tweepy 状态文本中?

】如何将表情符号嵌入到Tweepy状态文本中?【英文标题】:HowdoIembedemojiintoTweepystatustext?【发布时间】:2021-11-1516:34:00【问题描述】:我有以下代码,可让我在控制台上键入文本,然后将其作为评论发送到推文。如何在其中嵌入... 查看详情

如何在 Kivy 中将图像放入动态文本中

】如何在Kivy中将图像放入动态文本中【英文标题】:HowtoputimagesintoadynamictextinKivy【发布时间】:2018-11-0318:05:30【问题描述】:我正在研究kivy,并希望将图片嵌入到显示的文本中。文本被加载一个简单的字符串,然后显示,这很... 查看详情

pytorch读取,加载图像数据(代码片段)

在学习Pytorch的时候,先学会如何正确创建或者加载数据,至关重要。有了数据,很多函数,操作的效果就变得很直观。本文主要用其他库读取图像文件(学会这个,你就可以在之后的学习中,将一些效果直观化)更好的文章组... 查看详情

如何在 Flutter 中从 firebase 存储读取和写入文本文件?

】如何在Flutter中从firebase存储读取和写入文本文件?【英文标题】:HowdoIreadandwriteatextfilefromfirebasestorageinFlutter?【发布时间】:2020-08-2104:13:27【问题描述】:我需要在Firebase存储中存储我保存的图像。有没有办法可以在颤振中读... 查看详情

如何将实例保存在编辑文本中?

】如何将实例保存在编辑文本中?【英文标题】:Howtosavetheinstanceinanedittext?【发布时间】:2012-02-2620:15:34【问题描述】:我正在为我的学校创建一个应用程序,其中一项活动是笔记部分。你可以输入你的笔记,当你离开活动笔记... 查看详情

在 Matlab 中保存为图形格式文件的图像的大小和分辨率

...如jpeg图像),则外观不同(分辨率和大小)。我想知道如何解决这个问题。X=0:p 查看详情

如何保存从python中的图像转换的数组? [复制]

】如何保存从python中的图像转换的数组?[复制]【英文标题】:HowdoIsaveanarrayconvertedfromimageinpython?[duplicate]【发布时间】:2018-08-1813:50:23【问题描述】:任务是读取图像并提取数据以获得25x25像素的网格。我用这段代码来提取它,... 查看详情

如何在 C 中读取和覆盖文本文件?

】如何在C中读取和覆盖文本文件?【英文标题】:HowtoreadandoverwritetextfileinC?【发布时间】:2015-09-2004:31:18【问题描述】:我有一个文本文件text.txt读取(为简单起见)thisislineonethisislinetwothisislinethree再次为简单起见,我只是想将... 查看详情

如何在opencv中将绘制在图像上的画笔绘图保存为填充和单独的二进制掩码?(代码片段)

在openCV教程中,这个"mouseasapaintbrush"tutorial演示了如何在图像上绘制。我知道如何使用imwrite函数保存结果,但是如何仅保存绘制和填充的轮廓并将其保存为黑白二进制掩码?首先,我有一个图像:接下来,我用鼠标在“鼠标作为... 查看详情

如何在摇摆中将面板保存为图像?

】如何在摇摆中将面板保存为图像?【英文标题】:howtosavepanelasimageinswing?【发布时间】:2012-07-0115:26:32【问题描述】:您好,我想将包含标签和按钮等组件的面板转换为图像文件。我已经完成了以下代码。图像已保存。但面板... 查看详情

如何水平翻转图像以将翻转的图像保存在相册中?

】如何水平翻转图像以将翻转的图像保存在相册中?【英文标题】:Howtoflipimagehorizontallytosaveflippedinphotoalbum?【发布时间】:2018-10-1612:04:04【问题描述】:我一直在尝试水平翻转UIImage图像,以便将其保存在我的相册中,一切正常... 查看详情

ckeditor 不读取媒体嵌入代码

...:我使用ckeditor的媒体嵌入插件。它工作正常,代码正确保存在数据库和youtube、soundcloud等中。播放器在页面上显示正常。但是当用户去他的管理部门时,他可以编辑信息,里面的文本和带有标签的文本没有显示,所以当用户点... 查看详情

spark学习笔记——数据读取和保存

spark所支持的文件格式 1.文本文件在Spark中读写文本文件很容易。当我们将一个文本文件读取为RDD时,输入的每一行都会成为RDD的一个元素。也可以将多个完整的文本文件一次性读取为一个pairRDD,其中键是文件名,值是文件... 查看详情