无法读取 jar 中的图像 [英] Cannot read image in jar
问题描述
我编写了一个程序来加密 Netbeans 中的图像.该程序在从 netbeans 运行时运行良好,但是当我将其构建到 .jar 文件中时它不起作用,即使我将图像文件与 .jar 文件放在同一文件夹中,它也无法读取图像.
i have written a program to encrypt an image in Netbeans. The program works fine when running from netbeans but when i build it into a .jar file its not working, it cannot read the image even though i placed the image file in the same folder as the .jar file.
package test;
import java.io.IOException;
import java.io.File;
/**
*
* @author AMaR
*/
public class Test {
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws IOException, Exception {
File EnImage = new File("encrypted.png");
File DeImage = new File("decrypted.png");
int[] pixels;
LoadImage l = new LoadImage();
l.load();
pixels= l.getImagePixels();
RC4New rc4 = new RC4New();
int key[]= {13,2,4,6,};
// int data[]={5,10,90,5};
rc4.KSA(key);
int[] text = rc4.PRNG(pixels);
l.write((int)512,(int)512,text,EnImage);
//RC4New rc41 = new RC4New();
rc4.KSA(key);
int[] text1 = rc4.PRNG(text);
l.write((int)512,(int)512,text1,DeImage);
/* for(int i=0;i<text.length;i++){
System.out.println(text[i]);
}
RC4New rc41 = new RC4New();
rc4.KSA(key);
int[] text1 = rc4.PRNG(text);
for(int i=0;i<text1.length;i++){
System.out.println(text1[i]);
}
*/
System.out.println("length:"+pixels.length);
// l.write((int)512,(int)512,text);
// TODO code application logic here
}
}
//加密
package test;
/**
*
* @author AMaR
*/
public class RC4New {
int state[] = new int[256];
int j;
/**
*
* @param key
*/
public void KSA(int[] key){
int tmp;
for (int i=0; i < 256; i++) {
state[i] = i;
}
j=0;
for (int i=0; i < 256; i++) {
j = (j + state[i] + key[i % key.length]) % 256;
tmp = state[i];
state[i] = state[j];
state[j] = tmp;
}
}
public int[] PRNG(int[] data){
int tmp,k;
int i=0;
j=0;
int[] cipherText = new int[data.length];
for(int x=0;x<data.length;x++){
i = (i + 1) % 256;
j = (j + state[i]) % 256;
tmp = state[i];
state[i] = state[j];
state[j] = tmp;
k = state[(state[i] + state[j]) % 256];
cipherText[x]= (data[x] ^ k);
}
return cipherText;
}
}
//加载/写入图片
package test;
import java.awt.Dimension;
import java.awt.image.BufferedImage;
import java.awt.image.Raster;
import java.io.IOException;
import javax.imageio.ImageIO;
import java.io.File;
import java.awt.image.WritableRaster;
/**
*
* @author AMaR
*/
public class LoadImage {
BufferedImage image;
void load()throws Exception {
// FIle newfile = new File("lena.png)
image = ImageIO.read(getClass().getResourceAsStream("lena.png"));
}
public Dimension getImageSize() {
return new Dimension(image.getWidth(), image.getHeight());
}
public int[] getImagePixels() {
int [] dummy = null;
int wid, hgt;
// compute size of the array
wid = image.getWidth();
hgt = image.getHeight();
// start getting the pixels
Raster pixelData;
pixelData = image.getData();
return pixelData.getPixels(0, 0, wid, hgt, dummy);
}
@SuppressWarnings("empty-statement")
public void write(int width ,int height, int[] pixels,File outputfile) {
try {
// retrieve image
BufferedImage writeImage = new BufferedImage(512, 512, BufferedImage.TYPE_BYTE_GRAY);;
// File outputfile = new File("encrypted.png");
WritableRaster raster = (WritableRaster) writeImage.getData();
raster.setPixels(0,0,width,height,pixels);
writeImage.setData(raster);
ImageIO.write(writeImage, "png", outputfile);
} catch (IOException e) {
}
}
}
推荐答案
不清楚以下哪个触发了您的错误.这个
It's not clear which of the below is triggering your error. This
File EnImage = new File("encrypted.png");
将从当前目录读取,该目录不一定与您的 jar 文件所在的目录相同.
will read from the current directory, which is not necessarily the same directory as that your jar file is in.
这个
image = ImageIO.read(getClass().getResourceAsStream("lena.png"));
将从您的类所在的 jar 文件中的目录中读取.请注意,您正在读取 jar 文件,而不是目录.
will read from the directory in the jar file that your class is in. Note that you're reading from the jar file, not the directory.
鉴于上面的代码,我会:
Given the above code, I would:
- 确定或明确指定
File()
操作的工作目录.您的工作目录是您从中调用java
的目录,这在 IDE 内/外可能有所不同 - 将 lena.png 打包为 .jar 文件中的资源.
- determine or explicitly specify the working directory for the
File()
operations. Your working directory is the one you invokejava
from, and this may differ within/without the IDE - package the lena.png as a resource within your .jar file.
这篇关于无法读取 jar 中的图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!