无法在jar中读取图像

时间:2013-03-06 09:51:43

标签: java image-processing netbeans encryption grayscale

我已经编写了一个程序来加密Netbeans中的图像。从netbeans运行时程序运行正常,但是当我将它构建为.jar文件时,它无法正常工作,即使我将图像文件放在与.jar文件相同的文件夹中,也无法读取图像。

    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) {
      }

     }
    }

1 个答案:

答案 0 :(得分:1)

目前尚不清楚以下哪一项会触发您的错误。此

 File EnImage = new File("encrypted.png");

将从当前目录中读取,该目录不一定与您的jar文件所在的目录相同。

image = ImageIO.read(getClass().getResourceAsStream("lena.png"));

将从您的类所在的jar文件中的目录中读取。请注意,您正在从 jar文件中读取,而不是目录。

鉴于上述代码,我会:

  1. 确定或明确指定File()操作的工作目录。您的工作目录是您从java调用的工作目录,这可能在IDE内/不在内
  2. 将lena.png打包为.jar文件中的资源。