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

How use the Byte Array of a image?

所以,我正在从 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;

您可以编写一个 Web API 控制器,returns 图像的二进制数据。 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 ...
    }
}

根据 rboe 所说的操作,将字节直接写入客户端将节省一些数据大小(大约 37%)和计算开销。如果您不仅显示 jpeg 图像,您还应该将 mime 类型设置为正确的值...查看 this source 以获得相当完整的 mime 类型映射扩展集。如果您不知道 mime 类型,您可以尝试 "application/octet-stream",因为这是二进制数据的通用 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 证书,你可以从 http://startssl.com