Guarda, abbozzato al volo (e non provato per bene):
BufferedImage bufImg = // ..........
String testo = "testo di prova";
byte[] bytes = testo.getBytes("UTF-8");
int x = 0;
int y = 0;
for (byte b : bytes) {
for (int i = 0; i < 8; i++) {
int bit = b & 1;
int argb = bufImg.getRGB(x, y);
argb = argb & ~1 | bit;
bufImg.setRGB(x, y, argb);
x++;
if (x >= bufImg.getWidth()) { // fa avanzare di riga, se necessario
x = 0;
y++;
}
b >>= 1;
}
}
Questo fa quello che dicevo io come esempio prima. Cioè codifica 1 bit di informazione in 1 pixel (nel canale del "Blu"). Quindi servono 8 pixel per codificare ciascun byte dell'array.
Ti spiego anche:
int bit = b & 1;
questo prende il bit meno significativo. Facendo una AND con 1, il risultato è 0 o 1 a seconda del bit meno significativo del byte.
argb = argb & ~1 | bit;
questo fa prima una "maschera" per azzerare il bit meno significativo (che è del Blu). ~1 vuol dire NOT 1, l'unico bit a 0 è quello meno significativo. argb & ~1 fa una AND con questa maschera, quindi passano tutti i bit TRANNE quello meno significativo, che resta 0.
Poi | bit fa una OR settando il bit meno significativo.
b >>= 1;
sposta a destra di una posizione tutti i bit.