2

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

我打算拍摄一张图片并将其转换为base64,然后当找到复活节彩蛋时,它将base64图像转换为实际图像,然后最终将其显示在JFrame或对话框中。我知道这不是很好,但我真的没有太多时间做某事,而且这就是我脑海中浮现的一切。

我在网上寻找任何可以做到这一点的东西,我发现很多教程都展示了对图像进行 Base64 解码,但它们都涉及外部库。有没有办法使用 java 自带的库将 base64 图像解码为实际图像?

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

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

我能够解码图像。是我所做的粘贴箱。

4

2 回答 2

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.
于 2012-08-30T19:57:35.670 回答
0

在 java 类中隐藏图像的一种相当复杂的解决方案,不包括文件本身或使用 base64(从而减少类 java 文件大小),是使用以下 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调用,您必须在JFrameonShow/onLoad 事件侦听器中调用该方法

(我以前用这个工具来隐藏 J2ME 应用程序中的图像/资源,希望对你有帮助)

于 2012-08-30T20:02:23.980 回答