如何使用图像的字节数组?
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);
参见:
- mozilla.org docs
- This answer
- This answer
如果您只是将它发送到另一个 c# 端点,您可以使用...
byte[] decodedImageData = Convert.FromBase64String(base64EncodedData);
就像我在评论中提到的那样,确保它是加密的,只需让网站只支持 https://,如果你没有 SSL 证书,你可以从 http://startssl.com
所以,我正在从 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);
参见:
- mozilla.org docs
- This answer
- This answer
如果您只是将它发送到另一个 c# 端点,您可以使用...
byte[] decodedImageData = Convert.FromBase64String(base64EncodedData);
就像我在评论中提到的那样,确保它是加密的,只需让网站只支持 https://,如果你没有 SSL 证书,你可以从 http://startssl.com