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

C# 如何使用图像的字节数组?,c#,json,asp.net-web-api,bytearray,C#,Json,Asp.net Web Api,Bytearray,所以,我从Oracle获取LongRaw图像的字节数组。。。 我正在使用webapi来实现这一点。获取阵列后,如何在客户端使用它? 我转换为base64string并在客户端传递该值转换是否更好 cmd.InitialLONGFetchSize = -1; var reader = cmd.ExecuteReader(); if (reader.Read()) {

所以,我从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控制器来返回图像的二进制数据。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 ...
    }
}
公共类WebApiController:ApiController
{        
公共异步任务获取(字符串id)
{
var bytes=等待GetBytesFromDataLayerAsync(id);
HttpResponseMessage结果=新的HttpResponseMessage(HttpStatusCode.OK);
var stream=新内存流(字节);
结果.内容=新的流内容(流);
result.Content.Headers.ContentType=
新的MediaTypeHeaderValue(“图像/jpeg”);
返回结果;
}
专用异步任务GetBytesFromDataLayerAsync(字符串id)
{
//将您的Oracle逻辑放在这里
返回。。。
}
}

您可以编写一个Web API控制器,用于返回图像的二进制数据。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 ...
    }
}
公共类WebApiController:ApiController
{        
公共异步任务获取(字符串id)
{
var bytes=等待GetBytesFromDataLayerAsync(id);
HttpResponseMessage结果=新的HttpResponseMessage(HttpStatusCode.OK);
var stream=新内存流(字节);
结果.内容=新的流内容(流);
result.Content.Headers.ContentType=
新的MediaTypeHeaderValue(“图像/jpeg”);
返回结果;
}
专用异步任务GetBytesFromDataLayerAsync(字符串id)
{
//将您的Oracle逻辑放在这里
返回。。。
}
}

根据rboe所说的操作,直接将字节写入客户端将节省一些数据大小(约37%)和计算开销。如果您不仅显示jpeg图像,还应将mime类型设置为正确的值。。。请看一组相当完整的mime类型映射扩展。如果您不知道mime类型,可以尝试“应用程序/八位字节流”,因为这是二进制数据的通用mime类型

如果您通过web浏览器显示内容,您可以只使用
,甚至可以使用javascript/jQuery动态创建

如果你真的想在json请求中嵌入图像数据,如果你有很多小图标并且不想有太多的请求(使用http/2,我认为这无关紧要)或其他原因,那么这可能很有用,那么是的,首先使用

string base64EncodedData = Convert.ToBase64String(bytes);
如果客户端是javascript,则可以使用最新的浏览器本机函数进行解码

var decodedImageData = window.atob(base64EncodedData);
见:

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

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

正如我在评论中提到的,为了确保它是加密的,只需使站点只支持https://即可。如果您没有SSL证书,您可以免费获得一个证书,这取决于您所做的事情,正如rboe所说,将字节直接写入客户端将节省一些数据大小(约37%)和计算开销。如果您不仅显示jpeg图像,还应将mime类型设置为正确的值。。。请看一组相当完整的mime类型映射扩展。如果您不知道mime类型,可以尝试“应用程序/八位字节流”,因为这是二进制数据的通用mime类型

如果您通过web浏览器显示内容,您可以只使用
,甚至可以使用javascript/jQuery动态创建

如果你真的想在json请求中嵌入图像数据,如果你有很多小图标并且不想有太多的请求(使用http/2,我认为这无关紧要)或其他原因,那么这可能很有用,那么是的,首先使用

string base64EncodedData = Convert.ToBase64String(bytes);
如果客户端是javascript,则可以使用最新的浏览器本机函数进行解码

var decodedImageData = window.atob(base64EncodedData);
见:

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

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

正如我在评论中提到的,为了确保它是加密的,只需使站点仅支持https://即可。如果您没有SSL证书,您可以从

免费获得证书。我需要加密我的Json的内容。。。我对所有字符串都这样做了…但是,现在有了这些ByteArray,我认为在通过图像之前转换更好,不是吗?你的代码工作得很好,我的朋友…非常感谢!!我还有另外一个问题,为什么需要加密JSON的内容?通常,它们受SSL/TLS保护。。。。https…-但是如果你有关于加密/解密的另一个问题,你应该在上面发布一个新的问题。。。我不知道!!我只知道我需要…哈哈,我已经告诉他们了,但是安全部门不正常哦,亲爱的-我甚至无法想象一个解决方案。浏览器必须解密JSON数据(这可以通过在JavaScript端传输加密的JSON字符串+加密来完成(任何人都可以访问此代码)。也许有一些好的JavaScript库。但这是一个全新的主题(和另一篇文章).祝你好运!我需要加密我的Json的内容…我对所有字符串都这样做了…但是,现在有了这些ByteArray,我认为在传递图像之前进行转换会更好,不是吗?你的代码工作得很好,我的朋友…非常感谢!!我只是有另一个问题..为什么你需要加密你的Json的内容?通常它们受SSL保护/TLS…https…-但是如果你有关于加密/解密的其他问题,你应该在上面发布一个新问题。哦,伙计们…我不知道!!我只知道我需要…哈哈,我已经告诉他们了,但是安全问题