如何使用图像的字节数组?

时间:2016-09-09 15:07:44

标签: c# json asp.net-web-api bytearray

所以,我从Oracle获取LongRaw图像的字节数组... 我正在使用webapi。获得阵列后,我如何在客户端使用它? 做得更好我转换为base64string并在客户端传递此值转换?

cmd.InitialLONGFetchSize = -1;
                var reader = cmd.ExecuteReader();

                if (reader.Read())
                {
                    // Fetch the LONG RAW
                    OracleBinary imgBinary = reader.GetOracleBinary(0);
                    // Get the bytes from the binary obj
                    byte[] imgBytes = imgBinary.IsNull ? null : imgBinary.Value;

                    //var imgString = Uri.EscapeDataString(Convert.ToBase64String(imgBytes));
                }

                //CRIO A LISTA
                lretorno.Load(reader, LoadOption.OverwriteChanges, "BUSCAFOTO");

                reader.Close();

                connection.Close();
                connection.Dispose();

                var teste = lretorno.Tables[0].AsEnumerable().Select(row => new FotoEnvolvido
                {
                    FOTO = (byte[])(row["FOTO"]),
                    //FOTO = Convert.ToString(row["FOTO"]),
                });

                return teste;

2 个答案:

答案 0 :(得分:2)

您可以编写一个Web API Controller来返回图像的二进制数据。 Base64字符串强加了必须传输的字节数的开销。请避免这种情况。

示例控制器可以如下所示:

public class WebApiController : ApiController
{        
    public async Task<HttpResponseMessage> Get(string id)
    {
        var bytes = await GetBytesFromDataLayerAsync(id);

        HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
        var stream = new MemoryStream(bytes);
        result.Content = new StreamContent(stream);
        result.Content.Headers.ContentType =
            new MediaTypeHeaderValue("image/jpeg");
        return result;
    }

    private async Task<byte[]> GetBytesFromDataLayerAsync(string id)
    {
        // put your Oracle logic here
        return ...
    }
}

答案 1 :(得分:1)

根据您的做法,rboe表示将字节直接写入客户端将节省一些数据大小(约37%)和计算开销。如果您不仅要显示jpeg图像,还应将mime-type设置为正确的值...请查看this source以获得一组相当完整的mime类型映射扩展。如果您不知道mime类型,您可以尝试&#34; application / octet-stream&#34;因为这是二进制数据的一般mime类型。

如果您通过网络浏览器显示内容,则可以使用<img>标记,例如<img src="view_image.aspx?id=5">,您甚至可以使用javascript / jQuery动态创建。

如果你确实想要嵌入json请求中的图像数据,如果你有很多小图标并且不需要大量的请求(http / 2我不喜欢),这可能会很有用认为这很重要)或其他原因,然后是首先使用...

编码二进制数据
string base64EncodedData = Convert.ToBase64String(bytes);

如果客户端是javascript,您可以使用最新的浏览器本机功能进行解码

var decodedImageData = window.atob(base64EncodedData);

请参阅:

如果您只是将其发送到另一个c#端点,则可以使用...

byte[] decodedImageData = Convert.FromBase64String(base64EncodedData);

就像我在评论中提到的那样,为了确保它的加密只是让网站只支持https://如果您没有SSL证书,您可以免费获得一个{{3 }}