2012-03-07 27 views
5

Edit: Lấy gợi ý dennmat của cân nhắc, tôi đã cố gắng đơn giản hóa hình ảnh của tôi mua lại kịch bản xuống một vài dòng sử dụng Image():Tôi có thể đọc dữ liệu nhị phân đúng cách thông qua XDomainRequest không?

window.onload = function(){ 
    var img; 
    capture_canvas   = document.createElement('canvas'); 
    capture_canvas.width = 1000; 
    capture_canvas.height = 1000; 
    document.documentElement.appendChild(capture_canvas); 
    img = new Image(); 
    img.crossOrigin = "Anonymous";   
    img.src = "http://www.shangalulu.com/get_resource_no_64.php?url=http://www.shangalulu.com/users/1196739508/post/41-1330377498/41-1330377498_thumb.jpg"; 
    img.onload = function() { 
     var context, canvas_img; 
     context = capture_canvas.getContext('2d'); 
     context.drawImage(img, 0, 0, 255, 255); 
     canvas_img = context.getImageData(0, 0, capture_canvas.width, capture_canvas.height); 
    } 
} 

Trong khi các công trình này dành cho Chrome và Firefox, điều này không cho IE9. Giải pháp được đề cập trong liên kết sau dường như không áp dụng cho trường hợp này. Uncaught Error: SECURITY_ERR: DOM Exception 18 when I try to set a cookie

Tính năng cors có trong Image() được hỗ trợ bởi IE9 không?


Tôi đã gặp phải một vấn đề nhỏ.

http://www.shangalulu.com/get_resource_no_64.php?url=http://www.shangalulu.com/resources/images/sample/sample.png

Hình ảnh trên thực sự là một tập tin có chứa các tiêu đề png tiêu chuẩn, tiếp theo là 255 byte đi từ 255 xuống 0 (hai lần). Ý tưởng là để xem cách Internet Explorer 9 xử lý việc nhận dữ liệu nhị phân thông qua một yêu cầu AJAX. Vì vậy, đây là vấn đề của tôi: Tôi đã nhận thấy rằng khi tôi nhận được một byte trên máy khách lớn hơn 127, giá trị được mặc định là 253. Có cách nào để IE có thể đọc các byte mở rộng với đúng không giá trị?

Một vài điều cần lưu ý:

1) Chúng tôi không sử dụng bất kỳ loại khung javascript nào. Đó là một yêu cầu mà chúng tôi làm điều này chỉ với xương trần javascript.

2) Mục đích của thử nghiệm này là tạo một cách sạch sẽ để có được hình ảnh để tôi có thể đặt hình ảnh lên khung hình mà không làm nó vỡ. Đôi khi những hình ảnh này đến từ máy chủ hình ảnh được lưu trữ bên ngoài của chúng tôi, các lần khác nó sẽ đến từ một máy chủ lưu trữ khác mà chúng tôi không kiểm soát được.

đính kèm dưới đây là kịch bản thử nghiệm của tôi:

var request; 
window.onload = function(){ 
    request = new XMLHttpRequest(); 
    if (window.XDomainRequest) { 
     request = new XDomainRequest(); 
    } 
    request.open('GET', 
     "http://www.shangalulu.com/get_resource_no_64.php?url= 
     http://www.shangalulu.com/resources/images/sample/sample.png", true); 
    request.onload = function() 
    { 
     var binary, i, response; 
     response = this.responseText; 
     binary = ""; 
     if (this.contentType) 
     { 
      document.documentElement.appendChild(
       document.createTextNode(this.contentType)); 
      document.documentElement.appendChild(document.createElement('br')); 
     } 
     for(i=0; i < response.length; i++) { 
      binary = "Line " + (i) + " --> " + ((response.charCodeAt(i)) & 0xff); 
      document.documentElement.appendChild(document.createTextNode(binary)); 
      document.documentElement.appendChild(document.createElement('br')); 
     } 
    }; 
    request.send(); 
} 
+1

Có gì sai với 'Hình ảnh()'? Xem ví dụ: https://developer.mozilla.org/en/Canvas_tutorial/Using_images – dennmat

+0

Về cơ bản bạn sẽ tự chụp chính mình ở chân để thao tác, quản lý và vẽ dữ liệu hình ảnh trong JS mà không cần sử dụng trình duyệt tích hợp sẵn tiện ích cho nó. Nó sẽ thực sự chậm và bạn có thể sẽ gặp phải vô số vấn đề đặc biệt là một khi bạn nhận được vào sự minh bạch và quay. – dennmat

+0

Tôi phải bỏ lỡ sự hỗ trợ xuất xứ chéo lần cuối cùng tôi nhìn vào Image(). Cảm ơn vì tiền hỗ trợ! Để chụp chân, tôi không hoàn toàn chắc chắn về ý nghĩa của các tiện ích tích hợp trình duyệt. Tất cả những gì tôi định làm ở đây là render một hình ảnh đơn giản lên một khung hình có thể được tắt cho máy chủ. – Axle

Trả lời

5

Thật không may, bằng cách sử dụng đối tượng với thuộc tính crossOrigin thiết lập để "Anonymous" vẫn Image() gây ra IE để làm hỏng vải khi hình ảnh được vẽ lên nó.

Để làm được việc này, tôi đã làm như sau:

  1. Tôi tạo ra một kịch bản nhỏ trên máy chủ của tôi mà chấp nhận một url, sau đó gọi file_get_contents() sử dụng url trao cho nó. Để ngăn chặn lạm dụng tập lệnh này, tôi đã thêm vào danh sách các tên miền "có thể chấp nhận", cũng như điều chỉnh URL kết quả để chỉ trỏ đến những thứ mà nó sẽ yêu cầu. Điều này cho phép tôi thực hiện các yêu cầu cục bộ, có nghĩa là tôi có thể sử dụng đối tượng XMLHttpRequest thay vì đối tượng XDomainRequest. (cũng mở ra cánh cửa hỗ trợ IE7).

  2. Kể từ IE không hỗ trợ atob, tôi đã sử dụng kịch bản chuyển đổi base64 tìm thấy ở đây: How can you encode a string to Base64 in JavaScript? Tôi nhận xét ra input = Base64._utf8_encode(input); trong encode chức năng, như các dữ liệu là nhị phân, và không phải là một chuỗi thực tế của nhân vật.

Giải pháp này là một phần của "phương sách cuối cùng". Nó hoạt động, tuy nhiên nó là cực kỳ chậm (mất 3 phút thay vì 3 giây bình thường).Phần tồi tệ nhất của tất cả là cần phải thêm vào một bộ đếm thời gian để cung cấp cho IE một cơ hội để hiển thị hộp thoại tùy chỉnh và thanh tiến trình của nó đúng cách. Bộ hẹn giờ buộc IE tạm dừng một chút trước khi thực hiện yêu cầu tiếp theo. Đây là ... khá kỳ quặc xem xét rằng tôi có nó được thiết lập để làm cho yêu cầu không đồng bộ.

Đây là điều tốt nhất tôi có thể nghĩ ra ngay bây giờ. Nếu bất kỳ ai khác có cách làm việc tốt hơn, vui lòng đăng câu trả lời của bạn.

Các vấn đề liên quan