ファイル自体を含めたり、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アプリケーションの画像/リソースを非表示にしました。お役に立てば幸いです)