【问题标题】:base64 image into JTextPanebase64 图像到 JTextPane
【发布时间】:2015-01-13 19:47:27
【问题描述】:

是否可以在 JTextPane 中显示 base64 加密图像?

这是我的代码

JTextPane jTextPane = new JTextPane();

javax.swing.text.html.HTMLEditorKit eKit = new javax.swing.text.html.HTMLEditorKit();
jTextPane.setEditorKit(eKit);

jTextPane.setContentType("text/html");

// my base64 image, used then in the img tag in the html...
String img64="data:image/gif;base64,R0lGODdhMAAwAPAAAAAAAP///ywAAAAAMAAwAAAC8IyPqcvt3wCcDkiLc7C0qwyGHhSWpjQu5yqmCYsapyuvUUlvONmOZtfzgFzByTB10QgxOR0TqBQejhRNzOfkVJ+5YiUqrXF5Y5lKh/DeuNcP5yLWGsEbtLiOSpa/TPg7JpJHxyendzWTBfX0cxOnKPjgBzi4diinWGdkF8kjdfnycQZXZeYGejmJlZeGl9i2icVqaNVailT6F5iJ90m6mvuTS4OK05M0vDk0Q4XUtwvKOzrcd3iq9uisF81M1OIcR7lEewwcLp7tuNNkM3uNna3F2JQFo97Vriy/Xl4/f1cf5VWzXyym7PHhhx4dbgYKAAA7";

jTextPane.setText(html);

【问题讨论】:

  • @Nicolas:我重新格式化了你的问题,请问图片来源是否正确?

标签: java image base64 jtextpane


【解决方案1】:

您要做的就是将 Base64 编码的图像解析为字节数组,然后使用 ByteArrayIn 加载图像,使用该字节数组的 putStream。

例如,解码Base64,可以使用javax.xml.bind.DatatypeConverter#parseBase64Binary

【讨论】:

  • // 好的,谢谢,我使用了这个:public static byte[] decode(String str){ byte[] bt = null;尝试 { sun.misc.BASE64Decoder 解码器 = 新 sun.misc.BASE64Decoder(); bt = 解码器.decodeBuffer(str); } catch (IOException e) { e.printStackTrace(); } 返回 bt; } // 然后是 byte [] parseImg = f.decode(texte); ImageIcon image = new ImageIcon(parseImg, "asd"); jTextPane.insertIcon(图像); // 但它不显示图像..你能帮帮我吗?
  • 好吧,如果没有更多信息,将很难为您提供帮助。无论如何,由于没有异常显示,我猜 Base64 解码器工作正常。因此,问题来自图像图标的创建。根据 ImageIcon 构造函数文档,iamge 应该是“包含受支持的图像格式,例如 GIF、JPEG 或(从 1.3 开始)PNG”是您的情况吗?
【解决方案2】:

我发现了!

解决方案是 通过覆盖
来扩展 HTMLEditorKit 类 javax.swing.text.html.HTMLEditorKit 中的 getViewFactory 然后在 ImageViewclass.java 中重写 loadImage 方法 支持base64编码的图片!

【讨论】:

    【解决方案3】:

    最后我还发现了我必须重写的地方,“loadimage”方法。我应该添加 [src="foo"] 的条件流来加载图像,只是图像的链接或图像数据本身。现在,我只写“JTextPane.setEditorKit(new MyExtendedHtmlEditorKit());”。

    但是,我的问题就在这里。方法存在“ImageViewer.class create()[HtmlFactory.class(static inner class)[HtmlEditorKit.class]] > void loadImage()[ImageViewer.class]” 那是深度嵌套,这些类有许多从外部类不可见的对象和许多静态定义。所以,这意味着我必须从根部建造一棵整棵树,只需要在树枝上摘一片叶子。我不能直接编辑 Java VM 运行时,编译和分发它。我认为这是不可能的,至少对我来说是肯定的!

    【讨论】:

      猜你喜欢
      • 2011-03-17
      • 1970-01-01
      • 2017-06-21
      • 2012-01-15
      • 1970-01-01
      • 2018-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多