2013-05-09 2 views
2

서버에 이미지 파일을 저장할 수 있지만 이미지가 비어있는 이미지로 저장됩니다. 캔버스에 그려진 이미지는 저장되지 않지만 사각형을 그릴 경우 원이 그려집니다. ... whts 내 코드에서 문제를 도와 PLZ 잘 저장asp.net의 서버에서 그려진 이미지를 캔버스에 저장

스크립트 코드 :

$(document).ready(function() { 

     var myCanvas = document.getElementById("Canvas1"); 
     var myContext = myCanvas.getContext("2d"); 
     var myImg = new Image(); 
     myImg.src = "images/cabinbg.jpg"; 
     myImg.onload = function() { myContext.drawImage(myImg, 0, 0); }; 


     var dataURL = document.getElementById("Canvas1").toDataURL("image/png"); 
     $('#<%=btnAdd.ClientID %>').live('click', function() { 
      dataURL = dataURL.replace('data:image/png;base64,', ''); 

      $.ajax({ 
       type: "POST", 
       url: "LayoutMaster.aspx/GetImage", 
       data: "{ 'image':'" + dataURL + "'}", 
       contentType: 'application/json; charset=utf-8', 
       dataType: 'json' 
      }).done(function (respond) { 
       //alert(respond); 
      }); 

     }); 

CS 파일 당신은 당신이 시도하기 전에 완료 이미지 온로드 기다리고되지 않습니다

[System.Web.Services.WebMethod()] 
    public static void GetImage(string image) 
    { 
     if (image != "") 
     { 
      try 
      { 
       FileStream fs; 
       byte[] photo = Convert.FromBase64String(image); 
       fs = new FileStream(HostingEnvironment.MapPath("~/images/abc.png"),  FileMode.OpenOrCreate, FileAccess.Write); 
       BinaryWriter br = new BinaryWriter(fs); 
       br.Write(photo); 
       br.Flush(); 
       br.Close(); 
       fs.Close(); 

      } 
      catch (Exception e) 
      { 
       e.Message.ToString(); 
      } 

     } 
    } 

답변

1

캔버스를 추출하다 데이터 URL로 존재합니다.

myImg.src = "images/cabinbg.jpg"; 
myImg.onload = function() { myContext.drawImage(myImg, 0, 0); }; 

//... you go right to extracting here before onload 
// above potentially has finished leaving canvas blank 
// as nothing is drawn yet... 

var dataURL = document.getElementById("Canvas1").toDataURL("image/png"); 

은 onload 이벤트 내부 extrating 코드를 둘 필요가이 문제를 해결하려면 ..

function extractImage() { 
    /* here goes the canvas.toDataUrl etc.. */ 
} 

myImg.onload = function() { 
    myContext.drawImage(myImg, 0, 0); 
    extractImage(); 
} 
myImg.src = "images/cabinbg.jpg"; 

(지금은 당신이 실제로 업로드하기 전에 데이터 URL의 헤더 를 자르고있다 참조 내 bad ..) data-url의 실제 데이터 (문자열)가 서버에 도착했다고 가정하면 data-url의 헤더가 잘리는 것을 잊어 버리는 것처럼 보입니다.

데이터 URL을 포함하여 base64를 디코딩하면 매우 잘 작동하지 않습니다.

(자세한 내용은 this link 참조를 위해) 문자열이 같을 것이다 :

data:image/png;base64,the-base64-data... 

그래서 당신이해야 할 일을 헤더를 구문 분석하고 그것을 떨어져 잘라하는 것입니다 :이 경우

data:[<MIME-type>][;charset=<encoding>][;base64],<data> 

을 up-to와 ...;base64,을 포함하여 나머지 문자열을 디코딩합니다.

언급 할 가치가있는 내용 : toDataUrlit will always be PNG에 대한 이미지 형식을 지정하지 않은 경우

물론 다양한 형식이 필요하다면 mime 형식, 인코딩 등을 읽는 데 더 깊이있는 파서를 구현해야합니다.

+0

내가 잘못 일지 모르지만 나는 onload 함수를 기다리지 않고 있지만 내 이미지가 내 캔버스에 제대로 표시되고 있다는 것에 동의한다. 캔버스의 내용을 업로드 할 때 불완전해진다. 데이터. 나는 이것에 관해 더 많이 조사했고, 나는 2MB의 데이터를 업로드하고 있다고 결론을 내린 몇 가지 결과를 얻었다. 나는 아직도이 문제에 갇혀있다. –

+0

이미지가로드되면 이미지가 테 캔버스에 그려지는 것처럼 결국 이미지가 표시됩니다. 문제는 현재 캔버스의 내용이 이미지의 유무에 관계없이 추출된다는 것입니다 (toDataURL이 호출되기 전에 이미지가 캔버스에 충분히 빨리 그려지는지 여부에 따라 의심 스럽습니다). 크기 문제 일 수 있습니다. 캔버스를 JPEG 대신 추출하여 크기를 전송하는 데 도움이되는지 확인하십시오. 그것이 차이를 만든다면 알게 될 것입니다. – K3N

+0

나는 image/jpeg를 사용해 보았지만 같은 문제에 직면 해있다 –

관련 문제