async asyncdecryptImage(url) { const key = "RZM15kr$Oh=IxG#o"; const response = await axios.get(url, { responseType: "arraybuffer" }); const encrypted_data =response.data const KEY_arr = new TextEncoder().encode(key); const decrypted_data = new Uint8Array(encrypted_data.length); for (let i = 0; i < encrypted_data.length; i++) { decrypted_data[i] = encrypted_data[i] ^ KEY_arr[i % KEY_arr.length]; } const decrypted_data_arr = new Uint8ClampedArray(decrypted_data); const img_data = new ImageData(decrypted_data_arr); const img = new Image(); img.src = URL.createObjectURL( new Blob([img_data], { type: "image/png" }) ); console.log(img, "img"); document.body.appendChild(img); },
时间: 2024-01-28 11:02:57 浏览: 282
根据你提供的代码,可以看出问题出在第11行,即构造ImageData的时候,没有传入正确的参数。根据HTML5规范,构造ImageData需要传入两个参数,分别是一个Uint8ClampedArray类型的数据,以及一个表示该数据的宽度和高度的整数值。在你的代码中,只传入了一个Uint8ClampedArray类型的数据,没有传入表示宽度和高度的整数值。这也就是报错的原因。
要解决这个问题,需要根据实际情况传入正确的宽度和高度。你可以在解密数据之前,先获取到原始图片的宽度和高度,然后在构造ImageData时一同传入即可。例如,你可以在asyncdecryptImage函数的开头,添加获取原始图片宽度和高度的代码:
```javascript
async asyncdecryptImage(url) {
const key = "RZM15kr$Oh=IxG#o";
const response = await axios.get(url, { responseType: "arraybuffer" });
const encrypted_data = response.data;
const KEY_arr = new TextEncoder().encode(key);
const decrypted_data = new Uint8Array(encrypted_data.length);
for (let i = 0; i < encrypted_data.length; i++) {
decrypted_data[i] = encrypted_data[i] ^ KEY_arr[i % KEY_arr.length];
}
const decrypted_data_arr = new Uint8ClampedArray(decrypted_data);
// 获取原始图片的宽度和高度
const img = new Image();
img.src = url;
await img.decode();
const { width, height } = img;
// 构造ImageData
const img_data = new ImageData(decrypted_data_arr, width, height);
const img = new Image();
img.src = URL.createObjectURL(new Blob([img_data], { type: "image/png" }));
console.log(img, "img");
document.body.appendChild(img);
}
```
这样就可以在构造ImageData时正确传入宽度和高度,解决报错问题。
阅读全文