public static void encodeIntoImage(File containerImg, File outputFile, byte[] srcBytes, String key) {
        try {
            BufferedImage in = ImageIO.read(containerImg);
            BufferedImage newImage = new BufferedImage(in.getWidth(), in.getHeight(), BufferedImage.TYPE_INT_ARGB);
            Graphics2D g = newImage.createGraphics();
            g.drawImage(in, 0, 0, null);
            g.dispose();

            srcBytes = CompressionProvider.compressBytes(srcBytes);

            byte[] encryptedBytes = EncryptionProvider.encryptBytes(srcBytes, key.getBytes());

            // Trick: convert from unsigned number to signed byte
            short[] srcS = new short[encryptedBytes.length];
            for (int i = 0; i < encryptedBytes.length; i++) {
                srcS[i] = (short) (encryptedBytes[i] & 0xFF);
            }

            ImageEncoder.writeBytesToImage(in, encryptedBytes, outputFile.toString(), key);

            System.out.println("[OK] Steganographic .png \"" + outputFile.toString() + "\" generated.");
        } catch (DataFormatException ex) {
            Logger.getLogger(ImageUtils.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | InvalidAlgorithmParameterException | IllegalBlockSizeException | BadPaddingException | ImageWriteException | IOException ex) {
            Logger.getLogger(ImageUtils.class.getName()).log(Level.SEVERE, null, ex);
        }
    }