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

时间:2014-05-12 03:39:51

标签: 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.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是一个4像素的彩色图像,而image2是一个4像素的白色图像,我得到的输出为: 输入:#java sefi white.jpg key.jpg enc

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

下次我将image1作为xored图像文件运行,将image 2作为4像素彩色文件运行,这应该会将原始白色图像作为输出。但我把它作为输出而不是: 输入:#java sefi xored.jpg key.jpg dec

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

如果查看输出,我们可以看到第一次xored图像的颜色已经改变。 我无法理解为什么我为同一个图像文件获取不同的颜色值。

2 个答案:

答案 0 :(得分:0)

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

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

你的代码看起来还不错,虽然你必须粘贴整个代码才能让我有更好的想法。

答案 1 :(得分:0)

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