我如何从数据库返回一个字节数组作为压缩的jpeg/png
本文关键字:数组 字节数 压缩 png jpeg 字节 一个 数据库 返回 | 更新日期: 2023-09-27 18:08:31
我的情况是:我有一个控制台应用程序,它以位图格式创建网页截图,然后将其作为字节数组保存到数据库中。
然后我有一个通用处理程序,基本上得到字节数组,然后返回图像(它被设置为html图像源)。下面是代码:
public void ProcessRequest(HttpContext context)
{
int id = Convert.ToInt32(context.Request.QueryString["Id"]);
context.Response.ContentType = "image/jpeg";
MemoryStream strm = new MemoryStream(getByteArray(id));
byte[] buffer = new byte[4096];
int byteSeq = strm.Read(buffer, 0, 4096);
while (byteSeq > 0)
{
context.Response.OutputStream.Write(buffer, 0, byteSeq);
byteSeq = strm.Read(buffer, 0, 4096);
}
}
public Byte[] getByteArray(int id)
{
EmailEntities e = new EmailEntities();
return e.Email.Find(id).Thumbnail;
}
(这段代码不是我自己写的)
图像当然还是作为位图返回,而且尺寸太大了。这就是为什么我想以压缩的jpg或png格式返回它,只要它是小的。
所以我的问题是:在不直接将图像保存到文件系统的情况下,有什么可能做到这一点?
提前感谢您的回复。
下面的代码片段应该会让您更接近您的目标。
这假设从数据库中检索到的字节数组可以被。net解释为有效的图像(例如,简单的位图图像)。
public class ImageHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
int id = Convert.ToInt32(context.Request.QueryString["Id"]);
var imageBytes = getByteArray(id);
using (var stream = new MemoryStream(imageBytes))
using (var image = Image.FromStream(stream))
{
var data = GetEncodedImageBytes(image, ImageFormat.Jpeg);
context.Response.ContentType = "image/jpeg";
context.Response.BinaryWrite(data);
context.Response.Flush();
}
}
public Byte[] getByteArray(int id)
{
EmailEntities e = new EmailEntities();
return e.Email.Find(id).Thumbnail;
}
public byte[] GetEncodedImageBytes(Image image, ImageFormat format)
{
using (var stream = new MemoryStream())
{
image.Save(stream, format);
return stream.ToArray();
}
}
public bool IsReusable
{
get { return false; }
}
}
在web.config中:
<system.webServer>
<handlers>
<add name="ImageHandler" path="/ImageHandler" verb="GET" type="ImageHandler" preCondition="integratedMode" />
</handlers>
</system.webServer>
如果你需要控制压缩/质量,你需要开始看这样的东西:https://stackoverflow.com/a/1484769/146999
或者你可以选择PNG,这是无损的——如果大多数图像是图形/UI/文本,可能会压缩得更好。如果是这样,不要忘记为编码设置ImageFormat和为http响应设置ContentType。