ต้องเข้าใจแต่ละหน่วยเป็นพิกเซลส่วนประกอบจากภาพนายคนแรกวาดภาพนั้นจะเป็นงาน:
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.