2017-11-24 1 views
0

에서 C#을 이미지를 삽입하는 방법 : https://www.codeproject.com/Tips/485182/Create-a-local-server-in-Csharp웹 응답 나는 이런 식으로 뭔가를 만들었습니다

하지만 튜토리얼은 문자열을 전송하는 방법을 보여줍니다. 그러나 img src을 추가하여 코드를 수정하려고하면 표시되지 않습니다. 당신이 문자열로 U (이미지 변수)를 추가하면

private void sendData(int total, DataGridView dgv, Image v) 
{ 
    Thread t = new Thread(() => ResponseThread(total, dgv,v)); 
    t.Start(); 
} 

private void ResponseThread(int t, DataGridView dgv, Image u) 
{ 
    String table=""; 
    HttpListenerContext context = _httpListener.GetContext(); 
    for (int i = 0; i < t; i++) 
     table += "<tr><td>" + dgv.Rows[i].Cells[0].Value.ToString() + "</td><td>" + dgv.Rows[i].Cells[1].Value.ToString() + "</td><td>" + 
      dgv.Rows[i].Cells[2].Value.ToString() + "</td><td>" + dgv.Rows[i].Cells[3].Value.ToString() + "</td><td>" + dgv.Rows[i].Cells[4].Value.ToString() + 
      "</td><td>" + dgv.Rows[i].Cells[5].Value.ToString() + "</td></tr>"; 

    byte[] _responseArray = Encoding.UTF8.GetBytes(
     "<html>" + 
     "<head>" + 
     "<title>Hello</title>" + 
     "</head>" + 
     "<body>" + 
     "<h1>Total: " + t + 
     "<table style=\"width:100%\"> <tr><b><th>No</th><th>Centroid X</th><th>Centroid Y</th><th>Orientation</th><th>Area</th><th>Area (mm)</th></b></tr>"+ 
     table+"</table>"+ 
     "<img src="+u+"></img>"+ 
     "<p><i>Last Update: " + DateTime.Now.ToShortDateString() + " "+DateTime.Now.ToLongTimeString()+ 
     "</i></p>" + 
     "</h1></body></html>"); 
    context.Response.OutputStream.Write(_responseArray, 0, _responseArray.Length); 
    context.Response.KeepAlive = true; 
    context.Response.Close(); 
} 

답변

2

는 .NET 프레임 워크는 u.ToString을 (전화) 및 문자열 출력을 추가, 그래서 결과 문자열이됩니다 이것은 내가 지금까지 한 일이다 당신이 올바른해야 할 경우 <img src="Image"</img>

될 것입니다 :

  1. 을 어느 이미지의 URL을 전달 자사의 일반적인 장소에있는 경우.

  2. Base64로 이미지를 인코딩하고 인라인으로 유지합니다 (html 내에서). 예 :

<img alt="Embedded Image" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIA..." />

0

당신이 올바른 궤도에있어,하지만 당신은 별도로 Image의 바이트를 처리해야합니다. 브라우저가 응답 데이터를 받으면 이미지를 읽는 방법을 이해할 수 있어야합니다. <img src="+u+"></img>은 충분하지 않습니다.

대부분의 경우 브라우저는 src 속성에 URL을 가져오고 이미지 파일은있는 그대로 다운로드되어 표시됩니다. 귀하의 경우, 이미지 바이트는 응답에 포함되어야하지만 안전한 방법으로 전송 및 압축 해제 될 수 있습니다. 고맙게도, 이것은 base-64 임베딩을 통해 가능합니다. 데이터는 data:image/png;base64,<base-64-encode-bytes> 형식이어야합니다 - 자세한 내용은 here을 참조하십시오. 중요 - PNG 파일을 사용하지 않는 경우 해당 문자열에서 image/png을 적절하게 변경해야합니다.

이제 을 사용하여 Image 인스턴스를 문자열로 변환하는 것으로는 충분하지 않지만 몇 가지 추가 단계가 가능합니다. MemoryStreamConvert을 사용하면 응답에 포함 할 수있는 긴 문자열을 얻을 수 있습니다. 다시 말하지만, PNG를 사용하고 싶지 않다면 Save 전화를 적절하게 변경해야합니다.

string base64 = ""; 
using (MemoryStream stream = new MemoryStream()) 
{ 
    u.Save(stream, System.Drawing.Imaging.ImageFormat.Png); 
    base64 = Convert.ToBase64String(stream.ToArray()); 
} 

중요 보조 노트 -이 이미지가 매우 큰 경우, 다음 성능상의 이유로 좋은 생각되지 않을 수도 있습니다 내장. 그러나 작은 이미지의 경우에는 이것이 좋을 것입니다.

관련 문제