我如何从数据库返回一个字节数组作为压缩的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格式返回它,只要它是小的。

所以我的问题是:在不直接将图像保存到文件系统的情况下,有什么可能做到这一点?

提前感谢您的回复。

我如何从数据库返回一个字节数组作为压缩的jpeg/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。