Tengo un proyecto en el que necesito mostrar esquemas djvu en el navegador.
Encontré este viejo biblioteca en Github que, según entendí, convierte archivos djvu a bmp y luego los coloca en el elemento canvas.
Como dije, la biblioteca es antigua (el último compromiso fue hace 5 años), por lo que necesito hacer algunas correcciones. El problema principal es que lib usa BlobBuilder obsoleto.
Pasos que hice para resolver este problema:
- Descomprimir esta biblioteca a través de Chrome DevTools
- El error inicial está en la línea 3774
var c = "undefined" != typeof MozBlobBuilder ? MozBlobBuilder : "undefined" != typeof WebKitBlobBuilder ? WebKitBlobBuilder : console.log("warning: cannot build blobs")
- Comenté esta línea
- A continuación, comenté la línea
c = new c;
y algunas de las siguientes líneas también.
Entonces, ahora se ve de esta manera (la variable I es un búfer de matriz, y ololo1 y ololo2 son una especie de compensación y límite)
var c = new Blob(new Uint8Array(new Uint8Array(I,ololo1,ololo2)))
, b = b.createObjectURL(c)
, c = document.getElementById(kb)
, f = c.getContext("2d")
, h = new Image
, g = a[Ea >> 2]
, i = a[Fa >> 2]
, j = c.width
, k = Math.round(i * j / g);
h.onload = function()
{
var a = g / j;
4 < a && (a = 4);
1 > a && (a = 1);
f.globalAlpha = 1;
for (N = 0; N < a; N++)
f.drawImage(h, N, N, g - a + N, i - a + N, 0, 0, j, k),
f.globalAlpha *= 1 - 1 / a;
R(h.complete, "Image /bmp.bmp could not be decoded")
}
;
h.onerror = function(errorMsg, url, lineNumber, column, errorObj) {
console.log(errorMsg, url, lineNumber, column, errorObj);
console.log("Image /bmp.bmp could not be decoded!")
}
;
Y ahora me quedé con el error “¡No se pudo decodificar la imagen /bmp.bmp!” (lanzado en el controlador h.onerror).
Entonces, mi pregunta es: ¿qué estoy haciendo mal?
kaiido
No sé por qué el autor envolvió su Uint8Array
en uno nuevo … tenga en cuenta que realmente no conozco la API de BlobBuilder en desuso, pero un error tipográfico que puedo ver en su código es que necesita envolver su TypedArray en una matriz normal:
new Blob([new Uint8Array(buffer, byteOffset, length)]);
El constructor Blob toma un Secuencia de blobParts como primer parámetro, y luego busca BufferSource, Cuerdas USV y Gota elementos de esta secuencia. Así que cuando pasas un Matriz tipificadaen realidad iterará sobre todas las entradas de este Matriz tipificada y tratarlos como USVString (y así convertir su valor numérico a cadenas UTF-8 en el Gota). Eso rara vez es lo que quieres, así que mejor siempre pasa una Formación en este constructor.
-
También me salvó el día (pasé un arrayBuffer para trabajar con datos binarios, pero lo necesitaba envuelto como Array). Sin embargo, creo que Uint8Array debería pasarse sin los corchetes, ya que ya es una matriz y, por lo tanto, no era un problema del OP. Necesita los corchetes alrededor de un ArrayBuffer.
– aamarcas
29 de abril de 2018 a las 16:49
-
@aamarks No, si pasa un Uint8Array, guardará todos sus valores 0~255 como cadenas utf8 ya que el constructor Blob no accederá a él
.buffer
property y que probablemente sea lo que se quiere guardar los datos contenidos como binarios.– Kaiido
29/04/2018 a las 22:55
-
Ya veo, gracias. Parece que pasar en el búfer en el que se basa la vista Uint8Array, o Uint8Array, ambos funcionan siempre que estén entre paréntesis.
– aamarcas
1 mayo 2018 a las 17:47
-
Uint8Array es un desperdicio. No lo necesitas. Justo
new Blob([buffer])
. ArrayBuffer es una matriz de bytes.– Domske
23 de agosto de 2018 a las 10:36
-
^ es solo una vista. ¿No está seguro de si el punto de partida fue ArrayBuffer u otra vista escrita? Esto podría descarrilar el generador de blobs en el nuevo Blob(…)
– mattdlockyer
8 de julio de 2019 a las 14:39
var buffer = new ArrayBuffer(32);
new Blob([buffer]);
por lo que el Uint8Array debería ser
new Blob([new Uint8Array([1, 2, 3, 4]).buffer]);
el original era
c.append((new Uint8Array(new Uint8Array(I,ololo1,ololo2))).buffer)
. No veo por qué el autor anidó su Uint8array dentro de uno nuevo… Debería estar bien con solo nuevoBlob([new Uint8Array(I,ololo1,ololo2)])
;– Kaiido
24 de mayo de 2017 a las 3:45
@Kaiido muchas gracias, funciona de maravilla. ¿Podrías publicarlo como respuesta?
– Rulisp
24 de mayo de 2017 a las 3:54