2017-11-24 17 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を(呼び出し)と文字列に出力を追加し、その結果の文字列がします。これは私がこれまでにやっていることですどちらの

  1. その共通の場所にあれば、画像のURLを渡します。あなたはそれが正しいする必要がある場合<img src="Image"</img>

    になります。

  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()); 
} 

重要サイドノート - これらのイメージは非常に大きなされている場合は、パフォーマンス上の理由のために良いアイデアではないかもしれません埋め込みます。しかし、小さな画像の場合、これは問題ありません。

関連する問題