ทำการเข้ารหัสและต้องถอดรหัสรูปภาพโดยใช้จาวาสคริปต์

0

คำถาม

ของเซิร์ฟเวอร์ใช้ไพธอนฟังก์ชันเพื่อเข้ารหัสและต้องถอดรหัสรูปภาพใน bytearray รูปแบบ ฉันอยากจะทำแบบเดียวกันการเข้ารหัสใน frontend และส่งไปยังฟังก์ชันนี้ในโปรแกรมเบื้องหลัง. วิธีที่จะแปลงนี้วิธีการไปจาวาสคริปต์

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

นี่เป็นวิธีจะทำยังไงกับมัน 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

เป็นค่าพารามิเตอร์ imageBuffer คือ arraybuffer หรือ bytearray?
Ali Ouda

เพราะฉันนำเข้าข้อมูลเป็น byteArray
Ali Ouda
1

ต้องเข้าใจแต่ละหน่วยเป็นพิกเซลส่วนประกอบจากภาพนายคนแรกวาดภาพนั้นจะเป็นงาน:

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;

ข้อคนรูปร่างและประเภทของข้อมูลกลับมาโดย CanvasRenderingContext2D.getImageData() ฟังก์ชัน:

ImageData ctx.getImageData(sx, sy, sw, sh);
  • sxที่พิกัด x ของซ้ายบนมุมของสี่เหลี่ยมจากที่ ImageData นจะสะกัดออกมา.
  • syที่พิกัด y ของซ้ายบนมุมของสี่เหลี่ยมจากที่ ImageData นจะสะกัดออกมา.
  • sw:ความกว้างของสี่เหลี่ยมจากที่ ImageData นจะสะกัดออกมา.
  • sh:ความสูงของสี่เหลี่ยมจากที่ ImageData นจะสะกัดออกมา.

คุณสามารถเห็นมันจะได้ค่าเป็น ImageData วัตถุ, อะไรก็ตามที่เป็น. คนส่วนสำคัญที่นี่คือที่นั่นมีวัตถุ .data ทรัพย์สินซึ่งบรรจุของพิกเซลค่า.

อย่างไรก็ตามโปรดจำไว้ว่า .data ทรัพย์สินเป็น 1-มิติ Uint8ClampedArrayซึ่งหมายความว่าทั้งหมดพิกเซลเป็นส่วนประกอบถูก flattened ดังนั้นคุณเริ่มบางอย่างที่ดูเหมือนนี้:

เอาเป็นว่าคุณมี 2x2 ภาพแบบนี้:

 RED PIXEL |       GREEN PIXEL
BLUE PIXEL | TRANSPARENT PIXEL

ตอนนั้นคุณจะพาพวกเขาเหมือนนี้:

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

คุณสามารถเปลี่ยนค่าของพวกนี้แต่คุณอยากและในของคุณเจาะจงใช้คดีคงจะเป็นทั้งหมดที่คุณต้องการที่จะทำอย่างที่ frontend ก่อนที่กำลังส่งที่เปลี่ยนข้อมูลไปยังเซิร์ฟเวอร์:

const transformedData = encryptedDecryptedImage(data);

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

ถ้าคุณอยากจะวาดเปลี่ยนข้อมูลกลับหน้าแรกคุณต้องการจะแปลงมันกลับไป ImageData ใช้ CanvasRenderingContext2D.createImageData() แล้ว CanvasRenderingContext2D.putImageData():

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

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

context.putImageData(transformedData, 0, 0);

ทำงานตัวอย่าง:

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

⚠️โน้ตฉันโดยใช้ข้อมูลเล็กน้อน URI ที่จะหลีกเลี่ยง Cross-Origin ปัญหาถ้าฉันรวมเป็นเว็บเบราว์เซอร์ภายนอกของภาพหรือคำตอบนั่นคือนั้น\n ยิ่งใหญ่กว่ามนุษย์ได้รับอนุญาตถ้าฉันพยายามที่จะใช้เป็นข้อมูลอีกต่อ URI.

2021-11-22 03:30:25

ฉันกำลังใช้นี่เพื่อบันทึกนวนท่อนที่มาจากสื่อบันทึกเสียงฉันต้องการรู้ว่าถ้าฉันสามารถใช้มันวนท่อนที่ยังเป็นของฉันนำเข้าข้อมูลสำหรับการเข้ารหัส:mediaRecorder.ondataavailable=ฟังก์ชัน(e){ถ้า(e.ข้อมูลขนาดของ>0){recordedChunks.ผลัก(e.ข้อมูล);}}
Ali Ouda

นี่ตัวอย่างเช่นจะทำงานได้ดีกับหนึ่งชิ้นส่วนที่เวลาฉันสันนิษฐานว่ามันมีส่วนหนึ่งมิติอาเรย์อยู่ที่ไหนพิกเซลงข้อมูลถูกแล้ว flattened. ไม่อย่างนั้นคุณจะต้องทำอย่างนั้นก่อน เห็นไหมฉันอธิบายเรื่องกลับค่า getImageData().
Danziger

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

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