Java 在对两个图像进行异或运算后,从getRGB和setRGB获取不同的值

Java 在对两个图像进行异或运算后,从getRGB和setRGB获取不同的值,java,image-processing,xor,Java,Image Processing,Xor,我想对两个图像逐像素进行异或运算。我正在使用以下代码 import java.awt.Color; import java.awt.image.BufferedImage; import java.io.File; import java.io.*; import java.io.IOException; import javax.imageio.ImageIO; import java.util.Scanner; import java.security.*; import java.awt

我想对两个图像逐像素进行异或运算。我正在使用以下代码

 import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.*;
import java.io.IOException;
import javax.imageio.ImageIO;
import java.util.Scanner;
import java.security.*;
import java.awt.AlphaComposite;
import java.awt.Graphics2D;
import java.awt.RenderingHints;

public class sefi 
{
    public static void main(String[] args) throws Exception 
    {   
        encdec ed = new encdec();

        String plainimagename = args[0];
        String keyfilename = args[1];
        String choice = args[2];

        BufferedImage bikey = ImageIO.read(new File(keyfilename));
        BufferedImage biplain = ImageIO.read(new File(plainimagename));

        BufferedImage resizedImage = new BufferedImage(biplain.getWidth(), biplain.getHeight(), BufferedImage.TYPE_INT_RGB);
    Graphics2D g = resizedImage.createGraphics();
    g.drawImage(bikey, 0, 0, biplain.getWidth(), biplain.getHeight(), null);
    g.dispose();
        ImageIO.write(resizedImage, "jpg", new File("resizeimage.jpg"));

        if(choice.equals("enc"))
        {
            ed.encrypt(resizedImage,biplain);   
        }
        else if(choice.equals("dec"))
        {
            ed.decrypt(resizedImage,biplain);
        }
    }     
}

class encdec
{
    public void encrypt(BufferedImage bikey, BufferedImage biplain) throws Exception
    {
        BufferedImage xoredimage = xor(bikey, biplain);
        File xored = new File("xored.jpg");
        ImageIO.write(xoredimage, "JPEG", xored);
    }

    public void decrypt(BufferedImage bikey, BufferedImage biplain) throws Exception
    {
        BufferedImage xoredimage = xor(bikey, biplain);
        File xored = new File("newplain.jpg");
        ImageIO.write(xoredimage, "JPEG", xored);
    }
    private BufferedImage xor(BufferedImage image1, BufferedImage image2) throws Exception
    {
        BufferedImage outputimage = new BufferedImage(image1.getWidth(), image1.getHeight(), BufferedImage.TYPE_INT_RGB);
        for (int y = 0; y < image1.getHeight(); y++) 
        {
            for (int x = 0; x < image1.getWidth(); x++) 
            {
                outputimage.setRGB(x,y,((image1.getRGB(x, y))^(image2.getRGB(x, y))));
                System.out.println("one:" + image1.getRGB(x, y) + "\ttwo:" + image2.getRGB(x, y) + "\txor:" + ((image1.getRGB(x, y))^(image2.getRGB(x, y))));
                System.out.println("one:" + Integer.toBinaryString(image1.getRGB(x, y)) + "\ttwo:" + Integer.toBinaryString(image2.getRGB(x, y)) + "\txor:" + Integer.toBinaryString((image1.getRGB(x, y)^image2.getRGB(x, y))));
            }
        }

        return outputimage;
    }
}
下次我运行时,将image1作为xored图像文件,将Image2作为4像素彩色文件,这将为我提供原始白色图像作为输出。但我将其作为输出: 输入:java sefi xored.jpg key.jpg dec

如果您查看输出,我们可以看到第一次xored图像的颜色发生了变化。
我无法理解为什么同一图像文件的颜色值不同。

您的图像选择有问题。如果为生成的图像选择RGB,则第一个像素将为110001000101011100,而不是11111111 000000000000 11011000111

因此,我的建议是让您检查第二步中使用的图像是否正确

您的代码看起来不错,不过您必须粘贴整个代码,以便我有更好的想法。

找到了答案。 这是因为我使用的是JPEG图像。JPEG压缩原始图像,但解压时不能保证生成与压缩前完全相同的颜色。因此,前后的颜色值不同。
当我使用bmp图像时,我得到了前后相同的颜色

但这正是我无法理解的问题——相同像素的不同像素值。我检查了不同的图像,大小。但同样的问题-设置值和获取值时像素值不同。编辑我的问题以包含完整代码和输入。
one:-201053 two:-1  xor:201052
one:11111111111111001110111010100011    two:11111111111111111111111111111111    xor:110001000101011100
one:-265579 two:-1  xor:265578
one:11111111111110111111001010010101    two:11111111111111111111111111111111    xor:1000000110101101010
one:-664247 two:-1  xor:664246
one:11111111111101011101110101001001    two:11111111111111111111111111111111    xor:10100010001010110110
one:-925624 two:-1  xor:925623
one:11111111111100011110000001001000    two:11111111111111111111111111111111    xor:11100001111110110111
one:-1  two:-16773753   xor:16773752
one:11111111111111111111111111111111    two:11111111000000000000110110000111    xor:111111111111001001111000
one:-1  two:-16773753   xor:16773752
one:11111111111111111111111111111111    two:11111111000000000000110110000111    xor:111111111111001001111000
one:-1  two:-15786601   xor:15786600
one:11111111111111111111111111111111    two:11111111000011110001110110010111    xor:111100001110001001101000
one:-1  two:-15786601   xor:15786600
one:11111111111111111111111111111111    two:11111111000011110001110110010111    xor:111100001110001001101000