我正在为一个java swing应用程序创建一个复活节彩蛋,它将主要在内部使用。
我计划将图像转换为base64,然后当找到复活节彩蛋时,它会将base64图像转换为实际图像,然后最终将其显示在JFrame或对话框中。我知道这不是那么好,但我真的没有太多时间去做一些事情,而且这一切都在我脑海中浮现。
我在网上查找了这方面的任何内容,我发现很多教程都会向图像显示Base64解码,但它们都涉及外部库。有没有办法使用java附带的库将base64图像解码为实际图像?
-----------------------编辑----------------------- ------
使用@IanRoberts评论:“javax.xml.bind.DatatypeConverter
的parse / printBase64Binary方法中有一个(相当好的隐藏)base64编码器/解码器。”
我能够解码图像。 Here是我做过的一个垃圾箱。
答案 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应用程序中的图像/资源,希望它有所帮助)