Шифрование и расшифровка изображений с помощью javascript
Мой сервер использует эту функцию python для шифрования и расшифровки изображений в формате байтового массива. Я хочу сделать такое же шифрование во фронтенде и отправить в эту функцию в бэкенде. как преобразовать этот метод в JavaScript
def encrypted_decrypted_image(image):
key = 48
count = 0
for index, value in enumerate(image):
count += 1
image[index] = value ^ key
if count == 10:
break
return image
Вот как это сделать с помощью Array.reduce()
,
// def encrypted_decrypted_image(image):
// key = 48
// count = 0
// for index, value in enumerate(image):
// count += 1
// image[index] = value ^ key
// if count == 10:
// break
// return image
function xorImage(imageBuffer, key=48){
return imageBuffer.reduce((acc, value, index) => {
if(index == 10) return acc;
acc.push(value ^ key);
return acc;
}, [])
}
console.log(xorImage([1, 20, 3, 4, 5, 6, 7, 8, 9]))
Чтобы получить отдельные компоненты пикселей из изображения, сначала нужно нарисовать это изображение на холсте:
const image = document.getElementById('image');
const canvas = document.createElement('canvas');
const context = canvas.getContext('2d');
const width = image.width;
const height = image.height;
canvas.width = width;
canvas.height = height;
// Draw original image:
context.drawImage(image, 0, 0, width, height);
Затем получите значения для пикселей, которые вы собираетесь обновить:
const data = context.getImageData(0, 0, width, height).data;
Вы можете преобразовывать эти значения как угодно, и в вашем конкретном случае это будет все, что вам нужно сделать на фронтенде перед отправкой преобразованных данных на сервер:
const transformedData = encryptedDecryptedImage(data);
fetch('httsp://', { ... });
Если вы хотите вернуть преобразованные данные на страницу, сначала необходимо преобразовать их в ImageData
:
const imageData = context.createImageData(width, height);
imageData.data.set(new Uint8ClampedArray(transformedData));
context.putImageData(transformedData, 0, 0);
Пример работы:
⚠️ Обратите внимание, я использую небольшой URI данных, чтобы избежать Cross-Origin
проблем, если я включу внешнее изображение или ответ, размер которого превышает допустимый, если я попытаюсь использовать более длинный URI данных.