2017-05-24 18 views
5

Tôi có một dự án mà tôi cần hiển thị các lược đồ djvu trong trình duyệt.ArrayBuffer to blob conversion

Tôi đã tìm thấy số này library on Github cũ, theo như tôi đã biết, chuyển đổi tệp djvu thành bmp và sau đó đặt chúng vào phần tử canvas.

Như tôi đã nói, thư viện cũ (cam kết cuối cùng là 5 năm trước), vì vậy tôi cần thực hiện một số chỉnh sửa. Vấn đề chính là lib sử dụng BlobBuilder lỗi thời.

bước tôi đã thực hiện để giải quyết vấn đề này:

  1. Decompress thư viện này qua Chrome DevTools
  2. lỗi ban đầu là tại dòng 3774 var c = "undefined" != typeof MozBlobBuilder ? MozBlobBuilder : "undefined" != typeof WebKitBlobBuilder ? WebKitBlobBuilder : console.log("warning: cannot build blobs")
  3. Tôi nhận xét ra dòng này
  4. Tiếp theo, tôi nhận xét ra dòng c = new c; và một số dòng sau.

Vì vậy, bây giờ có vẻ cách này (biến I là mảng đệm, và ololo1 và ololo2 là một số loại bù đắp và hạn chế)

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!") 
      }   
      ; 

Và bây giờ tôi bị mắc kẹt tại lỗi "Hình ảnh/bmp. bmp không thể được giải mã! "(ném trong xử lý h.onerror).

Vì vậy, câu hỏi của tôi là: những gì tôi đang làm sai?

+1

bản gốc là 'c.append (. (mới Uint8Array (mới Uint8Array (I, ololo1, ololo2))) đệm) '. Tôi không thấy lý do tại sao tác giả lồng chiếc Uint8array của anh ấy vào một cái mới ... Bạn sẽ ổn với chỉ mới 'Blob ([new Uint8Array (I, ololo1, ololo2)])'; – Kaiido

+0

@Kaiido cảm ơn rất nhiều, hoạt động như một sự quyến rũ. Bạn có thể đăng nó như là một câu trả lời? – Rulisp

Trả lời

11

Tôi không biết tại sao tác giả đã quấn Uint8Array của mình trong một tài khoản mới, có thể tạo bản sao bộ đệm của nó ... lưu ý rằng tôi thực sự không biết API BlobBuilder không dùng nữa, nhưng một lỗi chính tả có thể thấy trong mã của bạn là bạn cần phải quấn TypedArray của bạn trong một mảng bình thường:

new Blob([new Uint8Array(data)]);