2011-07-05 8 views
5

Tôi đang làm một ứng dụng web trên Android và tôi đã tạo Canvas HTML5 mà người dùng có thể vẽ những gì anh ta muốn bằng các sự kiện chạm. Và tôi muốn lưu điều này trên một sdcard, do đó, tại địa phương. Và không thể sử dụng bất kỳ kịch bản phía máy chủ (php vv) để làm điều đó.Lưu phần tử canvas5 vào tệp (địa phương)

Tôi đang sử dụng một ví dụ magictouch.js:

<canvas id="example" height=450 width=300></canvas> 
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> 
    <script type="text/javascript" src="magictouch.js"></script> 

    <script> 

    var CanvasDrawr = function(options) { 

    var canvas = document.getElementById(options.id), 
    ctxt = canvas.getContext("2d"); 
    var img  = canvas.toDataURL("image/png"); 


    ctxt.lineWidth = options.size || Math.ceil(Math.random() * 35); 
    ctxt.lineCap = options.lineCap || "round"; 
    ctxt.pX = undefined; 
    ctxt.pY = undefined; 

    var lines = [,,]; 
    var offset = $(canvas).offset(); 

    var self = { 
    //bind click events 
    init: function() { 

    canvas.addEventListener('touchstart', self.preDraw, false); 
    canvas.addEventListener('touchmove', self.draw, false); 

    }, 

    preDraw: function(event) { 
      $.each(event.touches, function(i, touch) { 
       var id = touch.identifier; 
       lines[id] = { x  : this.pageX - offset.left, 
       y  : this.pageY - offset.top, 
       color : options.color || ["black"] 
       }; 
    }); 

    event.preventDefault(); 
    }, 

    draw: function(event) { 
    var e = event, hmm = {}; 

    $.each(event.touches, function(i, touch) { 
     var id = touch.identifier; 
     var moveX = this.pageX - offset.left - lines[id].x, 
     moveY = this.pageY - offset.top - lines[id].y; 

     var ret = self.move(id, moveX, moveY); 
     lines[id].x = ret.x; 
     lines[id].y = ret.y; 
    }); 

    event.preventDefault(); 
    }, 

    move: function(i, changeX, changeY) { 
    ctxt.strokeStyle = lines[i].color; 
    ctxt.beginPath(); 
    ctxt.moveTo(lines[i].x, lines[i].y); 

    ctxt.lineTo(lines[i].x + changeX, lines[i].y + changeY); 
    ctxt.stroke(); 
    ctxt.closePath(); 

    return { x: lines[i].x + changeX, y: lines[i].y + changeY }; 
    } 
}; 

    return self.init(); 
    }; 

    $(function(){ 
var super_awesome_multitouch_drawing_canvas_thingy = new CanvasDrawr({id:"example", size: 2 }); 
console.log('loaded'); 
     }); 

    </script> 
    </body> 

Nhưng tất cả những ví dụ mà tôi đã gặp trên Internet đã được sử dụng với một kịch bản php trên máy chủ để giải mã và lưu canva như một hình ảnh. Và thực sự chỉ muốn làm điều đó trên thiết bị Android của tôi, trong sdcard của tôi, chỉ bằng cách sử dụng HTML5/Javascript ...

Cảm ơn.

+0

Bạn đã bao giờ tìm ra điều này chưa? – user899641

Trả lời

0

Điều này là không thể vì bạn không có quyền truy cập hệ thống tệp từ trang web (Ngoại trừ một số trường hợp cạnh, không hữu ích ở đây).

Điều tôi khuyên, tất nhiên, là sử dụng máy chủ để tạo tệp này. Vì không thể, bạn có thể tìm cách thực thi mã "gốc" trên máy khách bằng cách sử dụng một plugin hoặc một applet Java.

+0

Ứng dụng web của tôi thực tế nằm trong ứng dụng gốc, vì tôi sử dụng Phonegap, tôi vẫn có tệp APK và quyền truy cập vào các API gốc. Vì vậy, đó không phải là 'chỉ' một webapp. Tôi không thể sử dụng fopen/fwrite cho việc sử dụng đó? (Tôi đã thử nhưng không có gì xảy ra). – dany

+0

Tôi không biết điện thoại nên tôi e rằng tôi không thể giúp bạn. – slaphappy

2

Bạn đã kiểm tra thư viện nihilogic chưa? http://www.nihilogic.dk/labs/canvas2image/

Sử dụng hàm toDataUrl() để bạn có thể nhận được tên ảnh xấu nhưng vẫn sẽ có ảnh.

Bạn cũng có thể sử dụng downloadify nhưng nó sử dụng đèn flash và tôi biết đèn flash không phải là thường xuyên trên android, tùy thuộc trường hợp của bạn https://github.com/dcneiner/Downloadify

Ngoài ra tôi, như kbok, không biết PhoneGap nhưng có thể bạn có thể thử sử dụng cả hai context.toDataUrl() và fwrite.

+0

Những gì tôi làm là: (...) var img64 = canvas.toDataURL ("image/png"). Thay thế (/ data: image \/png; base64, /, ''); var img_ok = decode_base64 (img); navigator.notification.alert (img_ok); \t writer.write (img_ok, true); \t writer.close(); } Nhưng tệp png của tôi bị hỏng. :/ – dany

+0

btw canvas2image có vẻ khá thú vị, nhưng tôi không muốn nhắc người dùng lưu hình ảnh, nếu tôi có thể tránh được rằng nó có thể là tốt đẹp – dany

+0

Yup vừa được thử nghiệm, đó không phải là những gì tôi thực sự đang tìm kiếm. Bởi vì tôi chỉ muốn viết tệp PNG và Canvas2Image buộc dấu nhắc. – dany

0

Tại sao bạn không chuyển đổi sang hình ảnh ở phía máy chủ và sau đó cho phép người dùng tải hình ảnh xuống điện thoại của họ?

+0

Xin chào, Vì đây là chữ ký của khách hàng và tôi phải quản lý khi người dùng đang ngoại tuyến, vì vậy tôi phải lưu trữ img trong một thời gian. Tôi hiện đang nâng cao hơn trong dự án của mình. Tôi có thể lấy canvas được mã hóa trong base64, tôi đã cố gắng giải mã nó nhưng bây giờ tệp png của tôi có vẻ bị hỏng. – dany