java.lang.NumberFormatException: для входной строки: "010010101101111111"

Я пытался скрыть изображение в другом изображении (оба одинакового типа), внося изменения в пикселях. Но это выдает ошибку, подобную этой:

Exception in thread "main" java.lang.NumberFormatException: For input 
       string: "010010101101111111"
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at Image.main(Image.java:160)**

Код показан ниже:

public class Image {




public static void main(String argv[]) throws Exception

{

    String imageFile1 = "C:/Users/Desktop/1.jpg";
    String imageFile2 = "C:/Users/Desktop/2.jpg";


    File file1 = new File(imageFile1);
    FileInputStream fis1 = null;
    try {
        fis1 = new FileInputStream(imageFile1);
    } catch (FileNotFoundException e2) {
        // TODO Auto-generated catch block
        e2.printStackTrace();
    }





    File file2 = new File(imageFile2);
    FileInputStream fis2 = null;
    try {
        fis2 = new FileInputStream(imageFile2);
    } catch (FileNotFoundException e2) {
        // TODO Auto-generated catch block
        e2.printStackTrace();
    }



    BufferedImage oimage1 = ImageIO.read(file1);
    BufferedImage oimage2 = ImageIO.read(file2);


    ByteArrayOutputStream baos1=new ByteArrayOutputStream();


    byte[] buf1 = new byte[1024];

    try {
        for (int readNum; (readNum = fis1.read(buf1)) != -1;) {

            baos1.write(buf1, 0, readNum); 

        }
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }


    ByteArrayOutputStream baos2=new ByteArrayOutputStream();


    byte[] buf2 = new byte[1024];

    try {
        for (int readNum; (readNum = fis2.read(buf1)) != -1;) {

            baos2.write(buf2, 0, readNum); 

        }
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    final byte[] imageInByte1 = baos1.toByteArray();
    final int size1 = imageInByte1.length;


    final byte[] imageInByte2 = baos2.toByteArray();
    final int size2 = imageInByte2.length;



    int width1 = oimage1.getWidth();
    int height1 = oimage1.getHeight();
    int pixel1 = 0; 
    int red1,green1,blue1;

    int width2 = oimage2.getWidth();
    int height2 = oimage2.getHeight();
    int pixel2=0,red2,green2,blue2;



    final BufferedImage newimg1 = new BufferedImage(width1, height1, BufferedImage.TYPE_INT_ARGB);
    final BufferedImage newimg2 = new BufferedImage(width2, height2, BufferedImage.TYPE_INT_ARGB);

    for (int i = 0; i < width1; i++)
        for (int j = 0; j < height1; j++) {
            //scan through each pixel
            pixel1 = oimage1.getRGB(i, j);
            pixel2 = oimage2.getRGB(i, j);

        //for red

        String redpix1=Integer.toBinaryString(pixel1);  

        String binaryred1 = redpix1.substring(20,23);

        String redpix2=Integer.toBinaryString(pixel2);

         String binaryred2=redpix2.substring(20,23);

        String newred= binaryred1 + binaryred2;


        //for green
        String greenpix1=Integer.toBinaryString(pixel1);


        String binarygreen1=greenpix1.substring(12,15);

        String greenpix2=Integer.toBinaryString(pixel2);    
        String binarygreen2=greenpix2.substring(12,15);

        String newgreen= binarygreen1 + binarygreen2;


      //for blue
        String bluepix1=Integer.toBinaryString(pixel1); 


        String binaryblue1=bluepix1.substring(4,7);

        String bluepix2=Integer.toBinaryString(pixel2); 
        String binaryblue2=bluepix2.substring(4,7);

        String newblue= binaryblue1 + binaryblue2;

        //combining the new values
        String spixel=newred +newgreen + newblue;
        int newpixel = Integer.parseInt(spixel);

        newimg2.setRGB(i,j,newpixel);

        }   


    JFrame f =new JFrame();
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     f.getContentPane().add(new JLabel(new ImageIcon(newimg2)));
     f.pack();
    f.setLocationRelativeTo(null);
    f.setVisible(true);

    }                               
}

Размер 1.jpg больше, чем размер 2.jpg. Можно ли изменить этот код, чтобы получить вывод? или есть еще один простой способ встраивать изображение?

1 ответ

Сообщение об ошибке не очень объяснительно. NumberFormatException документация не в этом случае. Это говорит:

Брошенный, чтобы указать, что приложение попыталось преобразовать строку в один из числовых типов, но что строка не имеет соответствующего формата.

Что происходит, это int переполнение. Самый большой int у вас может быть 2 147 483 647 (10 цифр), поэтому 10010101101111111 (17 цифр после удаления начального 0) слишком велико. Эта проблема проявляется как NumberFormatException,

Если вы хотели, чтобы это было двоичное число, используйте Integer.parseInt(spixel, 2) указать основание 2 (то есть двоичный). Тогда вы сможете разобрать его, так как до 31 двоичных цифр помещается в ìnt (не 32, потому что он подписан, поэтому есть бит знака).

Есть похожий вопрос к этому: Что такое NumberFormatException и как я могу это исправить? Однако, хотя принятый ответ на этот вопрос упоминает переполнение (довольно глубоко в ответе), он не охватывает попытку анализа строки с неверным основанием. Тем не менее, вы можете прочитать вопрос и ответы и узнать.

Другие вопросы по тегам