Во время тестирования я заметил, что загрузка некоторых изображений останавливается примерно на 20%. Это происходит, когда изображения масштабируются для заполнения холста и, следовательно, выравниваются по левому краю (без горизонтальной обрезки, холст/экран широкоэкранный). Проблема не возникнет, если я немного увеличу масштаб, чтобы левая и правая стороны были немного обрезаны. Таким образом, этот особый случай вызывает проблемы в дальнейшем, которые в конечном итоге приводят к остановке загрузки. Однако сейчас это на самом деле не важно, так что давайте сразу забудем об этом.
Все, что я показываю вам сейчас, находится внутри saveButton.addEventListener("click", () => {..., который при нажатии выполняет всю обработку и запускает загрузку. Фактическое странное поведение начинается здесь:
Это форма, которую мы отправляем xhr.send(formDataIndex):
Код: Выделить всё
const formDataIndex = new FormData();
formDataIndex.append("save_path", savePathIndexed);
formDataIndex.append("original_name", indexedFileName);
formDataIndex.append("index", indexBlob, indexedFileName);
Код: Выделить всё
const indexBlob = new Blob([highResIndexBuffer.buffer], { type: "application/octet-stream" });
Код: Выделить всё
for (let y = 0; y < scaledHeight; y++) {
for (let x = 0; x < scaledWidth; x++) {
let srcIdx = y * scaledWidth + x;
let dstIdx = (scaledOffsetY + y) * 2560 + (scaledOffsetX + x);
highResIndexBuffer[dstIdx] = imageIdxBuffer[srcIdx]; // Copy indexed pixel data
}
}
Теперь вот где мы получаем imageIdxBuffer:
Код: Выделить всё
let imageIdxBuffer = new Uint16Array(scaledWidth * scaledHeight).fill(blackIdx);
applyDithering(scaledCtx, imageIdxBuffer);
Код: Выделить всё
applyDitheringКод: Выделить всё
import { applyDithering, invertImage } from "./dither.js";Код: Выделить всё
imageIdxBuffer[pixIndex] = paletteIndex;
Код: Выделить всё
imageIdxBuffer = new Uint16Array(scaledWidth * scaledHeight).fill(blackIdx);
Код: Выделить всё
imageIdxBuffer.fill(blackIdx);
Так что же происходит с imageIdxBuffer, что может вызвать такие проблемы? И как эти проблемы можно скопировать в highResIndexBuffer? Я провел тесты, не копируя все данные, и действительно, при копировании определенного количества байт проблем не возникает. Случайные данные также не вызывают проблем.
Важно еще раз отметить, что данные никак не обрабатываются! ESP32 сохраняет только полученные данные во внутреннюю память.
Код: Выделить всё
while True:
chunk = await data.read(1024)
if not chunk:
break
bytes_written += f.write(chunk)
"последовательности байтов, которые приводят к зависанию процесса сериализации Blob", что звучит просто глупо. Это также предполагало проблемы с памятью, но я не понимаю, почему это также повлияет на копии. Кстати, ошибок JS нет.
Подробнее здесь: https://stackoverflow.com/questions/798 ... ry-content
Мобильная версия