Как вырезать определенные данные из файла
var reader = new FileReader(); reader.onload = function(){ var dataView = new DataView(reader.result); var ints = new Int32Array(dataView.byteLength); delete ints[10]; var blob = new Blob([ints], {type: 'image/jpeg'}); } Картинка после этого не открывается. Как типизированный массив снова перевести в arraybuffer? В качестве аргумента объекта blob должен выступать как раз таки arraybuffer. |
Ну так чего бы она открывалась, если нарушить ее. Вы загнали в буфер данные, а это все, включая и заголовок, а потом чикнули что-то не глядя, вот и результат. Прочесть изображение, поместить его в canvas, вот там будет доступно его тело, можно работать с байтами описывающими цвет.
|
Цитата:
|
FileReader API, как получить и манипулировать данными в сети подробно и неоднократно описаны. Ну просто, ради спортивного интереса, что можно определенного убрать в изображении таким образом? Ну к примеру, можно IPTC, что еще? И даже эта операция потребует изучение заголовка, и сперва получение по нему информации в нем, а уж потом...
|
Цитата:
var ints = new Int32Array(dataView.byteLength); Этот код просто создает пустой типизированный массив с таким же количеством байтов, как и у файла. Т.е. все данные в нём состоят из сплошных нулей, поэтому картинка и не открывалась. Да и вообще нужно было использовать не Int32Array, а Int8Array. Решением было в цикле занести все данные из DataView в пустой типизированный массив. for (var i = 0; i < ints.length; i++) { ints[i] = dataView.getInt8(i); } Теперь картинка открывается. Однако как вырезать данные из этого массива я так и не разобрался. Цитата:
|
Вопрос решен. Допенькал таки)
var ints = new Int8Array(dataView.byteLength-1800); for (var i = 0; i < ints.length; i++) { if(i==800) i+=1800; ints[i] = dataView.getInt8(i); } Пропускает 1800 байт, начиная с 800-го байта при копировании в типизированный массив из DataView. |
Нарезки говорите, может ffmpeg и на сервере в таком случае?
|
Цитата:
Только что проверил. Вырезает за доли секунды. |
Новая проблема. Код выше. Код вырезает 1800 байт, начиная с 800-го байта. Однако он вырезает 1800 байт еще и в конце файла. Что не так?
|
Цитата:
Цитата:
|
Научно делается смещение
for (var j=0,i = 0,len=ints.length; i < len; i++) { res[i]=data[i+j]; if(i==800) j=1800; } фигню написал, туго у меня с итерациями тоже, но принцип именно такой. Иначе у вас получится эквипенисуальная дыра в адресах результирующего файла. Если бы вы писали его в нормальной программе, в смысле. |
В нормальных программах мы читаем файлы until end, и тут можно, вот так
for (var res=[], j=0, i=0, b; b=ints[i+j]; i++) { res[i]=b; if(i==800) j=1800; } Правда я не понял в чем тут сценарий пропустить кусок потока. Сценарий можно написать в массиве, откуда выбирать следующее значение смещения. |
Цитата:
var ints = new Int8Array(dataView.byteLength-1800); Я вычитаю 1800 байт из dataview, поэтому и пропадает. Надо не из исходника вычитать, а из нового созданного массива. А вообще всё еще проще оказалось: var buffer1 = reader.result.slice(0,328000); var buffer2 = reader.result.slice(8551215); var blob = new Blob([buffer1], {type: 'audio/mp3'}); Метод slice и не нужно никаких dataview и циклов. Мне же нужно просто скопировать данные, а dataview нужен для изменения данных, а не копирования. Цитата:
В общем обрезание происходит успешно, файл после этого воспроизводится без проблем. Вопрос можно закрывать:) |
kostyanet,
спасибо) уже разобрался. причина выше |
Цитата:
А обрезание успешное гарантируется только у евреев, они то знают что режут. :) |
Интересно что происходит когда время скачивания с сервера превышает max_execution_time сервера?
|
Часовой пояс GMT +3, время: 20:40. |