code: public static BufferedImage weaveInto(final BufferedImage bufferedImage, final String message)
  	{
  
  		final int width = bufferedImage.getWidth();
  		final int height = bufferedImage.getHeight();
  
  		if (message.length() > 255)
  		{
  			throw new IllegalArgumentException("Given message is to large(max 255 characters)");
  		}
  		if (message.length() * 11 > width * height)
  		{
  			throw new IllegalArgumentException("Given image is to small");
  		}
  
  		final byte[] messageBytes = message.getBytes();
  
  		int messageLengthDecode = bufferedImage.getRGB(0, 0) >> 8 << 8;
  
  		messageLengthDecode |= message.length();
  		bufferedImage.setRGB(0, 0, messageLengthDecode);
  
  		for (int i = 1, messagePosition = 0, row = 0, j = 0; row < height; row++)
  		{
  			for (int column = 0; column < width && j < messageBytes.length; column++, i++)
  			{
  
  				if (i % 11 == 0)
  				{
  
  					int rgb = bufferedImage.getRGB(column, row);
  
  					final int a = rgb >> 24 & 0xff;
  
  					int r = (rgb >> 16 & 0xff) >> 3 << 3;
  					r = r | messageBytes[messagePosition] >> 5;
  
  					int g = (rgb >> 8 & 0xff) >> 3 << 3;
  					g = g | messageBytes[messagePosition] >> 2 & 7;
  
  					int b = (rgb & 0xff) >> 2 << 2;
  					b = b | messageBytes[messagePosition] & 0x3;
  
  					rgb = 0;
  					rgb = rgb | a << 24;
  					rgb = rgb | r << 16;
  					rgb = rgb | g << 8;
  
  					rgb = rgb | b;
  
  					bufferedImage.setRGB(column, row, rgb);
  					messagePosition++;
  					j++;
  				}
  			}
  		}
  		return bufferedImage;
  	}
docs: Weave the given secret message into the given {@link BufferedImage}.
  
  @param bufferedImage
  the buffered image
  @param message
  the secret message
  @return the buffered image with the secret message weaved in.