Сохранение сообщения в R, G, B вместо Альфы
Как изменить его, чтобы сохранить сообщение в младшем значащем бите R, G, B. Код ниже только для встраивания сообщения в Альфа (0 ~ 7 бит)
embedInteger имеет дело с встраиванием длины сообщения в первые 32 пикселя.
embedByte встраивает ваше сообщение символы, один за другим. Каждый раз, когда он вызывается, он принимает в качестве ввода следующий символ в вашем сообщении в байтовой форме, b [i]. Там он встраивает один бит на пиксель, всего 8 бит на байт.
private void embedMessage(BufferedImage img, byte[] mess) {
int messageLength = mess.length;
int imageWidth = img.getWidth(), imageHeight = img.getHeight(),
imageSize = imageWidth * imageHeight;
if(messageLength * 8 + 32 > imageSize) {
System.out.println("Message is too logn");
return;
}
embedInteger(img, messageLength, 0, 0);
for(int i=0; i<mess.length; i++){
embedByte(img, mess[i], i*8+32, 0);
}
}
private void embedInteger(BufferedImage img, int n, int start, int storageBit) {
int maxX = img.getWidth(), maxY = img.getHeight(),
startX = start/maxY, startY = start - startX*maxY, count=0;
for(int i=startX; i<maxX && count<32; i++) {
for(int j=startY; j<maxY && count<32; j++) {
int rgb = img.getRGB(i, j), bit = getBitValue(n, count);
rgb = setBitValue(rgb, storageBit, bit);
img.setRGB(i, j, rgb);
count++;
}
}
}
private void embedByte(BufferedImage img, byte b, int start, int storageBit) {
int maxX = img.getWidth(), maxY = img.getHeight(),
startX = start/maxY, startY = start - startX*maxY, count=0;
for(int i=startX; i<maxX && count<8; i++) {
for(int j=startY; j<maxY && count<8; j++) {
int rgb = img.getRGB(i, j), bit = getBitValue(b, count);
rgb = setBitValue(rgb, storageBit, bit);
img.setRGB(i, j, rgb);
count++;
}
}
}
private int getBitValue(int n, int location) { //n=messageLength, location=count
int v = n & (int) Math.round(Math.pow(2, location));
return v==0?0:1;
}
private int setBitValue(int n, int location, int bit) {
int toggle = (int) Math.pow(2, location), bv = getBitValue(n, location);
if(bv == bit)
return n;
if(bv == 0 && bit == 1){
n |= toggle;
System.out.println("n{toggle: "+n);
}else if(bv == 1 && bit == 0){
n ^= toggle;
}
return n;
}