仅使用java自带的库将base64图像转换为实际图像

时间:2012-08-30 18:50:58

标签: java swing base64

我正在为一个java swing应用程序创建一个复活节彩蛋,它将主要在内部使用。

我计划将图像转换为base64,然后当找到复活节彩蛋时,它会将base64图像转换为实际图像,然后最终将其显示在JFrame或对话框中。我知道这不是那么好,但我真的没有太多时间去做一些事情,而且这一切都在我脑海中浮现。

我在网上查找了这方面的任何内容,我发现很多教程都会向图像显示Base64解码,但它们都涉及外部库。有没有办法使用java附带的库将base64图像解码为实际图像?

-----------------------编辑----------------------- ------

使用@IanRoberts评论:“javax.xml.bind.DatatypeConverter的parse / printBase64Binary方法中有一个(相当好的隐藏)base64编码器/解码器。”

我能够解码图像。 Here是我做过的一个垃圾箱。

2 个答案:

答案 0 :(得分:3)

此解决方案仅使用Java 6核心java.javax.类:

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import javax.imageio.ImageIO;
import javax.xml.bind.DatatypeConverter;

String base64String = "...";
byte[] bytes = DatatypeConverter.parseBase64Binary(base64String);
ByteArrayInputStream bin = new ByteArrayInputStream(bytes);
BufferedImage img = ImageIO.read(bin);
// NB ImageIO doesn't close the provided input stream, but ByteArrayInputStream
// doesn't need to be closed anyway so it doesn't matter.

答案 1 :(得分:0)

使用以下java程序工具将图像转换为集合将组装原始图像的java字节数组和方法调用:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;

public class ImageDataGenerator {
    public static void main(String[] params) throws InterruptedException, FileNotFoundException, IOException {
        if (params.length != 2) {
            System.out.printf("Uso: java ImageDataGenerator <nombre_imagen> <archivo_imagen>\n");
            System.exit(1);
        }

        String imageName = params[0];

        FileInputStream fis = new FileInputStream(params[1]);
        PrintWriter p = new PrintWriter("imgData.txt");

        p.printf("   private byte[] get%sPart1() {\n", imageName);
        p.printf("       return new byte[] {");

        int readed = 0;
        int writed = 0;
        int numMethods = 1;
        while ((readed = fis.read()) != -1) {
            if (writed < 3000) {
                p.printf("%d,", (byte) readed);
            } else {
                writed = 0;
                p.printf("%d};\n", (byte) readed);
                p.printf("   }\n");
                numMethods++;
                p.printf("   private byte[] get%sPart%d() {\n", imageName, numMethods);
                p.printf("       return new byte[] {\n ");
            }

            if ((++writed % 500) == 0) {
                p.printf("\n");
            }
        }
        p.printf("};\n");
        p.printf("   }\n\n");

        p.println("    private BufferedImage createImageFromArrays(byte[]... arrays) throws IOException { ");
        p.println("        int size = 0;");
        p.println("        for (byte[] array : arrays) size = array.length;");
        p.println("        byte[] imageInByte = new byte[size];");
        p.println("        int pos = 0;");
        p.println("        for (byte[] array : arrays) {");
        p.println("            System.arraycopy(array, 0, imageInByte, pos, array.length);");
        p.println("            pos += array.length;");
        p.println("        }");
        p.println("        ");
        p.println("        InputStream in = new ByteArrayInputStream(imageInByte);");
        p.println("        return ImageIO.read(in);");
        p.println("    }");
        p.println("\n");

        p.println("// Insert this call anywhere in your code");
        p.printf("createImageFromArrays(");
        for (int i = 1; i <= numMethods; i++)
            p.printf("get%sPart%d()%s ", imageName, i, i <= numMethods - 1 ? "," : "");
        p.printf(");");

        p.flush();
        p.close();
    }
}

使用工具输入:java ImageDataGenerator hiddenImage /path/to/image/image.png

它将生成一个名为imgData.txt的文件,您必须在JFrame类声明部分中复制/粘贴该内容。生成的文件的最后一行将包含对名为createImageFromArrays的方法的调用,您必须在JFrame onShow / onLoad事件侦听器中调用该方法

(之前我使用过这个工具来隐藏J2ME应用程序中的图像/资源,希望它有所帮助)