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

ファイル自体を含めたり、base64を使用したりせずに(したがって、クラスのJavaファイルサイズを削減して)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生成されたファイルの最後の行には、 onShow/onLoadイベントリスナーcreateImageFromArraysで呼び出す必要があるという名前のメソッドの呼び出しが含まれます。JFrame

(以前、このツールを使用してJ2MEアプリケーションの画像/リソースを非表示にしました。お役に立てば幸いです)

于 2012-08-30T20:02:23.980 に答える