Crypter et décrypter l'image à l'aide de javascript

0

La question

Mon serveur à l'aide de cette fonction python pour chiffrer et déchiffrer les images dans un objet bytearray format. Je veux faire la même chiffrement dans la gestion de l'interface et de l'envoyer à cette fonction dans le backend. comment faire pour convertir cette méthode 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

Voici comment le faire avec 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

est le paramètre d'entrée imageBuffer est arraybuffer ou bytearray?
Ali Ouda

parce que mon entrée est un objet byteArray
Ali Ouda
1

Pour obtenir les pixels individuels des composants à partir d'une image, vous devez d'abord attirer l'image d'une toile:

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

Ensuite, obtenir les valeurs de pixels que vous allez mettre à jour:

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

Noter la forme et le type des données renvoyées par le CanvasRenderingContext2D.getImageData() fonction:

ImageData ctx.getImageData(sx, sy, sw, sh);
  • sx: La coordonnée x du coin supérieur gauche du rectangle à partir de laquelle les données images sont extraites.
  • sy: La coordonnée y du coin supérieur gauche du rectangle à partir de laquelle les données images sont extraites.
  • sw: La largeur du rectangle à partir de laquelle les données images sont extraites.
  • sh: La hauteur du rectangle à partir de laquelle les données images sont extraites.

Vous pouvez le voir, il renvoie un ImageData objet, quelle qu'elle soit. L'important ici est que cet objet a un .data la propriété qui contient toutes nos valeurs de pixel.

Toutefois, notez que .data la propriété se trouve à 1 dimension Uint8ClampedArray, ce qui signifie que tous les pixels de composants ont été aplaties, de sorte que vous obtenez quelque chose qui ressemble à ceci:

Disons que vous avez une 2x2 image comme ceci:

 RED PIXEL |       GREEN PIXEL
BLUE PIXEL | TRANSPARENT PIXEL

Ensuite, vous aurez comme ceci:

[ 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 | 

Vous pouvez ensuite transformer ces valeurs que vous souhaitez, et dans votre cas d'utilisation spécifiques, qui seraient tous ce que vous devez faire sur le frontend avant d'envoyer les données transformées au serveur:

const transformedData = encryptedDecryptedImage(data);

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

Si vous voulez attirer les données transformées de retour sur la page, vous devez d'abord les convertir à ImageData à l'aide de CanvasRenderingContext2D.createImageData() et CanvasRenderingContext2D.putImageData():

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

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

context.putImageData(transformedData, 0, 0);

Exemple:

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=" >

⚠️ Note, je suis en utilisant un petit URI pour éviter Cross-Origin des questions, si je comprend d'une image externe ou une réponse qui est plus grand que celui autorisé si j'essaie d'utiliser plus de données URI.

2021-11-22 03:30:25

Je suis l'utiliser pour enregistrer des morceaux de la part des médias enregistreur je veux savoir si je peux utiliser ce morceaux comme mon entrée pour le chiffrement : mediaRecorder.ondataavailable = function (e) { if (e.les données.taille > 0) { recordedChunks.push(e.données); } }
Ali Ouda

Cet exemple va fonctionner très bien avec un morceau à la fois, en supposant qu'il contient un tableau à une dimension où les données de pixel a déjà été aplatie. Sinon, vous n'avez à le faire. Voir où j'explique la valeur de retour de getImageData().
Danziger

Dans d'autres langues

Cette page est dans d'autres langues

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