Cifrar y descifrar imágenes con javascript

0

Pregunta

Mi servidor mediante esta función de python para cifrar y descifrar imágenes en un objeto bytearray formato. Yo quiero hacer el mismo cifrado en el frontend y enviar a esta función en el backend. cómo convertir este método en 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
2
1

Aquí está cómo hacerlo con 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]))

2021-11-22 03:07:25

es el parámetro de entrada imageBuffer es arraybuffer o bytearray?
Ali Ouda

porque mi entrada es un byteArray
Ali Ouda
1

Para obtener los píxeles individuales de los componentes de una imagen, primero se dibuja la imagen en un lienzo:

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);

A continuación, obtener los valores de los píxeles que se van a actualizar:

const data = context.getImageData(0, 0, width, height).data;

Observe la forma y el tipo de los datos devueltos por el CanvasRenderingContext2D.getImageData() función:

ImageData ctx.getImageData(sx, sy, sw, sh);
  • sx: La coordenada x de la esquina superior izquierda del rectángulo a partir de la cual el ImageData será extraído.
  • sy: La coordenada y de la esquina superior izquierda del rectángulo a partir de la cual el ImageData será extraído.
  • sw: El ancho del rectángulo a partir de la cual el ImageData será extraído.
  • sh: La altura del rectángulo a partir de la cual el ImageData será extraído.

Usted puede ver devuelve un ImageData objeto, sea lo que sea. La parte importante aquí es que ese objeto tiene un .data la propiedad que contiene todos los valores de los píxeles.

Sin embargo, tenga en cuenta que .data la propiedad es de 1-dimensión Uint8ClampedArray, lo que significa que todos los píxeles de los componentes han sido aplastadas, de modo que usted está consiguiendo algo que se parece a esto:

Digamos que usted tiene un 2x2 imagen como esta:

 RED PIXEL |       GREEN PIXEL
BLUE PIXEL | TRANSPARENT PIXEL

Entonces, usted va a obtener de ellos, como este:

[ 255, 0, 0, 255,    0, 255, 0, 255,    0, 0, 255, 255,    0, 0, 0, 0          ]
|   RED PIXEL   |    GREEN PIXEL   |     BLUE PIXEL   |    TRANSPAERENT  PIXEL |
|   1ST PIXEL   |      2ND PIXEL   |      3RD PIXEL   |             4TH  PIXEL | 

Luego puede transformar estos valores, sin embargo, te gustaría, y en su caso de uso específico, que sería todo lo que necesita hacer en la interfaz de usuario antes de enviar los datos transformados en el servidor:

const transformedData = encryptedDecryptedImage(data);

fetch('httsp://', { ... });

Si quieres dibujar los datos transformados de nuevo en la página, primero debe volver a convertir ImageData el uso de CanvasRenderingContext2D.createImageData() y CanvasRenderingContext2D.putImageData():

const imageData = context.createImageData(width, height);

imageData.data.set(new Uint8ClampedArray(transformedData));

context.putImageData(transformedData, 0, 0);

Ejemplo de trabajo:

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);

// Transform the top half of the image (each pixel has 4 coordinates, RGB and alpha):
const maxTransformedCoords = width * Math.round(height / 2) * 4; 

// Avoid processing more than needed:
const requiredRows = Math.ceil(maxTransformedCoords / (width * 4));

// Get the pixel component values as an array:
const data = context.getImageData(0, 0, width, requiredRows).data;

// Your transform logic (with some changes):

const key = 48;

let count = 0;

const transformedData = data.map((value, i) => {    
  if (++count > maxTransformedCoords) return value;

  // Turn alpha coordinates opaque:
  // if ((i + 1) % 4 === 0) return 255;

  // Your logic:
  return value ** key;
});

// Turn the transformed data into an ImageData object:
const imageData = context.createImageData(width, requiredRows);
imageData.data.set(new Uint8ClampedArray(transformedData));

// Draw the transformed pixels:
context.putImageData(imageData, 0, 0);

// Display it on the page:
canvas.id = 'canvas';
document.body.append(canvas);
body {
  margin: 0;
  height: 100vh;
  display: flex;
  flex-direction: row;
  align-items: center;
  justify-content: center;
  font-family: monospace;
  overflow: hidden;
}

#image,
#canvas {
  border: 4px solid white;
  border-radius: 2px;
  box-shadow: 0 0 32px 0 rgba(0, 0, 0, .25);
  width: 150px;
  box-sizing: border-box;
  display: block;
  background: cyan;
}

#canvas {
  margin-left: 32px;
}
<img id="image" src="data:image/gif;base64,R0lGODlhSwBLAPEAACMfIO0cJAAAAAAAACH/C0ltYWdlTWFnaWNrDWdhbW1hPTAuNDU0NTUAIf4jUmVzaXplZCBvbiBodHRwczovL2V6Z2lmLmNvbS9yZXNpemUAIfkEBQAAAgAsAAAAAEsASwAAAv+Uj6mb4A+QY7TaKxvch+MPKpC0eeUUptdomOzJqnLUvnFcl7J6Pzn9I+l2IdfII8DZiCnYsYdK4qRTptAZwQKRVK71CusOgx2nFRrlhMu+33o2NEalC6S9zQvfi3Mlnm9WxeQ396F2+HcQsMjYGEBRVbhy5yOp6OgIeVIHpEnZyYCZ6cklKBJX+Kgg2riqKoayOWl2+VrLmtDqBptIOjZ6K4qAeSrL8PcmHExsgMs2dpyIxPpKvdhM/YxaTMW2PGr9GP76BN3VHTMurh7eoU14jsc+P845Vn6OTb/P/I68iYOfwGv+JOmRNHBfsV5ujA1LqM4eKDoNvXyDqItTxYX/DC9irKBlIhkKGPtFw1JDiMeS7CqWqySPZcKGHH/JHGgIpb6bCl1O0LmT57yCOqoI5UcU0YKjPXmFjMm0ZQ4NIVdGBdZRi9WrjLxJNMY1Yr4dYeuNxWApl1ALHb+KDHrTV1owlriedJgSr4Cybu/9dFiWYAagsqAGVkkzaZTAuqD9ywKWMUG9dCO3u2zWpVzIhpW122utZlrHnTN+Bq2Mqrlnqh8CQ+0Mrq3Kc++q7eo6dlB3rLuh3abPVbbbI2mxBdhWdsZhid8cr0oy9F08q0k5FXSadiyL1mF5z51a8VsQOp3/LlodkBfzmzWf2bOrtfzr48k/1hupDaLa9rUbO+zlwndfaOCURAXRNaCBqBT2BncJakWfTzSYkmCEFr60RX0V8sKaHOltCBJ1tAAFYhHaVVbig3jxp0IBADs=" >

⚠️ Nota: estoy usando un pequeño URI para evitar Cross-Origin problemas, si tengo que incluir una imagen externa o una respuesta que es mayor que el permitido si intento utilizar más datos de la URI.

2021-11-22 03:30:25

Estoy usando esto para grabar fragmentos de los medios de comunicación grabadora quiero saber si puedo usar este trozos como mi entrada para el cifrado : mediaRecorder.ondataavailable = function (e) { if (e.de datos.tamaño > 0) { recordedChunks.empuje(e.de datos); } }
Ali Ouda

Este ejemplo podría funcionar bien con un fragmento del tiempo, suponiendo que contiene un array de una dimensión donde los datos de los píxeles ya se ha aplanado. De lo contrario se tendría que hacer eso primero. Ven a lo que me explique el valor de retorno de getImageData().
Danziger

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................