1
public static void sample(BufferedImage image) {
    int width = image.getWidth();
    int height = image.getHeight();
    int value[][] = new int[width][height];
    int valueR[][] = new int[width][height];
    int valueG[][] = new int[width][height];
    int valueB[][] = new int[width][height];
    for (int j = 0; j < height; j++) {
        for (int i = 0; i < width; i++) {
            int pixel = image.getRGB(i, j);
            value[i][j] = pixel;
            Color c = new Color(pixel);
            valueR[i][j]= c.getRed();
            valueG[i][j] = c.getGreen();
            valueB[i][j] = c.getBlue();  
            System.out.println("Red value = "+valueR[i][j]);
            System.out.println("Green value ="+valueG[i][j]);
            System.out.println("Blue value"+valueB[i][j]);
        }
    }
}

上面的代码是将图像的RGB值和像素颜色值分别存储在一个数组中。

 public static BigInteger modPow(BigInteger a1, BigInteger e, BigInteger n) {

    BigInteger r = 1;


    for (int i = e.bitLength() - 1; i >= 0; i--) {
        r = (r.multiply(r)).mod(n);
        if (e.testBit(i)) {
            r = (r.multiply(a1)).mod(n);
        }
    }
    System.out.println("C value = " + r);

    int lng = 3;
    BigInteger bi = BigInteger.valueOf(lng);
    BigInteger a = r.divide(bi);
    BigInteger b = r.mod(bi);
    System.out.println("pixel position a = " + a);
    System.out.println("modulus value b = " + b);
    return r;
}

在上面的代码中,我找到了我需要嵌入秘密位的像素位置。所以我需要去那个特定的像素来嵌入消息。但是在前面的代码中,我将像素颜色存储在数组值 [] [] 中。我需要搜索数组 value[][] 以获取我在最后一个代码中得到的像素位置。

注意: a1 是当前要嵌入的信息文件位的位置 {e,n} 是公钥

我的问题是如何找到像素位置?

4

1 回答 1

1

找到一个像素的位置是一个简单的概念,执行起来很复杂。我在这里编写了一些代码,它采用 BufferedImage 并通过它搜索特定颜色的像素

import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import java.io.IOException;

public class pixelSearch {

    public static void main(String[] args) {
        //I don't know where you're getting your image but i'll get one from file
        File image = new File("image.bmp");
        try {
            BufferedImage imageToSearch = ImageIO.read(image);

            Color colorToFind = new Color(255,255,255); //define color to search for with RGB vals 255,255,255
            //for more information on constructing colors look here: http://docs.oracle.com/javase/7/docs/api/java/awt/Color.html

            int[] pixelCoordinates = pSearch( colorToFind, imageToSearch ); //search for the pixel
            System.out.println("Found pixel at (" + pixelCoordinates[0] + "," + pixelCoordinates[1] + ")."); //display coordinates
        } catch (IOException e) {
            System.out.println(e.toString());
        }
    }

    private static int[] pSearch ( Color c, BufferedImage pic ){                
        int cVal = c.getRGB(); //get integer value of color we are trying to find

        int x1 = 0;
        int y1 = 0;
        int x2 = pic.getWidth();
        int y2 = pic.getHeight();

        int[] XArray = new int[x2-x1+1]; //create an array to hold all X coordinates in image
        int iterator = 0;
        while (iterator <= x2) {
            XArray[iterator] = x1 + iterator;
            iterator++;
        }
        int [] YArray = new int[y2-y1+1]; //create an array to hold all Y coordinates in image
        iterator = 0;
        while (iterator <= y2) {
            YArray[iterator] = y1 + iterator;
            iterator++;
        }

        //next we iterate throug all the possible coordinates to check each pixel
        for (int yVal : YArray) {
            for (int xVal : XArray) {
                int color = pic.getRGB(xVal, yVal); //get the color of pixel at coords (xVal, yVal) 
                if (color == cVal) { //if the color is equal to the one we inputted to the function
                    int[] cPos = {xVal, yVal}; //store the coordinates
                    return cPos; //return the coordinates
                }
            }
        }

        int[] returnVal = {-1,-1}; //if we didn't find it return -1, -1
        return returnVal;
    }
}
于 2013-10-21T04:37:38.963 回答