我正在用PC制作一个用于PC的2D游戏,这个游戏有精灵,声音效果,音乐和文本等数据。
问题是我需要以某种方式存储它。
现在我需要以加密格式存储我的精灵,我需要我的Java游戏解密并加载加密图像到bufferedimages以在我的游戏中显示它们。
我不想将所有内容封装到单个可执行文件.jar或.exe文件中。
我需要对我的图像(资源,Spritesheets)进行加密和保护,因为我不希望播放器干扰它们或使用它们。
我不能使用ZIP文件甚至加密或受保护的文件 一种Java库,因为Java必须首先在光盘上导出它们 在它使用之前
我搜索了很多论坛,但我找不到明确的答案。
答案 0 :(得分:0)
根据您考虑的加密类型 - 您可以使用ImageIO将图像写入/读取到输出和输入流,获取结果字节并进行解密/加密。
要保存图像,请使用ImageIO将图像写入OutputStream(例如ByteArrayOutputStream)。从写入的字节,您可以加密,然后保存
ByteArrayOutputStream os = null;
OutputStream fos = null;
try{
os = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", os);
byte[] bytes = os.toByteArray();
encrypt(bytes);
fos = new FileOutputStream(outputfile);
fos.write(bytes);
}catch(IOException e){
e.printStackTrace();
}finally{
if ( fos != null ){try{fos.close();}catch(Exception e){}}
if ( os != null ){try{os.close();}catch(Exception e){}}//no effect, but hear for sanity's sake
}
要读取和解密,只需将文件读取为字节,解密字节,然后将字节流发送到ImageIO
InputStream is = null;
ByteArrayOutputStream os = null;
ByteArrayInputStream input = null;
try{
is = new FileInputStream(inputFile);
os = new ByteArrayOutputStream ();
byte[] buffer = new byte[500];
int len = -1;
while ( ( len = is.read(buffer) ) != -1 ){
os.write(buffer, 0, len);
}
byte[] fileBytes = os.toByteArray();
decrypt(fileBytes);
input = new ByteArrayInputStream(fileBytes);
Image image = ImageIO.read(input);
}catch(IOException io){
io.printStackTrace();
}finally{
if ( is != null ){try{is.close();}catch(Exception e){}}
if ( os != null ){try{os.close();}catch(Exception e){}}
if ( input != null ){try{input.close();}catch(Exception e){}}
}
您使用的加密类型是您的选择。您可以使用简单的密码使用按位异或(^)
加密字节数组for ( int i = 0; i < bytes.length; i++ ){
bytes[i] = (byte)(bytes[i] ^ 123);
}
使用Cipher
进行更精细的加密请注意,对于动画gif,您可能需要搜索保存gif帧的方法(例如,请参阅this)