如何从db返回一个字节数组作为压缩的jpeg / png?

时间:2014-06-13 09:00:40

标签: c# bytearray image-compression image-conversion generic-handler

这是我的情况: 我有一个控制台应用程序,它以位图格式创建网页截图,然后将其作为字节数组保存到数据库中。

然后我有一个Generic Handler,基本上获取字节数组,然后返回图像(它被设置为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返回,只要它很小。

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

提前感谢您的回复。

1 个答案:

答案 0 :(得分:1)

以下代码段可让您更接近目标。

这假定从数据库检索的字节数组可以被.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。

希望这会有所帮助......