Download script.js from CVNSS/Steg: direct link, hf CLI and curl.
- Browser
- Download file 4.15 kB
-
https://huggingface.co/spaces/CVNSS/Steg/resolve/main/script.js
- Command line
-
hf download hf://spaces/CVNSS/Steg/script.js
-
curl -L -o script.js https://huggingface.co/spaces/CVNSS/Steg/resolve/main/script.js
4.15 kB
| $('button.encode, button.decode').click(function(event) { | |
| event.preventDefault(); | |
| }); | |
| function previewDecodeImage() { | |
| var file = document.querySelector('input[name=decodeFile]').files[0]; | |
| previewImage(file, ".decode canvas", function() { | |
| $(".decode").fadeIn(); | |
| }); | |
| } | |
| function previewEncodeImage() { | |
| var file = document.querySelector("input[name=baseFile]").files[0]; | |
| $(".images .nulled").hide(); | |
| $(".images .message").hide(); | |
| previewImage(file, ".original canvas", function() { | |
| $(".images .original").fadeIn(); | |
| $(".images").fadeIn(); | |
| }); | |
| } | |
| function previewImage(file, canvasSelector, callback) { | |
| var reader = new FileReader(); | |
| var image = new Image; | |
| var $canvas = $(canvasSelector); | |
| var context = $canvas[0].getContext('2d'); | |
| if (file) { | |
| reader.readAsDataURL(file); | |
| } | |
| reader.onloadend = function () { | |
| image.src = URL.createObjectURL(file); | |
| image.onload = function() { | |
| $canvas.prop({ | |
| 'width': image.width, | |
| 'height': image.height | |
| }); | |
| context.drawImage(image, 0, 0); | |
| callback(); | |
| } | |
| } | |
| } | |
| function encodeMessage() { | |
| $(".error").hide(); | |
| $(".binary").hide(); | |
| var text = $("textarea.message").val(); | |
| var $originalCanvas = $('.original canvas'); | |
| var $nulledCanvas = $('.nulled canvas'); | |
| var $messageCanvas = $('.message canvas'); | |
| var originalContext = $originalCanvas[0].getContext("2d"); | |
| var nulledContext = $nulledCanvas[0].getContext("2d"); | |
| var messageContext = $messageCanvas[0].getContext("2d"); | |
| var width = $originalCanvas[0].width; | |
| var height = $originalCanvas[0].height; | |
| // Check if the image is big enough to hide the message | |
| if ((text.length * 8) > (width * height * 3)) { | |
| $(".error") | |
| .text("Text too long for chosen image....") | |
| .fadeIn(); | |
| return; | |
| } | |
| $nulledCanvas.prop({ | |
| 'width': width, | |
| 'height': height | |
| }); | |
| $messageCanvas.prop({ | |
| 'width': width, | |
| 'height': height | |
| }); | |
| // Normalize the original image and draw it | |
| var original = originalContext.getImageData(0, 0, width, height); | |
| var pixel = original.data; | |
| for (var i = 0, n = pixel.length; i < n; i += 4) { | |
| for (var offset =0; offset < 3; offset ++) { | |
| if(pixel[i + offset] %2 != 0) { | |
| pixel[i + offset]--; | |
| } | |
| } | |
| } | |
| nulledContext.putImageData(original, 0, 0); | |
| // Convert the message to a binary string | |
| var binaryMessage = ""; | |
| for (i = 0; i < text.length; i++) { | |
| var binaryChar = text[i].charCodeAt(0).toString(2); | |
| // Pad with 0 until the binaryChar has a lenght of 8 (1 Byte) | |
| while(binaryChar.length < 8) { | |
| binaryChar = "0" + binaryChar; | |
| } | |
| binaryMessage += binaryChar; | |
| } | |
| $('.binary textarea').text(binaryMessage); | |
| // Apply the binary string to the image and draw it | |
| var message = nulledContext.getImageData(0, 0, width, height); | |
| pixel = message.data; | |
| counter = 0; | |
| for (var i = 0, n = pixel.length; i < n; i += 4) { | |
| for (var offset =0; offset < 3; offset ++) { | |
| if (counter < binaryMessage.length) { | |
| pixel[i + offset] += parseInt(binaryMessage[counter]); | |
| counter++; | |
| } | |
| else { | |
| break; | |
| } | |
| } | |
| } | |
| messageContext.putImageData(message, 0, 0); | |
| $(".binary").fadeIn(); | |
| $(".images .nulled").fadeIn(); | |
| $(".images .message").fadeIn(); | |
| }; | |
| function decodeMessage() { | |
| var $originalCanvas = $('.decode canvas'); | |
| var originalContext = $originalCanvas[0].getContext("2d"); | |
| var original = originalContext.getImageData(0, 0, $originalCanvas.width(), $originalCanvas.height()); | |
| var binaryMessage = ""; | |
| var pixel = original.data; | |
| for (var i = 0, n = pixel.length; i < n; i += 4) { | |
| for (var offset =0; offset < 3; offset ++) { | |
| var value = 0; | |
| if(pixel[i + offset] %2 != 0) { | |
| value = 1; | |
| } | |
| binaryMessage += value; | |
| } | |
| } | |
| var output = ""; | |
| for (var i = 0; i < binaryMessage.length; i += 8) { | |
| var c = 0; | |
| for (var j = 0; j < 8; j++) { | |
| c <<= 1; | |
| c |= parseInt(binaryMessage[i + j]); | |
| } | |
| output += String.fromCharCode(c); | |
| } | |
| $('.binary-decode textarea').text(output); | |
| $('.binary-decode').fadeIn(); | |
| }; |